EEPROM(24C64)的IIC通讯调试记录要点,使正点原子例程兼容性更好

最近使用了一个24C64,直接力创SMT的,型号是ST的M24C64-RMN6TP,MCU使用的STM32F407ZGT6,直接用的正点原子的例程,然后把宏定义24C02改为24C64,结果发现通讯不成功,把芯片焊接到原子开发板上发现也不成功。

百度发现有人说是SDA_OUT端口设置的问题,例程中应该是默认推挽输出,设置为开漏会好一些,实测果然,开发板通讯正常了。

例程源码:

#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;} //PB9输出模式

改为如下:

#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;\
                         GPIOB->OTYPER&=~(1<<9);GPIOB->OTYPER|=1<<9;} //PB5输出模式

----------------------------------------------------------------------------------------------------------------------------

但是但是,我的板子依然不行,读可以,写不行。

排查了其他代码的影响,那就是硬件有问题了。

这时,又看到一个帖子,说是IIC_STOP那时序有点问题,例程如下;

void IIC_Stop(void)
{
    SDA_OUT();//sda线输出
    IIC_SCL=0;
    IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
     delay_us(4);
    IIC_SCL=1; 
    IIC_SDA=1;//发送I2C总线结束信号
    delay_us(4);                                   
}

改为:

void IIC_Stop(void)
{
    SDA_OUT();//sda线输出
    
    IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
    delay_us(4);    
    IIC_SCL=0;
    
     delay_us(4);
    IIC_SCL=1; 
    delay_us(4);    
    IIC_SDA=1;//发送I2C总线结束信号
    delay_us(4);                                   
}    

实测发现成功了。。。而且这时把SDC_OUT改回默认推挽也可以成功!!

--------------------------------------------------------------------------------------------------------

对比硬件发现,我的板子太着急把1117输出3.3V的大电容给漏掉了,而开发板用的220uf的电解电容。因此推测是电源不稳定导致,而增加延时以后可以保证关键节点被双方捕捉到。

通过此问题可以看出原子的程序适合相对高速的数据传输,适应性不太好。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值