有没有办法将STM 32的I2C1连接的SDA和SCL引脚设置为低电平或高电平信号?我使用安全芯片,我必须发送一个唤醒条件,条件如下:如果SDA保持低电平的时间超过60 us,器件将退出低功耗模式,延迟1500 us后,器件将准备好接收I2C命令。我已经尝试用HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);切换实际的引脚,但这不起作用。我已经用STM32CubeMX配置了我的项目。谢谢你的帮助。
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
wwtsj6pe1#
在I2C中,START条件要求从高电平到低电平的转换,如果您随后发送虚拟地址0,则将生成NACK在正常事务中,软件将通过生成重复的开始或停止条件来响应NACK,然而这必须在软件中完成,所以你所要做的就是在1.5ms内什么都不做。之后你可以用设备的实际地址生成START,如果设备正在运行,它会生成一个ACK。我不熟悉HAL库驱动程序,坦率地说,文档非常糟糕,但它可能没有给予您必要的控制,至少在这个过程中,你必须在寄存器级别访问I2C外设。你可以尝试零-length I2C_MasterRequestWrite()调用地址为零,然后是延迟。示波器在这里很有用,可以确保生成预期的信号时序。
I2C_MasterRequestWrite()
nwsw7zdq2#
初始化I2C时,GPIO引脚模式设置为ALTERNATE MODE,因此写入HAL命令将不起作用。使用普通的HAL库在这方面帮不了你,你必须使用stm32寄存器自己配置I2C协议。
umuewwlo3#
我建议使用使用I2C通道的设备的从机地址的ownaddress设置如下代码。
I2C_InitStructure.I2C_OwnAddress1 = 0x30; // the unique slave address of the deviecs
字符串因为主设备可以发送广播操作而不是唯一操作。
3条答案
按热度按时间wwtsj6pe1#
在I2C中,START条件要求从高电平到低电平的转换,如果您随后发送虚拟地址0,则将生成NACK在正常事务中,软件将通过生成重复的开始或停止条件来响应NACK,然而这必须在软件中完成,所以你所要做的就是在1.5ms内什么都不做。之后你可以用设备的实际地址生成START,如果设备正在运行,它会生成一个ACK。
我不熟悉HAL库驱动程序,坦率地说,文档非常糟糕,但它可能没有给予您必要的控制,至少在这个过程中,你必须在寄存器级别访问I2C外设。你可以尝试零-length
I2C_MasterRequestWrite()
调用地址为零,然后是延迟。示波器在这里很有用,可以确保生成预期的信号时序。nwsw7zdq2#
初始化I2C时,GPIO引脚模式设置为ALTERNATE MODE,因此写入HAL命令将不起作用。
使用普通的HAL库在这方面帮不了你,你必须使用stm32寄存器自己配置I2C协议。
umuewwlo3#
我建议使用使用I2C通道的设备的从机地址的ownaddress设置如下代码。
字符串
因为主设备可以发送广播操作而不是唯一操作。