研究生
最后登录1970-1-1
在线时间 小时
注册时间2016-7-12
|
在玩转stm32的书中这样说
在实际例程中
/* Send EEPROM address for write */
I2C_Send7bitAddress(EEPROM_I2C, EEPROM_ADDRESS, I2C_Direction_Transmitter);
I2CTimeout = I2CT_FLAG_TIMEOUT;
/* Test on EV6 and clear it */(这边有个clear it,这边这个clear it是怎么实现的呢?)
while(!I2C_CheckEvent(EEPROM_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
{
if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(1);
}
ADDR有两种清零方式,参考手册中这样说:
在I2C_CheckEvent()函数中
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)
{
uint32_t lastevent = 0;
uint32_t flag1 = 0, flag2 = 0;
ErrorStatus status = ERROR;
/* Check the parameters */
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_EVENT(I2C_EVENT));
/* Read the I2Cx status register */
flag1 = I2Cx->SR1;
flag2 = I2Cx->SR2; //这两句话这样算不算软件序列清零呢?这边读取了SR1寄存器后,读取了SR2寄存器,ADDR位清零,
flag2 = flag2 << 16; 在外面的判断函中//如果条件不成立,将一直循环,一直清零,然后与EV6比较,直到ADDR=1,跳出循环。那么置1的时间也只有在清零到比较之间
如果是这样,那么下一次比较事件的时候就能将ADDR位清零,但是倘若在软件序列清零之前置1,就循环就死在这了,从实验来看,是不可能的。
/* Get the last event value from I2C status register */ 如果不是这样,那么什么时候清零呢?还是这边就是纯粹的赋值比较? 不要说我钻牛角尖,逻辑上有点不明白,指点指点!!!
lastevent = (flag1 | flag2) & FLAG_MASK;
/* Check whether the last event contains the I2C_EVENT */
if ((lastevent & I2C_EVENT) == I2C_EVENT)
{
/* SUCCESS: last event is equal to I2C_EVENT */
status = SUCCESS;
}
else
{
/* ERROR: last event is different from I2C_EVENT */
status = ERROR;
}
/* Return status */
return status;
}
|
|