OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4116|回复: 4

裸机IIC实验,repeated_start函数的错误

[复制链接]

3

主题

4

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2019-7-17
在线时间
7 小时
发表于 2020-5-13 16:40:23 | 显示全部楼层 |阅读模式
在IMX6U裸机实验中的bsp_iic.c有一个repeated_start函数
  1. /* repeated start信号 */
  2. unsigned char i2c_master_repeated_start(I2C_Type *base, unsigned char address, enum i2c_direction direction)
  3. {
  4.     /* I2C是否忙或工作在从机模式下 */
  5.     if(base->I2SR & (1 << 5) && (((base->I2CR) & (1 << 5)) == 0))
  6.         return 1;
复制代码

按照左老师视频中讲的,在发送repeat start信号之前,要检查“I2C是否忙或工作在从机模式下”,从字面上理解,首先判断条件中的“&&”应当改为“||”。

于是笔者自作聪明的改了代码,发现程序卡死了,在读数据的时候,卡死在如下所示位置。
  1. if(xfer->direction == kI2C_Read)        /* 读取数据 */
  2. {
  3.     base->I2SR &= ~(1 << 1);            /* 清除中断挂起位 */
  4.     i2c_master_repeated_start(base, xfer->slaveAddress, kI2C_Read); /* 发送重复开始信号和从机地址 */
  5.     while(!(base->I2SR & (1 << 1))){};/* 等待传输完成 */    /*********************************************程序卡死位置**********************************************/

  6.     /* 检查是否有错误发生 */
  7.     ret = i2c_check_and_clear_error(base, base->I2SR);
  8.     if(ret)
  9.     {
  10.         ret = I2C_STATUS_ADDRNAK;
复制代码


于是回到repeat start函数中,找到判断条件,发现有两个,一个是检查IIC总线空闲位,I2SR寄存器的bit5。另一个是检查IIC控制器的主从模式,I2CR寄存器的bit5。

拆分两个条件,发现repeat start函数return 1的主要原因是IIC总线空闲位一直为1,查看参考手册的I2SR寄存器可以看到

I2C bus busy bit. Indicates the status of the bus.
NOTE: When I2C is enabled (I2C_I2CR[IEN] = 1), it continuously polls the bus data (SDA) and clock
(SCL) signals to determine a Start or Stop condition.
0 Bus is idle. If a Stop signal is detected, IBB is cleared.
1 Bus is busy. When Start is detected, IBB is set.


I2SR寄存器的bit 5只有在控制器检测到stop信号后才会被控制器自动清零,因此检测该位时一直为1。

所以在repeat start函数的开头不应该检测IIC总线忙状态位,只需检测是否工作在从机模式下即可。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10542
金钱
10542
注册时间
2017-2-18
在线时间
1908 小时
发表于 2020-5-13 17:13:35 | 显示全部楼层
回复 支持 反对

使用道具 举报

9

主题

890

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2390
金钱
2390
注册时间
2019-9-25
在线时间
397 小时
发表于 2020-5-13 19:34:15 | 显示全部楼层
帮顶,很棒,谢谢分享
回复 支持 反对

使用道具 举报

2

主题

712

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2178
金钱
2178
注册时间
2018-8-27
在线时间
258 小时
发表于 2020-5-14 10:40:54 | 显示全部楼层
可以  可以
回复 支持 反对

使用道具 举报

7

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2016-4-11
在线时间
54 小时
发表于 2020-9-8 21:07:52 | 显示全部楼层
如果多个器件同时通信,这个还是有必要的吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 16:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表