简单的I2C问题

2019-08-17 06:41发布

再读I2C的例程时有一些疑惑,想来请教一下。
首先是这两句,我明白是什么意思,但是不明白为什么这样写。
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;  GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF; GPIOB->CRL|=(u32)3<<28;}
1、为什么前面一句用的是 与 来赋值。后面一句用的是 或 来赋值。什么情况下用或更好些呢?这是不是一些编程的小技巧。
2、什么时候需要在数据前加强制转化类型呢? 我看到后面一句数据被强制转化为u32了,前面为什么不用呢?


下面是一段等待应答的函数,我有一个不明白的地方,SDA_IN();这句是设置IO口为输入模式的,而下面的IIC_SDA=1;我就不明白了,输入模式下还能给IO口置位吗?
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();              //SDA设置为输入  
IIC_SDA=1;delay_us(1);   
IIC_SCL=1;delay_us(1);  
while(READ_SDA)
{
  ucErrTime++;
  if(ucErrTime>250)
  {
   IIC_Stop();
   return 1;
  }
}
IIC_SCL=0;//时钟输出0     
return 0;  
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
操作系统
1楼-- · 2019-08-17 09:35
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;  GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF; GPIOB->CRL|=(u32)3<<28;}
这个好说..先&= 0X0FFFFFFF ,只清0 28 29 30 31 四个位. ,后面的|= 就是修改 这四个位.
前面的数字不用(U32),因为它本身就是U32类型了.   后面的强制(U32)省掉也可以..一般情况编译器能搞定这些事情.
后面的问题.正常的I2C总线使用开漏输出就可以完美解决..不用切换IO的方向.你实在要切换IO的方向..也没什么特别大的问题.
同理,设置IO为输入后,你想来一句,IIC_SDA=1;也不是什么问题,不来也是可以的.只要最终结果是正确的就好了.STM32很快,多执行一条没有用的指令也不怕.
WWCool
2楼-- · 2019-08-17 11:18
操作系统 发表于 2017-6-19 17:35
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;  GPIOB->CRL|=(u32)8CRL|=(u32)3

大神回答问题很有水平啊
口蚂
3楼-- · 2019-08-17 11:44
做别人的船学习。

一周热门 更多>