野火电子论坛

 找回密码
 注册

扫一扫,访问微社区

查看: 359|回复: 7

I2C端口初始化后就BUSY,请高手指教

[复制链接]
发表于 2019-6-9 16:39:18 | 显示全部楼层 |阅读模式
本帖最后由 zxw781 于 2019-6-9 16:42 编辑

手里有一个STM32F411的板子,最近被I2C搞崩溃了,I2C1接口正常,初始化没有问题,但是I2C3不知道为什么,同样的代码,只要一初始化,SDA马上拉低,不进行初始化,SCL和SDA都是高电平,只要进行完初始化,SDA就会被拉低。关键是同样的代码,用在I2C1接口就是正常的。实在找不到原因了,请高手给指导一下,万分感谢!下面是初始化代码:
void STM32_I2C3_Config(void)
{       
        /*开I2C3时钟*/       
        //I2C外设时钟
        RCC_APB1PeriphClockCmd(STM32_I2C3_CLK,ENABLE);
        //I2C3_GPIO时钟
        RCC_AHB1PeriphClockCmd(STM32_I2C3_SCL_CLK | STM32_I2C3_SDA_CLK,ENABLE);
       
        /*GPIO引脚连接到I2C3外设*/                       
        //SCL
        GPIO_PinAFConfig(STM32_I2C3_SCL_GPIO,STM32_I2C3_SCL_SOURCE,STM32_I2C3_SCL_AF);
        //SDA
        GPIO_PinAFConfig(STM32_I2C3_SDA_GPIO,STM32_I2C3_SDA_SOURCE,STM32_I2C3_SDA_AF);
       
        /*定义初始化结构体*/
        GPIO_InitTypeDef GPIO_InitStruct;
        I2C_InitTypeDef I2C_InitStruct;
       
        /*配置GPIO初始化结构体成员*/
        //SCL配置
        GPIO_InitStruct.GPIO_Pin = STM32_I2C3_SCL_PIN;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
       
        /*调用GPIO初始化函数,把配置好的结构体成员的参数写入到寄存器*/
        GPIO_Init(STM32_I2C3_SCL_GPIO,&GPIO_InitStruct);
       
        //SDA配置
        GPIO_InitStruct.GPIO_Pin = STM32_I2C3_SDA_PIN;
        //GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        //GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
        //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        //GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(STM32_I2C3_SDA_GPIO,&GPIO_InitStruct);       
       
        /*I2C寄存器恢复初始值*/
        I2C_DeInit(STM32_I2C3);
       
        /*I2C结构体配置*/
        I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
        I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
        I2C_InitStruct.I2C_ClockSpeed = STM32_I2C3_Speed;
        I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
        I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
        I2C_InitStruct.I2C_OwnAddress1 = STM32_I2C3_OwnAddress;
        /*调用I2C初始化函数,把配置好的结构体成员的参数写入到寄存器*/
        I2C_Init(STM32_I2C3,&I2C_InitStruct);       
       
        //使能I2C
        I2C_Cmd(STM32_I2C3,ENABLE);
}
无标题222.jpg

回复

使用道具 举报

发表于 2019-6-9 20:45:32 | 显示全部楼层
帮顶,用模拟吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-9 22:04:09 | 显示全部楼层
WishWish 发表于 2019-6-9 20:45
帮顶,用模拟吧

关键初始化都不行,不至于这么严重吧,不甘心啊
回复 支持 反对

使用道具 举报

发表于 2019-6-9 22:56:10 | 显示全部楼层
本帖最后由 非谢家之宝树 于 2019-6-9 22:57 编辑

话说那个deinit函数干嘛用的?然后是不是外部被拉低了?
回复 支持 反对

使用道具 举报

发表于 2019-6-10 08:47:08 | 显示全部楼层
我两个月前,同样的平台、代码也出现了类似的现象。
刚开始初始化IO口跳变正常。初始化输入不正常,(后来发现软件初始化配置的类型不对应)。修改后就可以正常做IO高低电平检测了。
最后再回归到硬件I2C,最终发现从设备不正常,导致初始化硬件I2C就立马被拉低。修改从设备硬件解决问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-14 10:25:21 | 显示全部楼层
非谢家之宝树 发表于 2019-6-9 22:56
话说那个deinit函数干嘛用的?然后是不是外部被拉低了?

那个函数是设置iic的寄存器为初始值,没有这局也是不行,都是被拉低
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-14 10:28:28 | 显示全部楼层
Il14789652 发表于 2019-6-10 08:47
我两个月前,同样的平台、代码也出现了类似的现象。
刚开始初始化IO口跳变正常。初始化输入不正常,(后来 ...

我的情况是,在不进行初始化,总线的状态是正常的,是不是证明从设备没有问题?只要进行初始化就不行了
回复 支持 反对

使用道具 举报

发表于 2019-6-15 10:47:09 | 显示全部楼层
zxw781 发表于 2019-6-14 10:28
我的情况是,在不进行初始化,总线的状态是正常的,是不是证明从设备没有问题?只要进行初始化就不行了

你自己再理解我的表达。首先改确认主设备IO是否正常(IO输出模式正常可控),然后再确认线路是否正常(测量电平特性),最后在确认从设备是否正常(回归I2C通信的配置模式,多个方式测试验证)。
回复 支持 反对

使用道具 举报

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

本版积分规则

野火电子公众号

手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号-2 大学生ARM嵌入式2群

GMT+8, 2019-9-20 20:05 , Processed in 0.037624 second(s), 31 queries , Gzip On.

野火电子论坛

© 2014-2016 www.firebbs.cn

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