首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为STM32配置I2C输出端口

为STM32配置I2C输出端口
EN

Stack Overflow用户
提问于 2014-06-06 09:38:29
回答 1查看 13K关注 0票数 6

我目前正在尝试获得一对stm32l152 (发现工具包),以便通过I2C进行通信。(我不使用STM提供的标准外设库,因为我想自己实现i2c。)

我的配置如下:

  • 7位寻址模式(没有双重地址,只有OAR1)
  • 100速度
  • ACK已启用(在从机上)
  • 禁用ACK (在主服务器上,因为在任何时候主/从之间只传输一个字节)
  • 在主从上,使用GPIOB (PB10)作为SCL,使用GPIOB (PB11)作为SDA。

奇怪的部分是:当我将2个GPIOB引脚配置为推拉(没有拉/下)时,我可以看到我的主人发送开始位,地址字节。在示波器上。

但我的奴隶并没有送回一份回执。我知道这一点是肯定的,因为主程序没有在SR1中断言ADDR位,我在作用域上没有看到ack,从服务器也没有进入中断(我在从服务器上启用了I2C事件中断)。

在仔细观察范围内的波形时,我意识到信号( SCL和SDA)并没有完全达到0伏特的逻辑值,而是1伏特。我猜想这可能是为什么奴隶不能从主机读取地址字节,因此没有发送回ack。

因此,我将2个GPIO引脚配置为开路引线(没有上/下拉)..but,现在我的主人无法发送开始位。当我设置开始位时,我遍历了代码,并看到SR1中的主位SB位是设置的。但我看不出SDA和SCL信号在范围内有任何反应(两者都高出3V)。

(我把SCL和SDA都拉到了3v,每一行使用10曲姆)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-10 05:48:23

好吧,我想我找到了答案..。我查找了STM提供的标准外设库,并遵循了它们的配置顺序。在此之前,我使用了错误的配置GPIO端口的顺序.

测试后的工作顺序如下:

  1. 启用i2c和GPIOs时钟。
  2. 配置所需端口的AF。(AF4 for i2c in stm32)。
  3. 配置GPIOs: 3a。将GPIOs设置为AF。 3b。设定端口速度。 3c。设置端口类型(明渠). 3d的。设置为不拉/不拉。
  4. 配置i2c。(注册CR2、CCR、CR1、OAR1、.)。

以前,我在步骤2之前执行步骤3,生成开始位时没有来自端口的输出。

希望这能帮助那些有同样问题的人。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24078696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档