打印
[STM32F4]

STM32F407ZGT6的I2C2总是BUSY,为何?

[复制链接]
2268|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yzzly|  楼主 | 2021-12-16 15:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个项目是STM32F407IGT6的I2C1读取时钟芯片SD2505,一切正常;另一个项目STM32F407ZGT6的I2C2读取SD2505,总线一直处于BUSY状态,总是停留在“while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));”这一句,示波器看SDA与SCL,为+ 5V高电平;
对比两块板子的I2C1与I2C2的寄存器配置数据,完全一致,真是无从下手,快疯了!

使用特权

评论回复
沙发
yzzly|  楼主 | 2021-12-16 16:53 | 只看该作者
问题解决,把I2C2的初始化语句的顺序做了些调整,居然OK了,奇怪!

使用特权

评论回复
评论
lihui567 2021-12-17 07:41 回复TA
建议用软件iic 
板凳
yangjiaxu| | 2021-12-17 08:31 | 只看该作者
时序或者硬件本身就是busy

使用特权

评论回复
地板
香水城| | 2021-12-17 09:55 | 只看该作者
这里有个相似话题分享:

I2C配置顺序引发的异常案例

使用特权

评论回复
5
yzzly|  楼主 | 2021-12-17 12:23 | 只看该作者
本帖最后由 yzzly 于 2021-12-17 12:25 编辑
香水城 发表于 2021-12-17 09:55
这里有个相似话题分享:

I2C配置顺序引发的异常案例

的确是这样,这两条语句不能放在GPIO初始化之前
I2C_DeInit(I2C2);                                                                                                                                                                                
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
但是,为什么我的STM32F407IGT6就可以呢!邪门!

使用特权

评论回复
6
l4157| | 2021-12-17 13:14 | 只看该作者
STM32  的I2C真是STM32的BUG之源,好在都能软件修

使用特权

评论回复
7
yzzly|  楼主 | 2021-12-17 15:10 | 只看该作者
STM32的IIC这个BUSY死锁的问题,实在令人绝望,软件上还得辅助CR1的SWRST位来复位IIC,然后重新初始化,并且在100K操作时,出现死锁的频率还能够容忍,当200K操作时,死锁的频率实在不能忍受。把上拉电阻由10K降为2K,也没有什么改观。

使用特权

评论回复
8
zyj213| | 2021-12-31 15:24 | 只看该作者
建议用模拟I2C哈,ST的不是说I2C有BUG么

使用特权

评论回复
9
shjuturt| | 2021-12-31 16:10 | 只看该作者
我觉得还是用模拟I2C吧,靠谱一些

使用特权

评论回复
10
ksjdisa| | 2021-12-31 16:35 | 只看该作者
为啥BUSY啊,是不是强制上拉了啊?

使用特权

评论回复
11
ppaakala| | 2021-12-31 16:35 | 只看该作者
用I2C1就好使?那你用I2C1呗

使用特权

评论回复
12
shskaoanc| | 2021-12-31 17:03 | 只看该作者
我平时都是用I2C模拟的,这样方便一些

使用特权

评论回复
13
hfaouhfoa| | 2021-12-31 17:03 | 只看该作者
这个可以咨询一下ST的FAE,问问他们咋解决?

使用特权

评论回复
14
hdahd| | 2021-12-31 17:22 | 只看该作者
是不是I2C2有其他特殊配置啊?你得注意哦

使用特权

评论回复
15
qqjmjso| | 2021-12-31 17:23 | 只看该作者
I2C2用那些引脚,有没有啥特殊引脚被占用啊?

使用特权

评论回复
16
lalhdo| | 2021-12-31 17:37 | 只看该作者
我觉得你可以仿真跟一下,看看为啥会这样

使用特权

评论回复
17
gshhkkk| | 2021-12-31 17:37 | 只看该作者
属实,要不你用模拟I2C试试

使用特权

评论回复
18
yzzly|  楼主 | 2022-1-3 11:31 | 只看该作者
本帖最后由 yzzly 于 2022-1-3 11:52 编辑

今天又做了些测试,这样初始化:
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;               
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;               
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;               
        GPIO_Init(GPIOF, &GPIO_InitStructure);
        GPIO_PinAFConfig(GPIOF, GPIO_PinSource0, GPIO_AF_I2C2);
        GPIO_PinAFConfig(GPIOF, GPIO_PinSource1, GPIO_AF_I2C2);
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);               
        I2C_DeInit(I2C2);
        I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
        I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
        I2C_InitStructure.I2C_OwnAddress1 = 0x00;
        I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
        I2C_InitStructure.I2C_ClockSpeed = 200000;
        I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
        I2C_Init(I2C2, &I2C_InitStructure);
        I2C_Cmd(I2C2, ENABLE);
没有做重新初始化,经长时间读时钟观察,没有问题,也就是说要先初始化IO口。
因此,不是ST的IIC接口有什么问题,而是我们使用的问题!

使用特权

评论回复
19
gygp| | 2022-1-6 16:23 | 只看该作者
I2C有设计缺陷?   

使用特权

评论回复
20
chenci2013| | 2022-1-6 16:31 | 只看该作者
用一个while循环判断总线是否忙?

使用特权

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

本版积分规则

428

主题

1183

帖子

3

粉丝