我用stm32的PB6和PB7模拟i2c,测试时让程序一上电就i2c读取传感器寄存器,发现有时会读取失败(很少)。
失败时波形如下:
然后就疯狂reset,有时reset过后就变好,有时要好多次才能变好。正常后读取波形如下:
代码方面:
gpio配置如下:
/*Configure GPIO pins : PB6 PB7 PB10 PB3 */
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_10|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
配置为OD输出,无上拉,低速(实际SCL频率不到20kHz)。由于外部有4.7k上拉,所以这里选择NOPULL。
然后操作SDA和SCL的代码如下:
#define SCL1_H GPIOB->BSRR = GPIO_PIN_6
#define SCL1_L GPIOB->BSRR = GPIO_PIN_6 << 16
#define SDA1_H GPIOB->BSRR = GPIO_PIN_7
#define SDA1_L GPIOB->BSRR = GPIO_PIN_7 << 16
#define SCL1_read GPIOB->IDR & GPIO_PIN_6
#define SDA1_read GPIOB->IDR & GPIO_PIN_7
我想请教各位,这种情况是不是应该是硬件出问题的可能性更大?如果是硬件出错,可能是什么问题?
|