发新帖我要提问
12
返回列表
打印

请教I2C超时处理

[复制链接]
楼主: xsq5360
手机看帖
扫描二维码
随时随地手机跟帖
21
xsq5360|  楼主 | 2010-7-14 13:33 | 只看该作者 回帖奖励 |倒序浏览
本帖最后由 xsq5360 于 2010-7-14 13:36 编辑

16# lut1lut
我如果保留下面这个I2C_GenerateStop后的while,程序就死机在这,如果去掉就老是BUS_BUSY,按道理在I2C_Comm_MasterWrite函数中针对发送偏移地址或数据等过程中出现超时时都有Stop总线处理,从逻辑上应该能避免这类事件,但就像你提到的“有客户报告说STOP位在产生了STOP信号后不会被清零”,郁闷!
I2C_GenerateStop(I2Cx, ENABLE);
while((I2C10>CR1&0x200)==0x200);
已经知道是系统电源能力不足问题,在单独进行I2C控制LED的测试时,完全正常!但我想达到的目标是:在电源系统无法改善的情况下,我如何保证I2C能够从先前的错误状态中恢复出来?

使用特权

评论回复
22
lut1lut| | 2010-7-14 13:40 | 只看该作者
不是memory的话,可以不要后面的check过程。就算有的话,也是一次通过(即,发送了slave地址,立马收到应答)。

5V电源不稳,有时间我也试一试。

另外,以上那些帖子里说的几个问题,lz还没有回答呢。

1)PV-flag = 3,之前调用的什么函数,没有释放该flag归零?
2)干扰使得进入“地址不符合”的处理,是哪个应有的标志位没有置位,ARR?还是干扰使得总线上的地址字节错误,导致slave确实没有应答。。。
3)为何和在发起新通信之前,check busy时发现SB/AF /MSL都还处于置位状态。上一次通信是否非正常结束,lz又是做的什么善后工作?

使用特权

评论回复
23
lut1lut| | 2010-7-14 14:22 | 只看该作者
你现在都说的是查询方式下的,那么PV_flag=3的问题以后再说。

据你的描述,干扰使得在发送slave地址就不能正常通过。
我想知道,是总线上地址字节已经错误,导致进入超时处理;还是总线上信号正确,但是干扰使得I2C外设的某些应该置起的标志没有如期置位,如果是后者的话,是哪个标志没有如期置位;

执行了发送STOP位,但是STOP没有被清零,此时BUSY还在。请尝试用SWRST@CR1这个位来恢复。

使用特权

评论回复
24
xsq5360|  楼主 | 2010-7-14 15:23 | 只看该作者
本帖最后由 xsq5360 于 2010-7-14 15:31 编辑

22# lut1lut
1)PV-flag = 3,之前调用的什么函数,没有释放该flag归零?
这是之前采用中断方式时发生的,我只是直接添加中断库中的I2C_Comm_MasterWrite
和中断服务函数
void i2c1_evt_isr(void);
void i2c1_err_isr(void);
并未在自己操作PV-flag,而I2C_Comm_MasterWrite只在16ms定时中断中执行,此前并无其他函数会造成影响。
再次测试发现可能是系统中断优先级处理有问题,共有定时中断、串口中断、I2C中断等等,其中定时中断优先级最高,PreemptionPriority=0;当把I2C中断的PreemptionPriority设为1时,I2C正常;但当把串口中断(每隔2s有3KB数据需要接收)PreemptionPriority设为1,I2C优先级设为2时,运行一会儿I2C失常,出现PV-flag = 3的情况;


2)干扰使得进入“地址不符合”的处理,是哪个应有的标志位没有置位,ARR?还是干扰使得总线上的地址字节错误,导致slave确实没有应答。。。
3)为何和在发起新通信之前,check busy时发现SB/AF /MSL都还处于置位状态。上一次通信是否非正常结束,lz又是做的什么善后工作?
我已经说明系统电源不稳,那么I2C接口的驱动芯片相当于时而工作,时而不工作,因此实际仿真中利用查询超时的方式,会停在I2C_Comm_MasterWrite中各处的while ((I2Cx->CR1 & 0x200) == 0x200);
另外我再做其他的I2C错误的善后处理,我的想法是每16ms一次I2C操作,出错无所谓(比如某次供电不足),但要能从上一次错误中恢复(即一旦供电恢复正常,I2C又能正常操作)。
我纳闷为何I2C_GenerateSTOP(I2Cx, ENABLE)之后STOP没有被清零,此时BUSY还在?STM32作为I2C主设备时SCL和SDA总线还受从机影响不成??

