STM32 硬件I2C的使用:中断方式 无DMA 无最高优先级

2019-07-21 08:56发布

STM32的硬件I2C和RTC一样,一直以来都是STM32的一大败笔,我也曾经在想,这么好的片子I2C是这个样子。。。真想骂两句。。。呵呵! 不过对其有了深入了解之后,哪怕不用勘误手册上的办法(DMA或优先级最高)也是可以的。估计有很多人是知道办法的,我在这里就当是把问题重新提一下,大家讨论一下,共同学习了!
关于STM32乃至STM8的I2C,估计应该是专利的问题,所以故意做的不同,其不同点就在于无论是发送还是接收,都多了一个缓存寄存器,发送时先写缓存,缓存复制到移位寄存器,缓冲空了,可以再写一个字节,也就是当第一个字节还没发完的时候就可以再写一个字节,可以视作一次性写了2个字节;接收的时候移位寄存器先收到一个字节,复制到缓冲,移位寄存器空,然后可以接收下一个字节,可以视作一次性可接2个字节。这样的结构看似美好,其实问题就出在这里,具体的错误过程我就不在这里分析了(其实我也搞得不是很清楚,希望清楚的同志赐教),如何克服这一缺点呢。
具体做法:只使能事件中断 而不使能缓冲区中断,这样做的目的是把发送或接收的2个寄存器当成一个来用,一次只发或接一个字节,当BTF中断来临时去判断是RXE还是TXE,这样一来STM32的I2C结构就和其他单片机一样了。
这样就能做到硬件I2C中断方式 无DMA 无最高优先级了!
呵呵!分享,快乐!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
20条回答
whjambo
2019-07-21 22:28
STM32的I2C还有一个设置比较扯淡的地方,参考手册上说“ 要求FPCLK1应当是10 MHz的整数倍,这样可以正确地产生400KHz的快速时钟”,这个我已经验证是无关紧要的。手册上这样说是因为设定了在快速模式下只能:DUTY=1,Tlow/Thigh = 16/9,一个周期就是25,但是FPCLK1我们一般都是36M在用,这样我们能得到的最快速度也就是360KHz,用不到最快速度就是纠结(呵呵,这是一种病)。其实完全可以忽视这个设定,就让DUTY=0,Tlow/Thigh = 2/1,这样周期就是3了,呵呵可以整除了。其实大家看看16/9和2/1能差多少。。。很不理解手册为何如此忽悠。我反倒觉得DUTY=0这个设置就是让I2C在36M的时候也能到400KHz!还有24c02手册上说可以到2MHz,我把STM32的I2C设成2MHz也试过,跑来一天,当然只是读,一切正常,但是我还是不建议这么干,平时玩玩可以,做产品就算了,还是400K靠谱!

一周热门 更多>