OpenEdv-开源电子网

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

这里讨论一个BUG,关于STM32开漏输出下输出读数据的BUG。

[复制链接]

8

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2016-11-1
在线时间
31 小时
发表于 2017-3-14 11:53:55 | 显示全部楼层 |阅读模式
用的是原子提供的模拟I2C程序举例子。首先原来的原子程序SDA输出数据的时候是推挽,输入数据的时候是上拉输入。然后频繁在输入输出之间切换,这样我感觉很麻烦,所以就想起以前用51时候的双向IO。记得在数据手册上明确看到了设置成OD的时候可以读数据。
● 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
在数据手册的108页。

然后我讲SCL和SDA全部换成开漏输出,并去掉了SDA的输入输出转换,但是,我发现并不能正常,于是,根据控制变量法,我一个一个改变量。先讲SCL改开漏。保留SDA的输入输出转换过程。发现读取正常。然后,将SDA的推挽输出改成开漏输出(有上拉电阻),输入改上拉输入,任然OK的。于是继续变。全部改开漏,结果失败。然后我就想,是不是改了开漏之后由于没有执行输入输出转换函数的时间差导致I2C失败?然后我就手动加个delay吧。结果还是不行。然后我看到了SDA速度2M。猜想是不是速度问题,果断改成50M。结果仍然不如我所愿。然后我就debug。发现总是停留在第二个WaiAck.这里,读不到响应。用逻辑分析仪也是从这开始出问题,并且后面开漏输出地址的时候也只输出几位就停止输出了。这里我只是猜测开漏输出有BUG,如果有大神成功了的,请教育一下,并求把驱动发给我。。。


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

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
12469
金钱
12469
注册时间
2015-11-5
在线时间
2140 小时
发表于 2017-3-14 12:07:31 | 显示全部楼层
如果STM32作为主机,SCL是不需要设置为输入的,只设置SDA就好了
个人认为你的想法是很好的,STM32的IO虽然设置成输出(开漏/推挽),数据手册上也说明了设为输出时,输入缓冲器会被禁用,但我发现IDR寄存器实际上还是可以检测到IO的变化的
还有一点,你在STM32读取数据时,SDA设为开漏输出高还是低?
拿来长岛冰茶换我半晚安睡
回复 支持 反对

使用道具 举报

8

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2016-11-1
在线时间
31 小时
 楼主| 发表于 2017-3-14 13:06:50 来自手机 | 显示全部楼层
FreeRTOS 发表于 2017-3-14 12:07
如果STM32作为主机,SCL是不需要设置为输入的,只设置SDA就好了
个人认为你的想法是很好的,STM32的IO虽然 ...

SCL是设置成开漏输出,主要是SDA设置成开漏不能正确的输入/输出
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2019-4-24
在线时间
28 小时
发表于 2020-1-28 22:20:02 | 显示全部楼层
同样遇到和楼主一样的问题,用开漏输出无法实现模拟IIC,后发现隔壁的IIC例程中使用了开漏输出,查看后发现是延时函数的不同
static void i2c_Delay(void)
{
        uint8_t i;

        /* 
                 下面的时间是通过逻辑分析仪测试得到的。
    工作条件:CPU主频72MHz ,MDK编译环境,1级优化
  
                循环次数为10时,SCL频率 = 205KHz
                循环次数为7时,SCL频率 = 347KHz, SCL高电平时间1.5us,SCL低电平时间2.87us
                 循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间2.375us
        */
        for (i = 0; i < 10; i++);
}
我换用该延时函数后,可正常通信,希望对楼主有所帮助
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2019-4-24
在线时间
28 小时
发表于 2020-1-28 22:23:01 | 显示全部楼层
遇到了同样的问题,后发现隔壁的IIC例程中使用了开漏输出,查看后发现关键不同点在于延时函数
static void i2c_Delay(void)
{
        uint8_t i;

        /* 
                 下面的时间是通过逻辑分析仪测试得到的。
    工作条件:CPU主频72MHz ,MDK编译环境,1级优化
  
                循环次数为10时,SCL频率 = 205KHz
                循环次数为7时,SCL频率 = 347KHz, SCL高电平时间1.5us,SCL低电平时间2.87us
                 循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间2.375us
        */
        for (i = 0; i < 10; i++);
}
我换用该延时函数后IIC可正常通信,望对楼主有帮助
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 22:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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