初级会员

- 积分
- 103
- 金钱
- 103
- 注册时间
- 2018-4-27
- 在线时间
- 40 小时
|
10金钱
我的读 IIC的函数,读AT24C04一直读的161,用模拟IIC就没问题,
u8 I2C_ReadByte(u8 slave_addr,u8 read_addr,u8 *buff)
{
u32 tmp = 0;
tmp = I2C_TimeOut;
while(I2C_GetFlagStatus(I2C_Port,I2C_FLAG_BUSY))
{
if((tmp--) == 0)
{
return TimeOut;
}
}
/* Send START condition */
I2C_GenerateSTART(I2C_Port , ENABLE);
tmp = I2C_TimeOut;
/* Test on EV5 and clear it */
while(!I2C_CheckEvent(I2C_Port,I2C_EVENT_MASTER_MODE_SELECT))
{
if((tmp--) == 0)
{
return TimeOut;
}
}
/* Send EEPROM address for write */
I2C_Send7bitAddress(I2C_Port,slave_addr,I2C_Direction_Transmitter);
tmp = I2C_TimeOut;
/* Test on EV6 and clear it */
while(!I2C_CheckEvent(I2C_Port,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
{
if((tmp--) == 0)
{
return TimeOut;
}
}
/* Clear EV6 by setting again the PE bit */
I2C_Cmd(I2C_Port,ENABLE);
/* Send the EEPROM's internal address to write to */
I2C_SendData(I2C_Port,read_addr);
tmp = I2C_TimeOut;
/* Test on EV8 and clear it */
while(!I2C_CheckEvent(I2C_Port ,I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if((tmp--) == 0)
{
return TimeOut;
}
}
/* Send STRAT condition a second time */
I2C_GenerateSTART(I2C_Port,ENABLE);
tmp = I2C_TimeOut;
/* Test on EV5 and clear it */
while(!I2C_CheckEvent(I2C_Port ,I2C_EVENT_MASTER_MODE_SELECT))
{
if((tmp--) == 0)
{
return TimeOut;
}
}
/* Send EEPROM address for read */
I2C_Send7bitAddress(I2C_Port,slave_addr,I2C_Direction_Receiver);
tmp = I2C_TimeOut;
/* Test on EV6 and clear it */
while(!I2C_CheckEvent(I2C_Port,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
{
if((tmp--) == 0)
{
return TimeOut;
}
}
/* Disable Acknowledgement */
I2C_AcknowledgeConfig(I2C_Port , DISABLE);
*buff = I2C_ReceiveData(I2C_Port);
/* Send STOP Condition */
I2C_GenerateSTOP(I2C_Port ,ENABLE);
/* Enable Acknowledgement to be ready for another reception */
I2C_AcknowledgeConfig(I2C_Port,ENABLE);
return !TimeOut;
}
|
|