STM32使用GPIO口模拟IIC对EEPROM进行读写操作
时间:10-02
整理:3721RD
点击:
前面我看我能写进去能读出来,数据都是没有错误的以为正确了,但是现在项目总测试的时候需要检查返回值。我在进行写操作的时候,接收EEPROM的应答信号,会出现接收到NACK的应答,但是我的又把数据写进去了,能读出来那个产生NACK应答信号的数据。
这是我的写操作的代码:
u8 Senddata_byte(u8 data)
{
u8 i = 8;
GPIOB->CRH &= 0xffffff0f;
GPIOB->CRH |= 0x00000010; //PB9TM;
while(i--) {
SCL_0();
Delay_us(5);
if(data & 0x80)
SDA_1();
else
SDA_0();
data <<= 1;
Delay_us(5);
SCL_1();
Delay_us(5);
}
//接收ACK
SCL_0();//第九个SCL脉冲
Delay_us(5);
GPIOB->CRH &= 0xffffff0f;
GPIOB->CRH |= 0x00000040; //PB9浮空输入;
if(SDA_STATE) {
GPIOB->CRH &= 0xffffff0f;
GPIOB->CRH |= 0x00000010; //PB9TM;
SCL_1();
Delay_us(5);
SCL_0();
Delay_us(5);
return NACK;
} else {
GPIOB->CRH &= 0xffffff0f;
GPIOB->CRH |= 0x00000010; //PB9TM;
SCL_1();
Delay_us(5);
SCL_0();
Delay_us(5);
return ACK;
}
这是我的写操作的代码:
u8 Senddata_byte(u8 data)
{
u8 i = 8;
GPIOB->CRH &= 0xffffff0f;
GPIOB->CRH |= 0x00000010; //PB9TM;
while(i--) {
SCL_0();
Delay_us(5);
if(data & 0x80)
SDA_1();
else
SDA_0();
data <<= 1;
Delay_us(5);
SCL_1();
Delay_us(5);
}
//接收ACK
SCL_0();//第九个SCL脉冲
Delay_us(5);
GPIOB->CRH &= 0xffffff0f;
GPIOB->CRH |= 0x00000040; //PB9浮空输入;
if(SDA_STATE) {
GPIOB->CRH &= 0xffffff0f;
GPIOB->CRH |= 0x00000010; //PB9TM;
SCL_1();
Delay_us(5);
SCL_0();
Delay_us(5);
return NACK;
} else {
GPIOB->CRH &= 0xffffff0f;
GPIOB->CRH |= 0x00000010; //PB9TM;
SCL_1();
Delay_us(5);
SCL_0();
Delay_us(5);
return ACK;
}