MCU是STM32L071RZ,我想用GPIO口来模拟I2C主机去和I2C从机进行通信。 因为I2C的SDA信号是双向的。那么意味着,在模拟I2C时序的时候,需要对GPIO的输入和输出方向进行切换(读数据时设置成输入,写数据时设置成输出)。 作为SDA的GPIO口初始化时是这么设置的: LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOH); LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOC); /**/ LL_GPIO_SetOutputPin(SCL_GPIO_Port, SCL_Pin); /**/ LL_GPIO_ResetOutputPin(LED0_GPIO_Port, LED0_Pin); /**/ GPIO_InitStruct.Pin = SCL_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; LL_GPIO_Init(SCL_GPIO_Port, &GPIO_InitStruct); /**/ GPIO_InitStruct.Pin = LED0_Pin; GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; LL_GPIO_Init(LED0_GPIO_Port, &GPIO_InitStruct); 那么在模拟I2C,切换输入和输出模式时,是否只需要下面一条语句即可: LL_GPIO_SetPinMode(SCL_GPIO_Port,SCL_Pin,LL_GPIO_MODE_OUTPUT); 或者 LL_GPIO_SetPinMode(SCL_GPIO_Port,SCL_Pin,LL_GPIO_MODE_INPUT); |
IIC切换的是SDA的输入输出方向 不是SCL
输出模式没有下拉上拉模式 输入模式的上拉下拉对应输出模式的复用功能
所以想想只改变输入输出的寄存器实现功能的话 输出模式应该配置成通用开漏模式 输入模式是浮空输入模式 硬件上需要接上拉电阻 这样的话切换的时候只需要改变输入输出的方向就可以实现想要的功能了
评分
查看全部评分
你的意思是,SDA口在初始化时,设置成输出,并且是开漏模式,通过外部接上拉。对吧?
是的 就是这个意思
多谢!
还想再请教一下。用来模拟I2C的GPIO口,外部已经接了上拉电阻,还需不需要使能内部上拉?
不需要了 有一个上拉就可以了
好的 多谢!