使用特权

评论回复
25
香水城| | 2010-7-14 15:45 | 只看该作者
如果因为系统电源不稳造成I2C错误,很有可能是这个设备已经处于不稳定状态,建议在电源稳定之后对这个设备执行一次复位,然后在STM32一端,把I2C接口关闭,再重新初始化。

使用特权

评论回复
26
lut1lut| | 2010-7-14 15:49 | 只看该作者
本帖最后由 lut1lut 于 2010-7-14 15:51 编辑

哦,那个PV-flag的问题是这样的:

调用了一次MasterWrite(),把PV-flag设置成3了。这次通信还未完成,来了串口中断,做3K字节数据的接收,串口接收还没结束,16ms到了,在定时器中断又启动了下一次MasterWrite(),于是发现上次PV-flag还是3,于是返回。


哇哇哇,使用中断库的同学们要注意着这个情况,谢谢LZ提醒。

使用特权

评论回复
27
xsq5360|  楼主 | 2010-7-14 15:59 | 只看该作者
本帖最后由 xsq5360 于 2010-7-14 16:11 编辑

26# lut1lut
但我的串口接收中断是单次接收,即每次串口中断接收到一字节后就退出,在主程序中才进行通讯数据判断和处理,因此只是每2s会频繁进入串口中断(波特率115200),这样对I2C会有影响?
void UART4_IRQHandler(void)
{
if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
{
  /* Read one byte from the receive data register */
  bufRecv = USART_ReceiveData(UART4);
  recvCountAll++;
  flagRecv = 1;
}
}

使用特权

评论回复
28
lut1lut| | 2010-7-14 16:00 | 只看该作者
为何I2C_GenerateSTOP(I2Cx, ENABLE)之后STOP没有被清零

虽然我们执行了这句话,也许由于干扰,使得总线上就没有出现这个STOP信号咯,那么硬件没有检测到STOP信用,当然不会清零stop位咯。

我在上面贴子说的,“有客户报告说STOP位在产生了STOP信号后不会被清零”,是因为他们的I2C_GenerateSTOP(I2Cx, ENABLE)后面马上跟着一句对CR1的写操作,而由于其读-修改-写的原因,使得STOP位又被置上了。他们没有这么厉害的干扰,“时而工作,时而不工作”,太吓人了。

使用特权

评论回复
29
lut1lut| | 2010-7-14 16:07 | 只看该作者
此时BUSY还在?STM32作为I2C主设备时SCL和SDA总线还受从机影响不成??”

这个BUSY位,手册上说“当检测到SDA或者SCL低电平时,就置位;当检测到STOP信号时,就硬件清零”。

这个SCL和SDA是OD配置;总线上只要有设备,无论是主还是从,把它拉住不释放,电平就为低,又不取决于是不是master。

使用特权

评论回复
30
xsq5360|  楼主 | 2010-7-14 16:13 | 只看该作者
本帖最后由 xsq5360 于 2010-7-14 16:19 编辑

28# lut1lut
:) :L
我没有在I2C_GenerateSTOP(I2Cx, ENABLE)后面马上跟着一句对CR1的写操作;
惭愧啊,第一版样机调试,难免会有各种各样的问题,原先设计比较理想,但实际样机阻尼较大,电流消耗超出预期,且电机启动、停止或正反转都会对电源有影响,就波及到I2C接口的LED驱动芯片了,哎!

使用特权

评论回复
31
lut1lut| | 2010-7-14 16:32 | 只看该作者
本帖最后由 lut1lut 于 2010-7-14 16:39 编辑

那么以上解释了几个标志位异常的可能原因,现在按照LZ说的,关键是如何在电压稳定的时候能把上次实效的I2C模块重新让它正常工作。

那么就是香主说的那样,复位I2C模块,重新初始化吧。

祝你好运哦:victory:

使用特权

评论回复
32
xsq5360|  楼主 | 2010-7-16 15:17 | 只看该作者
无意间看到香版博客中的一篇**:关于调试STM32程序时,某些标志位被调试软件意外清除的问题
http://blog.**/STM32/209804/message.aspx
里面提到“不少STM32外设的状态寄存器位,可以通过对某些寄存器的读操作而清除(例如I2C的I2C_SR1中的很多标志位)”,那么本贴中用KEIL寄存器和存储器观察窗口看到的相关寄存器值就没有参考意义了,如此在I2C调试中怎么观测SR等寄存器发生了什么变化?

使用特权

评论回复
33
yun_xiao| | 2010-7-16 15:49 | 只看该作者
看看

使用特权

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

本版积分规则