为什么我无法检测到 bitbang-read/sniff I2C 端口的启动条件? stm32
Why can't I detect start condition when to bitbang-read/sniff I2C port? stm32
我正在尝试 bitbang-read 或嗅探 I2C 端口。我在主 I2C 设备和 Nucleo stm32F401 板之间成功进行了 I2C 通信。使用 DMA 的 Nucleo slave 发送。然后我使用来自同一个 Nucleo 的 2 个引脚来尝试嗅探通信。两个引脚都配置为带上拉的输入。
我这样读取引脚的值:
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交易时条件不满足?
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
}
我正在尝试 bitbang-read 或嗅探 I2C 端口。我在主 I2C 设备和 Nucleo stm32F401 板之间成功进行了 I2C 通信。使用 DMA 的 Nucleo slave 发送。然后我使用来自同一个 Nucleo 的 2 个引脚来尝试嗅探通信。两个引脚都配置为带上拉的输入。
我这样读取引脚的值:
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交易时条件不满足?
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
}