OpenEdv-开源电子网

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

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

[复制链接]

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
金钱
384
注册时间
2018-11-20
在线时间
62 小时
发表于 2018-12-2 16:11:45 | 显示全部楼层 |阅读模式
1金钱
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     ,这不就代表输出模式了吗?不是输入模式

GPIOx_CRL寄存器

GPIOx_CRL寄存器
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
349
金钱
349
注册时间
2017-3-20
在线时间
86 小时
发表于 2018-12-2 16: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
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-12-2 16:26:11 | 显示全部楼层
8<<28位是 1000 0000 0000 0000 0000 0000 0000 0000
你再对照手册看看是否是输入~~
回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
金钱
384
注册时间
2018-11-20
在线时间
62 小时
 楼主| 发表于 2018-12-2 16:51:56 | 显示全部楼层

确实是输入,追问一下:IIC这一块,什么代码中写开始信号,停止信号,应答信号;这些都建立在时钟信号下,这个 时钟线产生的时钟是,有规律的脉冲时钟(时钟源那疙瘩接入的)还是用户自己写代码产生的无规律的(只是为了区分各种信号而写的)?
回复

使用道具 举报

2

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
349
金钱
349
注册时间
2017-3-20
在线时间
86 小时
发表于 2018-12-2 17:15:24 | 显示全部楼层
从PLCK1时钟源获得的
QQ截图20181202170831.jpg
QQ截图20181202171602.jpg

回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
金钱
384
注册时间
2018-11-20
在线时间
62 小时
 楼主| 发表于 2018-12-2 20:26:37 | 显示全部楼层

get到了,那如果是时钟固定的,视频中代码怎么解释?
比如说:
//产生IIC起始信号
void IIC_Start(void)
{
        SDA_OUT();     //sda线输出
        IIC_SDA=1;                    
        IIC_SCL=1;
        delay_us(4);
        IIC_SDA=0;//START:when CLK is high,DATA change form high to low
        delay_us(4);
        IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}          
//产生IIC停止信号
void IIC_Stop(void)
{
        SDA_OUT();//sda线输出
        IIC_SCL=0;
        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        IIC_SCL=1;
        IIC_SDA=1;//发送I2C总线结束信号
        delay_us(4);                                                                  
}
这些强行设置IIC_SCL输出高低电平,任意延迟delay_us(4)等等,都不准确白,起码得计算一下时钟周期,按周期延时啊?
回复

使用道具 举报

2

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
349
金钱
349
注册时间
2017-3-20
在线时间
86 小时
发表于 2018-12-2 22:34:23 | 显示全部楼层
QQ截图20181202222223.jpg

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



回复

使用道具 举报

27

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
金钱
384
注册时间
2018-11-20
在线时间
62 小时
 楼主| 发表于 2018-12-3 08:59:53 | 显示全部楼层
不存在的时间 发表于 2018-12-2 22:34
原子的历程中用的是软件模拟的方式来实现IIC的通讯的。
32的硬件IIC比较复杂,有7位地址和10位地址两 ...

多谢,看来弄懂IIC不容易啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 08:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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