I2C SDA无上拉阻可收到ACK,有上拉阻却收不到ACK
问题描述如下:直接将IIC部分的代码发出来更容易找问题啊. 什么片子啊~引脚设成OD的哟,不是推挽 WM_CH 发表于 2016-9-6 22:28
什么片子啊~引脚设成OD的哟,不是推挽
DS1631温度传感器
XILINX 的IO可以设置成Open Drain吗? WM_CH 发表于 2016-9-6 22:28
什么片子啊~引脚设成OD的哟,不是推挽
请教一下,是因为双向io所以需要成od吗? Suna 发表于 2016-9-7 06:48
DS1631温度传感器
XILINX 的IO可以设置成Open Drain吗?
直接写三态驱动器,可以直接综合成Open Drain IO。
inout sda;
assign sda = sda_o ? 1'bz : 1'b0; guzhen24 发表于 2016-9-7 08:21
请教一下,是因为双向io所以需要成od吗?
不是双向IO的范畴。
是因为IIC是总线协议,上边可能挂载好几个设备,设置成OD的,才能出现“线与逻辑”,实现IIC的仲裁机制。
而且,假如设置成推挽输出,总线上挂载的设备其中一个在Clk引脚输出高,另一个在Clk引脚输出低,就直接短路了。。。
设置成OD的话,输出高只能靠外接的上拉电阻拉高。输出低就拉低了总线电平,“占用”了总线。
综上,IIC要设置为OD,而不是推挽。。。我也是刚知道的。
本帖最后由 zhangalex88 于 2016-9-7 17:19 编辑
写成:
assign sda=(link)? sda_buf:1'bz;
等待ACK的时候把link置为0就可以了。
当然sda要设为inout。 WM_CH 发表于 2016-9-7 09:48
不是双向IO的范畴。
是因为IIC是总线协议,上边可能挂载好几个设备,设置成OD的,才能出现“线与逻辑” ...
{:lol:}专业{:lol:} SDAio口要配置成inout类型,SDA上拉电阻接的只是多少?是弱上拉么? 幸福的鱼 发表于 2016-9-8 16:31
SDAio口要配置成inout类型,SDA上拉电阻接的只是多少?是弱上拉么?
已经配置为inoout类型了,上拉电阻是4.7KΩ WM_CH 发表于 2016-9-7 09:48
不是双向IO的范畴。
是因为IIC是总线协议,上边可能挂载好几个设备,设置成OD的,才能出现“线与逻辑” ...
学习了,感谢分享 查了用过的资料,如果需要ACK,则须在下一个SCL的上升沿之前将SDA拉低,如果不需要ACK,则SDA一直保持高即可,是不是时序上出问题了
页:
[1]