macompengluo 发表于 2019-11-6 17:29:45

STM32L的GPIO口切换输入、输出方向

      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);

mylovemcu 发表于 2019-11-7 08:16:51

想法是正确的可以这么操作但程序有问题
IIC切换的是SDA的输入输出方向不是SCL
输出模式没有下拉上拉模式输入模式的上拉下拉对应输出模式的复用功能
所以想想只改变输入输出的寄存器实现功能的话输出模式应该配置成通用开漏模式输入模式是浮空输入模式 硬件上需要接上拉电阻这样的话切换的时候只需要改变输入输出的方向就可以实现想要的功能了

macompengluo 发表于 2019-11-7 10:37:09

mylovemcu 发表于 2019-11-7 08:16
想法是正确的可以这么操作但程序有问题
IIC切换的是SDA的输入输出方向不是SCL
输出模式没有下拉上拉 ...
   你的意思是,SDA口在初始化时,设置成输出,并且是开漏模式,通过外部接上拉。对吧?

mylovemcu 发表于 2019-11-7 19:01:54

macompengluo 发表于 2019-11-7 10:37
你的意思是,SDA口在初始化时,设置成输出,并且是开漏模式,通过外部接上拉。对吧?
...

是的就是这个意思

macompengluo 发表于 2019-11-9 14:23:59

mylovemcu 发表于 2019-11-7 19:01
是的就是这个意思

多谢!

macompengluo 发表于 2019-11-11 13:25:49

mylovemcu 发表于 2019-11-7 19:01
是的就是这个意思

还想再请教一下。用来模拟I2C的GPIO口,外部已经接了上拉电阻,还需不需要使能内部上拉?

mylovemcu 发表于 2019-11-11 14:31:01

macompengluo 发表于 2019-11-11 13:25
还想再请教一下。用来模拟I2C的GPIO口,外部已经接了上拉电阻,还需不需要使能内部上拉? ...

不需要了有一个上拉就可以了

macompengluo 发表于 2019-11-11 16:56:49

mylovemcu 发表于 2019-11-11 14:31
不需要了有一个上拉就可以了

好的 多谢!
页: [1]
查看完整版本: STM32L的GPIO口切换输入、输出方向