[STM32] 模拟i2c初始化电平不高不低

[复制链接]
 楼主| pkuzhx 发表于 2015-12-9 09:31 | 显示全部楼层 |阅读模式
我用stm32的PB6和PB7模拟i2c,测试时让程序一上电就i2c读取传感器寄存器,发现有时会读取失败(很少)。
失败时波形如下:

然后就疯狂reset,有时reset过后就变好,有时要好多次才能变好。正常后读取波形如下:

代码方面:
gpio配置如下:
  1. /*Configure GPIO pins : PB6 PB7 PB10 PB3 */
  2.   GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_10|GPIO_PIN_3;
  3.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  4.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  5.   GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
  6.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
配置为OD输出,无上拉,低速(实际SCL频率不到20kHz)。由于外部有4.7k上拉,所以这里选择NOPULL。
然后操作SDA和SCL的代码如下:
  1. #define SCL1_H         GPIOB->BSRR = GPIO_PIN_6
  2. #define SCL1_L         GPIOB->BSRR = GPIO_PIN_6 << 16
  3. #define SDA1_H         GPIOB->BSRR = GPIO_PIN_7
  4. #define SDA1_L         GPIOB->BSRR = GPIO_PIN_7 << 16
  5. #define SCL1_read      GPIOB->IDR  & GPIO_PIN_6
  6. #define SDA1_read      GPIOB->IDR  & GPIO_PIN_7
我想请教各位,这种情况是不是应该是硬件出问题的可能性更大?如果是硬件出错,可能是什么问题?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| pkuzhx 发表于 2015-12-9 11:20 | 显示全部楼层
好吧,可能是SDA的上拉电阻有问题。连接好的时候,就正常,连接不好的时候,猜测大概有1M左右的电阻,出现读取错误。
更换电阻重新焊接后,暂时没发现有问题。
NE5532 发表于 2015-12-9 13:32 | 显示全部楼层
检查上拉电阻大小是否合适,另外MCU切换端口输入输出状态的时机是否正确。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:原来可以设置签名档啊!

45

主题

730

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:原来可以设置签名档啊!

45

主题

730

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部