|
//As soon (and as long) as internal Write is in progress, the Slave will not
//acknowledge the Master. This feature enables the Master to immediately follow
//up with a new Read or Write request, rather than wait for the maximum specified
//Write time (tWR) to elapse. Upon receiving a NoACK response from the Slave, the
//Master simply repeats the request until the Slave responds with ACK.
上面这段儿话摘自于CAT24C64中关于Acknowledge Polling的描述,意思是说器件儿内部如果正在进行写动作,那么器件儿不会acknowledge主机,利用器件儿的这个特性,主机可以向器件儿发送连续的读或者写命令,也好于死等固定的时间长度要好,如果器件儿应答的是NoACK,那么主机就一直重复发送读或写命令,直到器件儿应答的是ACK
在我们读写I2C设备之前,都要对器件儿进行忙状态查询,下面是我的代码:
void I2C_AcknowledgePolling(u8 sla)
{
do
{
I2C_ClearFlag(I2C1, I2C_FLAG_AF); //1处
I2C_GenerateSTART(I2C1, ENABLE); //2处
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //3处
I2C_Send7bitAddress(I2C1, sla, I2C_Direction_Transmitter); //4处
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //5处
}while(!(I2C_ReadRegister(I2C1, I2C_Register_SR1) & I2C_FLAG_AF));
}
sla是器件儿地址,我这里操作的是PCF8563,那么这个器件儿的从地址是0xa2,这个不重要
在//1处,软件清除I2C_FLAG_AF标记
在//2处,软件产生一个启动信号
在//3处,软件无限等待I2C外设成功发送启动信号
在//4处,向PCF8563写从器件地址0xa2,然后下面的while()是等待PCF8563给出ACK应答后才退出,那么问题在//4处之后,要不要加上//5处的那句话,然后再等待从器件返回ACK信号?我认为//5处这句话是要加上的,因为//5这句话是等待F4的I2C外设发送完sla信号,在这之后才是PCF8563给出ACK或者NACK应答,不知道我分析的对不对,请各路高手指点
|
|