打印
[信息]

【实战经验】STM8L I2C程序第二次数据通信失败的问题分析

[复制链接]
2122|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 香水城 于 2017-8-11 14:34 编辑

STM8Lxxx I2C 程序第二次数据通信失败的问题分析

前言
本篇**主要是对STM8Lxxxx 在I2C 通信调试中遇到的第一次通信正常,但第二次通信失败问题的分析和处理。

1. I2C 协议总体分析。
STM8Lxxx I2C 硬件逻辑使用时非常灵活,因此也造成对各个状态处理的复杂性,稍不注意,I2C 调试就不能通过。
下面是I2C 开始(START)和结束(STOP)波形,STM8Lxxx 也是遵守这个协议的。
SCL 信号由主控提供。
STM8Lxxx 总线端口为开漏输出,外部需要上拉电阻。
下面协议为简单的单主控单从机收发协议。


2. 下面对一个简单的单主机发送,单从机接收协议进行说明
下面为主发送的一个协议图:
主控给从机发送数据,等到从机应答信号后再发送下byte 数据,直到数据发送完成后,主机发送一个stop 信号释放总线。


下面是从机接收协议图,从机接收主机发过来的数据并存储,每byte 传输完成后发送一个应答信号给主机(从机在每byte 传输完的第九个Clock 把SDA 信号线拉低到低电平)。


3. 程序中的出错现象
客户的程序调时发现相同的数据连续从主控发给从机,只有第一次的通信波形是好的,第二次通信时设备地址可正常发送,从机也有应答,但当第一byte 数据发送完成后,主机收不到从机的应答信号。

4. 问题产生原因
客户使用的是E:\Download\STM8L\STSW-STM8016\STM8L15x-16x-05x-AL31-L_StdPeriph_Lib\Project\STM8L15x_StdPeriph_Examples\I2C\I2C_TwoBoards\I2C_DataExchange 中的程序。



客户在程序编写时看到下图中用橙色标出的文字,就错误理解成从机每次收到I2C 的STOP 信号后,从机都要给I2C_CR2 的STOP 置位来释放SCL 和SDA 信号线。



客户对I2C 中断处理程序进行了修改,对应的代码如下,黄色部分标出了客户修改的代码:


跟踪程序发现I2C 主机在发送第二次数据时,从第一个byte 数据传输完成时信号波形开始不正常,从机一直没有ACK 发出来。SCL 线一直保持在低电平。
跟踪从机程序,发现第二次传输时ADDR 中断能正常进入,从机也有应答,但之后RXNE 位一直不会被置位,被置位的是I2C_SR1 的bit7, TXE 位一直为“1”,而中断处理中并没对这一状态进行处理和清空,所以一直会不断进入中断处理程序,不做处理又跳出中断,程序通信就死在了这里。

把程序恢复成示例程序,通信正常。

5.代码设计中应注意的地方。
建议客户在修改示例代码时谨慎一些,特别要注意重要寄存器的操作;弄明白后再进行更改;如果需要测试,最好标注清楚,
不要测试完成后又忘了修改回来。


对应的PDF: STM8L I2C程序第二次数据通信失败的问题分析
更多实战经验请看:【ST MCU实战经验汇总贴】

沙发
crystal1987| | 2017-4-19 10:38 | 只看该作者
这个问题分析的很详细,我也遇到过。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17099

帖子

287

粉丝