关于IIC协议的疑问
为什么说从器件把SCL拉低可以让主器件等待?
拉低SCL不是意味着可以改变数据吗?
况且, SCL是主期间控制的, 从器件拉低了SCL, 难道主器件不能拉回来?
还有, 这个函数是主器件发送完一个byte后等待ack的函数, 为什么不加红色部分, 就死循环了(收不到ack)?
static inline void iicWaitACK(){
// ACK也是一个时钟周期
XGpio_SetDataDirection(&g_at24c02, CHANNEL_1, 0x00);
XGpio_DiscreteClear(&g_at24c02, CHANNEL_1, SCL_MASK | SDA_MASK); // SCL = 0(上半周期) 为什么不加| SDA_MASK就死?
delay(IIC_DELAY);
XGpio_DiscreteSet(&g_at24c02, CHANNEL_1, SDA_MASK); // SDA = 1
delay(IIC_DELAY);
XGpio_DiscreteSet(&g_at24c02, CHANNEL_1, SCL_MASK); // SCL = 1(下半周期)
delay(IIC_DELAY);
XGpio_SetDataDirection(&g_at24c02, CHANNEL_1, SDA_MASK); // 设SDA为输入, 以接收ACK
while(1) // 无限等待ACK
if(!(XGpio_DiscreteRead(&g_at24c02, CHANNEL_1) & SDA_MASK))
break;
}
还有这个, 在连续读过程中, 主器件收到一个byte要回一个ack, 可是回了却收不到下一个字节。(只能正确收到第一个字节)这是为什么?
static inline void iicSendACK(){
//XGpio_SetDataDirection(&g_at24c02, CHANNEL_1, 0x00); // 设置SDA和SCL为输出
XGpio_DiscreteClear(&g_at24c02, CHANNEL_1, SCL_MASK); // SCL = 0(上半周期)
delay(IIC_DELAY);
XGpio_DiscreteClear(&g_at24c02, CHANNEL_1, SDA_MASK); // SDA = 0
delay(IIC_DELAY);
XGpio_DiscreteSet(&g_at24c02, CHANNEL_1, SCL_MASK); // SCL = 1(下半周期)
delay(IIC_DELAY);
u8 i = XGpio_DiscreteRead(&g_at24c02, CHANNEL_1); // r模式下,写1无效
}