再读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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
#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很快,多执行一条没有用的指令也不怕.
大神回答问题很有水平啊
一周热门 更多>