新手上路
- 积分
- 33
- 金钱
- 33
- 注册时间
- 2012-10-11
- 在线时间
- 0 小时
|
这里我不懂的就是红色注释的地方,希望大家给解答下,先谢谢了。 另外每个while()是不是相当于完成ACK应答。i2c是说每次发送一字节数据就得完成一次ACK,这是完成这个功能么?
void I2C_ReadS_24C(u8 addr ,u8* pBuffer,u16 no)
{
if(no==0) return;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); // 这里判断总线忙闲
/*允许1字节1应答模式*/
I2C_AcknowledgeConfig(I2C1, ENABLE);
/* 发送起始位 */
I2C_GenerateSTART(I2C1, ENABLE); // 发送起始标志位
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/
#ifdef AT24C01A
/*发送器件地址(写)*/
I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Transmitter); //这里主机发送Epprom的地址
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //
/*发送地址*/
I2C_SendData(I2C1, addr); //这里发送Epprom内部寄存器地址
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*数据已发送*/
/*起始位*/
I2C_GenerateSTART(I2C1, ENABLE); //发送起始标志位 只是这里不懂为什么还需要发送一次。。。。。。
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/*器件读*/
I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Receiver); 这里和上面发送Epprom的地址有何不同,主要也不懂这句话的作用
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
#else
/*发送器件地址(读)24C02*/
I2C_Send7bitAddress(I2C1, addr<<1, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
#endif
while (no)
{
if(no==1)
{
I2C_AcknowledgeConfig(I2C1, DISABLE); //最后一位后要关闭应答的 传输完后要关闭应答
I2C_GenerateSTOP(I2C1, ENABLE); //发送停止位
}
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* EV7 */ //实际上是判断上次的i2c的操作是不是字节接收 ,可是并不是啊,那不应该是死循环么。我觉得这里还没有开始接收
*pBuffer = I2C_ReceiveData(I2C1);
pBuffer++;
/* Decrement the read bytes counter */
no--;
} |
|