OpenEdv-开源电子网

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

简单的I2C问题

[复制链接]

46

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2016-9-13
在线时间
58 小时
发表于 2017-6-19 17:35:46 | 显示全部楼层 |阅读模式
10金钱
再读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;  
}

最佳答案

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

#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF; GPIOB->CRL|=(u32)8CRL|=(u32)3
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-6-19 17:35:47 | 显示全部楼层
#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很快,多执行一条没有用的指令也不怕.
回复

使用道具 举报

46

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2016-9-13
在线时间
58 小时
 楼主| 发表于 2017-6-19 20:06:19 | 显示全部楼层
操作系统 发表于 2017-6-19 17:35
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;  GPIOB->CRL|=(u32)8CRL|=(u32)3

大神回答问题很有水平啊
回复

使用道具 举报

0

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2017-6-12
在线时间
8 小时
发表于 2017-6-19 22:50:32 | 显示全部楼层
做别人的船学习。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-18 04:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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