我目前正在尝试使用一对stm32l152(发现工具包)通过I2C进行通信。 (我没有使用STM提供的标准外设库,因为我想尝试自己实现i2c ..)
我的配置如下:
7位寻址模式(无双地址,仅OAR1)
100khz speed
启用ACK(在从站上)
ACK被禁用(在主设备上,因为任何时候主设备/从设备之间只传输1个字节)
,使用GPIOB(PB10)作为SCL,GPIOB(PB11)作为SDA
这是奇怪的部分:当我将2个GPIOB引脚配置为推挽(无上拉/下拉)时,我能够看到我的主机在示波器上发送起始位,地址字节..
但我的奴隶并没有发回确认。我知道这是肯定的,因为主机没有在SR1中断言ADDR位,我看到示波器上没有确认,并且从机没有进入中断(我在从机上启用了I2C事件中断)。
仔细观察示波器上的波形,我意识到信号(SCL,SDA)没有完全达到0Volts的逻辑低电平,而是处于1伏特。我猜这可能是为什么奴隶无法从主设备读取地址字节,因此没有发回ack。
所以我将2个GPIO引脚配置为漏极开路(无上拉/下拉)..但现在我的主机无法发出起始位..我逐步完成代码,看到SR1中主机的SB位是当我设置START位时置位..但是我没有看到示波器上的SDA和SCL信号有任何响应(两者都高达3V)。
(我在每行上使用10kohms将SCL和SDA拉到3v。)
答案 0 :(得分:5)
测试的序列是:
启用i2c和GPIO时钟。
配置所需的端口AF。 (对于stm32中的i2c,AF4)。
配置GPIO:
3A。将GPIO设置为AF。
3B。设置端口速度。
3c上。设置端口类型(开漏)。
3D。设置为无上拉/下拉。
配置i2c。 (登记CR2,CCR,CR1,OAR1,......)。
以前,我在第2步之前做了第3步,当我生成START位时,端口没有输出。
希望这可以帮助那些有同样问题的人。