高中生
最后登录1970-1-1
在线时间 小时
注册时间2017-11-14
|
用霸天虎硬件读写取AT24C02,写入字节是没有问题的。在读取字节,第一次发送器件地址
I2C_Send7bitAddress(EEPROM_I2C,EEPROM_ADRESS,I2C_Direction_Transmitter);
之后检测事件
I2CTimeout = I2CT_FLAG_TIMEOUT;
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR)
{
if((I2CTimeout--) == 0)
return I2C_TIMEOUT_UserCallback(11);
}
程序总是会死在这里。单步调试,读取I2C1->SR1寄存器是0x82,与预期值是相同的,最后读取的值和写入的值一样。但是连起来跑,在I2C_CheckEvent函数之前用串口输出I2C1->SR1寄存器的值,是0x400,也就是AF为1,应答失败。在前面加入延时也没有效果。
I2C_Send7bitAddress(EEPROM_I2C,EEPROM_ADRESS,I2C_Direction_Transmitter);
//延时5ms
Delay_ms(5);
printf("I2C1->SR1 == %X\n",I2C1->SR1);//调试输出值为400,理论为0x82
//等待 ADDR,TXE,MSL,BUSY,TRA 置1
I2CTimeout = I2CT_FLAG_TIMEOUT;
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR)
{
if((I2CTimeout--) == 0)
return I2C_TIMEOUT_UserCallback(11);
}
总是会输出等待超时,errorcode=11,请问这个怎么解决
附录:读取AT24C02代码
/*
* 从EEPROM中读取一块数据
* pBuffer 存放读出数据的缓存区指针
* WriteAddr 存放数据的内部地址
* NumberByteToRead 从EEPROM中读取的字节数
*/
uint32_t I2C_EEPROM_BufferRead(uint8_t *pBuffer,uint8_t ReadAddr,uint16_t NumberByteToRead)
{
//检测总线是否空闲,如若不是,则等待
I2CTimeout = I2CT_FLAG_TIMEOUT;
while(I2C_CheckEvent(EEPROM_I2C,I2C_FLAG_BUSY)!=ERROR)
{
if((I2CTimeout--) == 0)
return I2C_TIMEOUT_UserCallback(9);
}
//发送起始信号
I2C_GenerateSTART(EEPROM_I2C,ENABLE);
//等待SB,MSL,BUSY置1
I2CTimeout = I2CT_FLAG_TIMEOUT;
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT)==ERROR)
{
if((I2CTimeout--) == 0)
return I2C_TIMEOUT_UserCallback(10);
}
//发送EERPOM器件地址,写方向
I2C_Send7bitAddress(EEPROM_I2C,EEPROM_ADRESS,I2C_Direction_Transmitter);
//延时5ms
Delay_ms(5);
printf("I2C1->SR1 == %X\n",I2C1->SR1);
//等待 ADDR,TXE,MSL,BUSY,TRA 置1
I2CTimeout = I2CT_FLAG_TIMEOUT;
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR)
{
if((I2CTimeout--) == 0)
return I2C_TIMEOUT_UserCallback(11);
}
// if(((EEPROM_I2C->SR1)&0x0002)==0)
// {
// return I2C_TIMEOUT_UserCallback(11);
// }
// EEPROM_I2C->SR2;
//通过重新写入PE,清除ADDR位
I2C_Cmd(EEPROM_I2C,ENABLE);
//写入要读取的内部地址
I2C_SendData(EEPROM_I2C,ReadAddr);
//等待 BTF,TXE,MSL,BUSY,TRA 置1
I2CTimeout = I2CT_FLAG_TIMEOUT;
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR)
{
if((I2CTimeout--) == 0)
return I2C_TIMEOUT_UserCallback(12);
}
//发送起始信号
I2C_GenerateSTART(EEPROM_I2C,ENABLE);
//等待SB,MSL,BUSY置1/ I2CTimeout = I2C_FLAG_TIMEOUT;
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT)==ERROR)
{
if((I2CTimeout--) == 0)
return I2C_TIMEOUT_UserCallback(13);
}
//发送EERPOM器件地址,写方向
I2C_Send7bitAddress(EEPROM_I2C,EEPROM_ADRESS,I2C_Direction_Receiver);
//
I2CTimeout = I2C_FLAG_TIMEOUT;
while(I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)==ERROR)
{
if((I2CTimeout--) == 0)
return I2C_TIMEOUT_UserCallback(14);
}
while(NumberByteToRead)
{
if(NumberByteToRead == 1)
{
I2C_AcknowledgeConfig(EEPROM_I2C,DISABLE);
I2C_GenerateSTOP(EEPROM_I2C,ENABLE);
}
*pBuffer = EEPROM_I2C->DR;
pBuffer++;
NumberByteToRead--;
}
//方便下次I2C传输,使能应答
I2C_AcknowledgeConfig(EEPROM_I2C,ENABLE);
return 1;
}
|
|