关于IIC协议的疑问

Doerthous 2016-10-25 07:36:35
为什么说从器件把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无效
}
...全文
2047 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Doerthous 2016-10-25
  • 打赏
  • 举报
回复
还有这个, 加了红色部分(只是改下数据传输方向)这个函数就不能正确发送Not ack了。 体现在连续调用立即读只能读相同的一个字节(按理应该是地址递增的) static inline void iicSendNotACK(){ //XGpio_SetDataDirection(&g_at24c02, CHANNEL_1, 0x00); // 设置SDA和SCL为输出 加这句无法send not ack给从设备? XGpio_DiscreteClear(&g_at24c02, CHANNEL_1, SCL_MASK); // SCL = 0(上半周期) 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); u8 i = XGpio_DiscreteRead(&g_at24c02, CHANNEL_1); // r模式下,写1无效 }

2,425

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 其他硬件开发
社区管理员
  • 其他硬件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