stm32f1x,IIC实验代码中,关于数据线SDA设置,GPIOB模式的问题

2019-07-21 07:15发布

IIC实验代码中:
//IO方向设置

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

//IO操作函数         
#define IIC_SCL    PBout(6) //SCL
#define IIC_SDA    PBout(7) //SDA         
#define READ_SDA   PBin(7)  //输入SDA

问:其中宏定义中,SDA_IN()定义的是数据输入,但是8<<28bit,代表 bit29:28 ---->11   
                                                                                                   bit31:30 ---->01
代表 通用开漏输出和输出模式,速度50MHz     ,这不就代表输出模式了吗?不是输入模式
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
不存在的时间
1楼-- · 2019-07-21 11:46
8<<28位,最终得到的数对应位31-位28的数 1000 ,对应起来是 上拉/下拉输入模式
3<<28位,最终得到的数对应位31-位28的数 0011 ,对应起来是 通用推挽输出模式

GPIOB->CRL&=0X0FFFFFFF  先令位32-28的数为0000,
GPIOB->CRL|=(u32)8<<28   然后或上8左移28的数据

你要注意: 一位16进制的数等于4位二进制数,即0xF= 1111
peng1554
2楼-- · 2019-07-21 13:27
8<<28位是 1000 0000 0000 0000 0000 0000 0000 0000
你再对照手册看看是否是输入~~
硕果磊磊
3楼-- · 2019-07-21 18:54
不存在的时间 发表于 2018-12-2 16:11
8

确实是输入,追问一下:IIC这一块,什么代码中写开始信号,停止信号,应答信号;这些都建立在时钟信号下,这个 时钟线产生的时钟是,有规律的脉冲时钟(时钟源那疙瘩接入的)还是用户自己写代码产生的无规律的(只是为了区分各种信号而写的)?
不存在的时间
4楼-- · 2019-07-21 22:20
从PLCK1时钟源获得的
QQ截图20181202170831.jpg
QQ截图20181202171602.jpg

硕果磊磊
5楼-- · 2019-07-22 04:06
 精彩回答 2  元偷偷看……
不存在的时间
6楼-- · 2019-07-22 04:24
QQ截图20181202222223.jpg

原子的历程中用的是软件模拟的方式来实现IIC的通讯的。
32的硬件IIC比较复杂,有7位地址和10位地址两种地址模式,它除了IIC协议还可以运行SMbus协议。



一周热门 更多>