我正在尝试读比特-读或者更确切地说是嗅探一个I2C端口。我有一个成功的I2C之间的I2C设备和stm32F401板之间的沟通。核心从发送使用DMA。然后,我使用两个引脚从相同的核心,试图嗅探沟通。这两个引脚都被配置为带有引线的inuput。
我这样读引脚的价值:
while (1) {
uint8_t CLK_val = HAL_GPIO_ReadPin(GPIOB, 1);
uint8_t SDA_val = HAL_GPIO_ReadPin(GPIOB, 2);
//And then I try to detect start condition like this:
if (CLK_val == GPIO_PIN_RESET && SDA_val == GPIO_PIN_RESET){
//Some code
}
//More code
};如果我手动拉下引脚,用一根与地面相连的电缆触碰两根引脚,条件就满足了。但是,即使事务成功,I2C事务也不会触发该条件,因此,在事务处理期间,引脚必须已被拔下。
为什么在I2C事务处理期间不满足该条件?
发布于 2022-02-07 21:16:01
I2C启动条件是数据的下降边缘,而时钟保持在高位。要从GPIO中检测到它,您需要执行如下操作:
CLK_val_before = HAL_GPIO_ReadPin(GPIOB, 1);
SDA_val_before = HAL_GPIO_ReadPin(GPIOB, 2);
CLK_val_after = HAL_GPIO_ReadPin(GPIOB, 1);
SDA_val_after = HAL_GPIO_ReadPin(GPIOB, 2);
if ((CLK_val_before == GPIO_PIN_SET)
&& (SDA_val_before == GPIO_PIN_SET)
&& (CLK_val_after == GPIO_PIN_SET)
&& (SDA_val_after == GPIO_PIN_RESET))
{
// Some code
}https://stackoverflow.com/questions/71022672
复制相似问题