STM32
直播中

fanB

8年用户 1382经验值
擅长:20615
私信 关注
[问答]

STM32软件IIC配置时GPIO基本问题求解答

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

软件模拟IIC通讯的时候,其中SDA这个脚的需要切换OUT还是IN两种模式的,
以前我是用库函数,就像下面这样

  • //SDA脚设置为OUT
  • void I2C_SDA_OUT(void)
  • {
  •   GPIO_InitTypeDef GPIO_InitStructure;

  •         GPIO_InitStructure.GPIO_Pin=I2C_SDA;
  •         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  •         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  •         GPIO_Init(GPIO_I2C, GPIO_InitStructure);
  • }
  • //SDA脚设置为IN
  • void I2C_SDA_IN(void)
  • {
  •         GPIO_InitTypeDef GPIO_InitStructure;

  •         GPIO_InitStructure.GPIO_Pin=I2C_SDA;
  •         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
  •         GPIO_Init(GPIO_I2C, GPIO_InitStructure);
  • }

今天看原子的代码,他用的寄存器写的

  • //IO方向设置

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

  • #define SDA_OUT() {GPIOB->CRL =0X0FFFFFFF;  GPIOB->CRL|=(u32)3<<28;}

我仔细看了看,因为他用的是PB7,所以最后是4*7=28  这样来的。

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

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

回帖(1)

陈迎研

2024-4-28 14:53:45
个人认为,软件模拟IIC通讯其实只要是IO口配成输出模式就可以了,仅需要IO口有高低电平变化,所以配置成复用输出,也是可以输出高低电平的。另外,之所以开漏输出也可以,大概是因为,一般电路设计SDA这个脚都会有上拉电阻的。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分