OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3591|回复: 6

关于STM32准双向IO配置问题

[复制链接]

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
发表于 2020-6-2 19:00:36 | 显示全部楼层 |阅读模式
20金钱
我现在这个模块是三线SPI的,即MISO和MOSI结合到一起去了,在网上找到一个准双向模式,是这样说的,将引脚配置为开漏模式(GPIO_MODE_OUTPUT_OD,我用的是HAL库开发的),外部上拉电阻,当需要查询输入电平时,需先把内部的输出置成高,之后读取该引脚的输入电平状态。但是我按照这样配置,测试发现写进去的数据没问题,但是读出的数据不对,都是0xFF。请问各位大神有准双向的一个配置例程代码吗?还需要修改什么东西吗?? 谢谢啦!
如下配置:

3.png
2.png
1.png

最佳答案

查看完整内容[请看2#楼]

将之前屏蔽的GPIO_InitStruct.Pull = GPIO_NOPULL;打开,然后开漏加上拉,可以输入输出了。是里面默认的PULL设置不对吗?还是什么情况? 不过建议还是在对IO配置时,这些 GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode =GPIO_MODE_OUTPUT_OD;//GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct) ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-6-2 19:00:37 | 显示全部楼层
本帖最后由 chenyuan 于 2020-6-4 12:09 编辑

将之前屏蔽的GPIO_InitStruct.Pull = GPIO_NOPULL;打开,然后开漏加上拉,可以输入输出了。是里面默认的PULL设置不对吗?还是什么情况?
不过建议还是在对IO配置时,这些
    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode =GPIO_MODE_OUTPUT_OD;//GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
参数都重新配置下。有哪位大佬对IO口的这些参数默认配置、如果不是全部参数都配置,他会默认配置为怎样等,有了解的,希望告知!!谢谢啦

建议配置IO口时,将那些参数都配置下!
4.png
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1437
金钱
1437
注册时间
2020-5-12
在线时间
395 小时
发表于 2020-6-3 08:54:44 | 显示全部楼层
感觉有点像iic的sda脚。我觉得可以分开配置。
类似这样

/**
  * @brief  Set SDA Pin as Output Mode
  * @retval None
  */  
void SDA_OUT(void)   
{   
        GPIO_StructInit(&GPIO_InitStructure);   
        GPIO_InitStructure.GPIO_Pin   = IIC_SDA_GPIO_Pin;   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
        GPIO_Init(IIC_GPIOx, &GPIO_InitStructure);   
}   
  
/**
  * @brief  Set SDA Pin as Input Mode
  * @retval None
  */  
void SDA_IN(void)   
{   
        GPIO_StructInit(&GPIO_InitStructure);   
        GPIO_InitStructure.GPIO_Pin   = IIC_SDA_GPIO_Pin;   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     
        GPIO_Init(IIC_GPIOx, &GPIO_InitStructure);   
}   
  
/**
  * @brief  Set SDA Pin as Input Mode
  * @retval None
  */  
void SDA_IN(void)   
{   
        GPIO_StructInit(&GPIO_InitStructure);   
        GPIO_InitStructure.GPIO_Pin   = IIC_SDA_GPIO_Pin;   
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     
        GPIO_Init(IIC_GPIOx, &GPIO_InitStructure);   
}
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-6-3 09:06:54 | 显示全部楼层
顶........
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-6-3 10:25:12 | 显示全部楼层
叶子君 发表于 2020-6-3 08:54
感觉有点像iic的sda脚。我觉得可以分开配置。
类似这样

我用IIC的原理来手动切换IO口模式,是可以的。但是这样手动切换的速度要慢点,想让他设置成那种可以输入也可以输出的引脚,百度上找到配置成准双向可以支持,但是上面只说了配置为开漏,外加上拉电阻。具体实现的配置代码并没有,我按照那样设置的,发现写数据可以,但是读数据有问题。不太清楚哪里配置的问题。
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1437
金钱
1437
注册时间
2020-5-12
在线时间
395 小时
发表于 2020-6-3 11:56:33 | 显示全部楼层
chenyuan 发表于 2020-6-3 10:25
我用IIC的原理来手动切换IO口模式,是可以的。但是这样手动切换的速度要慢点,想让他设置成那种可以输入 ...

那看下HAL_GPIO_ReadPin函数是读IDR还是读ODR,输入信号是要去读IDR寄存器的
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2020-6-3 12:03:40 | 显示全部楼层
叶子君 发表于 2020-6-3 11:56
那看下HAL_GPIO_ReadPin函数是读IDR还是读ODR,输入信号是要去读IDR寄存器的


将之前屏蔽的GPIO_InitStruct.Pull = GPIO_NOPULL;打开,然后开漏加上拉,可以输入输出了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-29 14:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表