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

(未解决)STM32软件IIC配置时GPIO基本问题(库函数&寄存器)

[复制链接]
与龙共舞 提问时间:2018-6-27 15:24 /
本帖最后由 与龙共舞 于 2018-6-29 09:24 编辑

hi 今天问一个基础问题,看上去不难的但是。。。没办法我不清楚。
拿出来问问。
我的问题是:库函数我理解,寄存器看不懂

软件模拟IIC通讯的时候,其中SDA这个脚的需要切换OUT还是IN两种模式的,
以前我是用库函数,就像下面这样
  1. //SDA脚设置为OUT
  2. void I2C_SDA_OUT(void)
  3. {
  4.   GPIO_InitTypeDef GPIO_InitStructure;        
  5.         
  6.         GPIO_InitStructure.GPIO_Pin=I2C_SDA;
  7.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  8.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  9.         GPIO_Init(GPIO_I2C,&GPIO_InitStructure);
  10. }
  11. //SDA脚设置为IN
  12. void I2C_SDA_IN(void)
  13. {
  14.         GPIO_InitTypeDef GPIO_InitStructure;        
  15.         
  16.         GPIO_InitStructure.GPIO_Pin=I2C_SDA;
  17.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
  18.         GPIO_Init(GPIO_I2C,&GPIO_InitStructure);
  19. }
复制代码
今天看原子的代码,他用的寄存器写的
  1. //IO方向设置

  2. #define SDA_IN()    {GPIOB->CRL&=0X0FFFFFFF;  GPIOB->CRL|=(u32)8<<28;}

  3. #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;  GPIOB->CRL|=(u32)3<<28;}
复制代码
我仔细看了看,因为他用的是PB7,所以最后是4*7=28  这样来的。

但是(u32)3<<28;这个??


参考:http://forum.eepw.com.cn/thread/286105/1

3其实是11 对应的是不是GPIO_Mode_Out_PP而是开漏输出呀。。。。。
前面 SDA_IN()这句也是看不懂 。OUT是11为啥IN是1000呢?

QQ截图20180627152222.jpg




收藏 1 评论6 发布时间:2018-6-27 15:24

举报

6个回答
huangyanga 回答时间:2018-6-27 16:29:51
个人认为,软件模拟IIC通讯其实只要是IO口配成输出模式就可以了,仅需要IO口有高低电平变化,所以配置成复用输出,也是可以输出高低电平的。另外,之所以开漏输出也可以,大概是因为,一般电路设计SDA这个脚都会有上拉电阻的。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

xmstudio 回答时间:2018-6-27 18:48:30
这个我没有试过,但是有一个思路可以参考。假如用的是开路输出,也就是IO口的两个状态分别是低电平和高阻态,高阻态配合上拉电阻产生高电平。那么在你的IO口为高阻态的时候,既可以做高电平输出,同时也可以作为输入,从机输出低电平的时候,由于上拉电阻的阻值很大,所以实际上线路上是低电平,只要读取IO口的电平状态就相当于输入了。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

stm1024 回答时间:2018-6-27 19:04:57
OUT问题不大,IN有讲究。不过,也可以试试使用位绑定的方法。

评分

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

查看全部评分

dreamfly239 回答时间:2018-6-28 08:35:34
超赞,谢谢分享!

评分

参与人数 1ST金币 -4 收起 理由
zero99 -4 求助帖禁止灌水

查看全部评分

xiajintaord 回答时间:2018-6-28 09:35:46
本帖最后由 xiajintaord 于 2018-6-28 09:36 编辑

3楼说的是对的,SDA 线的 IO 口直接配置为开漏输出即可
SPI 输出时操作输出数据寄存器 GPIOx_ODR 指定位
SPI 输入时读取输入数据寄存器 GPIOx_IDR  指定位

GPIO 配置为输出之后,IO 口的输入寄存器还是在工作的,直接读取就可以了。

GPIO输入与输出.png

The input data register (GPIOx_IDR) captures the data present on the I/O pin at every AHB
clock cycle.  


评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

zero99 回答时间:2018-7-16 15:37:20
问题未解决,楼上几位的回复有帮助吗?
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版