最近使用了一个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的电解电容。因此推测是电源不稳定导致,而增加延时以后可以保证关键节点被双方捕捉到。
通过此问题可以看出原子的程序适合相对高速的数据传输,适应性不太好。