你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
希望在转角 提问时间:2019-11-6 17:29 /
      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);
收藏 评论7 发布时间:2019-11-6 17:29

举报

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

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

希望在转角 回答时间: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口在初始化时,设置成输出,并且是开漏模式,通过外部接上拉。对吧?
...

是的  就是这个意思
希望在转角 回答时间:2019-11-9 14:23:59
mylovemcu 发表于 2019-11-7 19:01
是的  就是这个意思

多谢!
希望在转角 回答时间: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口,外部已经接了上拉电阻,还需不需要使能内部上拉? ...

不需要了  有一个上拉就可以了
希望在转角 回答时间:2019-11-11 16:56:49
mylovemcu 发表于 2019-11-11 14:31
不需要了  有一个上拉就可以了

好的 多谢!

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版