我目前正在尝试使用一对stm32l152(发现工具包)通过I2C进行通信。 (我没有使用STM提供的标准外设库,因为我想尝试自己实现i2c ..)
我的配置如下:
这是奇怪的部分:当我将2个GPIOB引脚配置为推挽式(无上拉/下拉)时,我能够看到我的主机在示波器上发送起始位,地址字节..
但我的奴隶并没有发回确认。我肯定知道这一点,因为主机没有在SR1中断言ADDR位,我看到示波器上没有确认,并且从机没有进入中断(我在从机上启用了I2C事件中断)。
仔细观察示波器上的波形,我意识到信号(SCL,SDA)没有完全达到0Volts的逻辑低电平,而是处于1伏特。我猜这可能是为什么奴隶无法从主机读取地址字节,因此没有发回ack。
所以我将2个GPIO引脚配置为漏极开路(无上拉/下拉)..但现在我的主机无法发出起始位..我单步执行代码,看到SR1中主机的SB位置1时设置START位..但我没有看到示波器上的SDA和SCL信号有任何响应(两者都高达3V)。
(我在每条线上使用10kohms将SCL和SDA拉到3v)。
好吧,我想我找到了答案..我查找了STM提供的标准外设库,并按照其配置顺序进行了操作。在此之前,我使用了错误的配置GPIO端口的顺序......
测试的序列是:
以前,我在第2步之前做了第3步,当我生成START位时,端口没有输出。
希望这可以帮助那些有同样问题的人。