我目前正在尝试让一对 stm32l152(发现套件)通过 I2C 进行通信。(我没有使用 STM 提供的标准外设库,因为我想尝试自己实现 i2c..)
我的配置如下:
7位寻址模式(无双地址,只有OAR1)
100khz 速度
启用 ACK(在从机上)
ACK 禁用(在主机上,因为任何时候在主机/从机之间只传输 1 个字节)
在主/从机上,使用 GPIOB (PB10) 作为 SCL 和 GPIOB (PB11) 作为 SDA
这是奇怪的部分:当我将 2 个 GPIOB 引脚配置为推挽式(无上拉/下拉)时,我可以看到我的主机在示波器上发出起始位、地址字节。
但是我的奴隶没有发回确认。我肯定知道这一点,因为主机没有在 SR1 中断言 ADDR 位,我在示波器上没有看到 ack,而且从机也没有进入中断(我在从机上启用了 I2C 事件中断)。
仔细观察示波器上的波形,我意识到信号(SCL、SDA)没有完全达到逻辑低电平的 0 伏,而是 1 伏。我猜这可能是为什么从机无法从主机读取地址字节,因此没有发回 ack。
所以我将 2 个 GPIO 引脚配置为漏极开路(无上拉/下拉)..但现在我的主控无法发送起始位..我单步执行代码并看到当我设置了 SR1 中主控的 SB 位设置开始位..但我没有看到示波器上的 SDA 和 SCL 信号有任何响应(两者都在 3V 时为高电平)。
(我在每条线上使用 10kohms 将 SCL 和 SDA 都拉到 3v)。