标题: 一个涉及DMA传输的I2C通信异常的话题 [打印本页]

作者: taoran    时间: 2015-12-8 04:00
标题: 一个涉及DMA传输的I2C通信异常的话题
整理:MilerShao

某工程师用到STM32F103芯片的I2C通信外设,启用了DMA数据传输。他在使用I2C数据发送过程中,发现每轮实际发送出去的数据总比在DMA配置中设定的传输数据个数要少一个。比方说:在DMA配置里设定的传输数据个数是10个,结果发现在总线上只能发出9个,经过进一步发现是少了最后一个数据。当对I2C接收到的数据进行DMA传输时,没有异常。

从描述的情况来看,现象很有规律,感觉最后一个数据被截掉了似的。试着修改I2C传输的DMA的传输数据个数,有意地多定义一个无用的数据,可以满足要求。但总觉得让人不爽,希望找到原因。

查看其相关程序代码并结合参阅STMCU相关技术手册部分试着去找原因。

关于I2C的DMA传输,STM32技术参考手册部分有这么一段话:


意思是说当DMA产生EOT标志后,(如果开启了EOT相关中断就进中断程序,没有开启就进行软件查询做后续处理)关闭DMA请求,然后等待BTF事件,执行STOP操作。

这里的BTF事件就是I2C数据收发过程中的数据字节是否传输完成的的事件。

查看客户关于I2C发送代码,发现他在检测到DMA产生EOT标志后,他首先就是做的STOP操作,然后关闭相关DMA请求。代码里没有检测BTF标志的过程。【客户相关程序代码如下】


他这样做就会导致个问题。在最后一次DMA数据传输完成后,数据刚放进I2C的DR寄存器,还没来得及把这个新数据通过I2C发送出去,因为用户程序立即做了STOP操作,最后那个数据只能冤死在DR寄存器了。

如果在客户代码添加有关BTF标志检测后就正常,即在发STOP指令之前先等待BTF为1,就可避免上面提到的少发一个数据的问题。


其实,在STMCU应用过程中,不少问题是可以从技术参考手册里找到答案的,或者从ST官方提供的参考库代码找参考线索。建议尽量使用最新版的技术手册和参考固件库。整理:MilerShao

某工程师用到STM32F103芯片的I2C通信外设,启用了DMA数据传输。他在使用I2C数据发送过程中,发现每轮实际发送出去的数据总比在DMA配置中设定的传输数据个数要少一个。比方说:在DMA配置里设定的传输数据个数是10个,结果发现在总线上只能发出9个,经过进一步发现是少了最后一个数据。当对I2C接收到的数据进行DMA传输时,没有异常。

从描述的情况来看,现象很有规律,感觉最后一个数据被截掉了似的。试着修改I2C传输的DMA的传输数据个数,有意地多定义一个无用的数据,可以满足要求。但总觉得让人不爽,希望找到原因。

查看其相关程序代码并结合参阅STMCU相关技术手册部分试着去找原因。

关于I2C的DMA传输,STM32技术参考手册部分有这么一段话:


意思是说当DMA产生EOT标志后,(如果开启了EOT相关中断就进中断程序,没有开启就进行软件查询做后续处理)关闭DMA请求,然后等待BTF事件,执行STOP操作。

这里的BTF事件就是I2C数据收发过程中的数据字节是否传输完成的的事件。

查看客户关于I2C发送代码,发现他在检测到DMA产生EOT标志后,他首先就是做的STOP操作,然后关闭相关DMA请求。代码里没有检测BTF标志的过程。【客户相关程序代码如下】


他这样做就会导致个问题。在最后一次DMA数据传输完成后,数据刚放进I2C的DR寄存器,还没来得及把这个新数据通过I2C发送出去,因为用户程序立即做了STOP操作,最后那个数据只能冤死在DR寄存器了。

如果在客户代码添加有关BTF标志检测后就正常,即在发STOP指令之前先等待BTF为1,就可避免上面提到的少发一个数据的问题。


其实,在STMCU应用过程中,不少问题是可以从技术参考手册里找到答案的,或者从ST官方提供的参考库代码找参考线索。建议尽量使用最新版的技术手册和参考固件库。


作者: 小蜜蜂o    时间: 2018-5-24 14:15
参考手册里写了,发送stop时如果正在传输字节会等待这个字节完成才发stop信号。EOT标志在iic、dma里,根本没有对应的标志位。我猜测可能对应DMA
作者: 小蜜蜂o    时间: 2018-5-24 14:19
对应DMA的TC位。我现在的问题是,允许dma发送完成中断,结果在中断里关闭dma通道,一退出中断就会观察到nvic对应的中断悬起位=1,过一会就又进中断来了。这是怎么回事?
void DMA1_Channel4_IRQHandler(void)
{
        DMA1_TCIF_CLR(4);
        I2C2_TX_STOP;
        DMA1_CH4_OFF;       
}
作者: 小蜜蜂o    时间: 2018-5-24 17:07
是我DMA-TC标志位没清除到位的问题,不是平常的写0清零,必须写1才能清零




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1