Suna 发表于 2016-9-6 18:58:35

I2C SDA无上拉阻可收到ACK,有上拉阻却收不到ACK

问题描述如下:










liufabing 发表于 2016-9-6 22:13:39

直接将IIC部分的代码发出来更容易找问题啊.

WM_CH 发表于 2016-9-6 22:28:17

什么片子啊~引脚设成OD的哟,不是推挽

Suna 发表于 2016-9-7 06:48:08

WM_CH 发表于 2016-9-6 22:28
什么片子啊~引脚设成OD的哟,不是推挽

DS1631温度传感器
XILINX 的IO可以设置成Open Drain吗?

guzhen24 发表于 2016-9-7 08:21:48

WM_CH 发表于 2016-9-6 22:28
什么片子啊~引脚设成OD的哟,不是推挽

请教一下,是因为双向io所以需要成od吗?

hecat 发表于 2016-9-7 08:30:39

Suna 发表于 2016-9-7 06:48
DS1631温度传感器
XILINX 的IO可以设置成Open Drain吗?

直接写三态驱动器,可以直接综合成Open Drain IO。

inout sda;

assign sda = sda_o ? 1'bz : 1'b0;

WM_CH 发表于 2016-9-7 09:48:29

guzhen24 发表于 2016-9-7 08:21
请教一下,是因为双向io所以需要成od吗?

不是双向IO的范畴。

是因为IIC是总线协议,上边可能挂载好几个设备,设置成OD的,才能出现“线与逻辑”,实现IIC的仲裁机制。
而且,假如设置成推挽输出,总线上挂载的设备其中一个在Clk引脚输出高,另一个在Clk引脚输出低,就直接短路了。。。
设置成OD的话,输出高只能靠外接的上拉电阻拉高。输出低就拉低了总线电平,“占用”了总线。


综上,IIC要设置为OD,而不是推挽。。。我也是刚知道的。





zhangalex88 发表于 2016-9-7 17:00:06

本帖最后由 zhangalex88 于 2016-9-7 17:19 编辑

写成:
assign sda=(link)? sda_buf:1'bz;
等待ACK的时候把link置为0就可以了。
当然sda要设为inout。

Suna 发表于 2016-9-7 19:31:31

WM_CH 发表于 2016-9-7 09:48
不是双向IO的范畴。

是因为IIC是总线协议,上边可能挂载好几个设备,设置成OD的,才能出现“线与逻辑” ...

{:lol:}专业{:lol:}

幸福的鱼 发表于 2016-9-8 16:31:40

SDAio口要配置成inout类型,SDA上拉电阻接的只是多少?是弱上拉么?

Suna 发表于 2016-9-9 07:18:04

幸福的鱼 发表于 2016-9-8 16:31
SDAio口要配置成inout类型,SDA上拉电阻接的只是多少?是弱上拉么?

已经配置为inoout类型了,上拉电阻是4.7KΩ

guzhen24 发表于 2016-9-9 07:29:18

WM_CH 发表于 2016-9-7 09:48
不是双向IO的范畴。

是因为IIC是总线协议,上边可能挂载好几个设备,设置成OD的,才能出现“线与逻辑” ...

学习了,感谢分享

幸福的鱼 发表于 2016-9-9 13:26:03

查了用过的资料,如果需要ACK,则须在下一个SCL的上升沿之前将SDA拉低,如果不需要ACK,则SDA一直保持高即可,是不是时序上出问题了
页: [1]
查看完整版本: I2C SDA无上拉阻可收到ACK,有上拉阻却收不到ACK