OpenEdv-开源电子网

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

SDA_IN(); //将SDA设置成输入,然后执行IIC_SDA=1,是什么意思?

[复制链接]

12

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-10-23
在线时间
0 小时
发表于 2015-4-12 11:22:52 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]u8 IIC_Wait_Ack(void) { u8 ucErrTime=0; SDA_IN(); // 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;// return 0; } [/mw_shl_code]

在这个函数中,SDA_IN();      //将SDA设置成输入,然后执行IIC_SDA=1,是什么意思?

最佳答案

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

把数据IO上拉    上拉输入
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-4-12 11:22:53 | 显示全部楼层
把数据IO上拉    上拉输入
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11557
金钱
11557
注册时间
2014-4-1
在线时间
1318 小时
发表于 2015-4-12 13:09:09 | 显示全部楼层
单线双向应用,一会入一会出,所以要调整管脚的设置。
回复

使用道具 举报

12

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-10-23
在线时间
0 小时
 楼主| 发表于 2015-4-13 15:08:50 | 显示全部楼层
回复【3楼】lycreturn:
---------------------------------
谢啦
回复

使用道具 举报

0

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2013-12-16
在线时间
49 小时
发表于 2016-5-9 22:57:27 | 显示全部楼层
xuande 发表于 2015-4-12 13:09
单线双向应用,一会入一会出,所以要调整管脚的设置。

谢谢!
回复

使用道具 举报

5

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
284
金钱
284
注册时间
2016-8-5
在线时间
158 小时
发表于 2016-9-24 21:02:34 | 显示全部楼层
释放总线
回复

使用道具 举报

8

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2017-10-27
在线时间
36 小时
发表于 2017-10-27 13:02:39 | 显示全部楼层
本帖最后由 maqiufeng 于 2017-10-27 13:06 编辑


#define SDA_IN() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<9*2;}
//PB9 输入模式
#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;}
//PB9 输出模式
//IO 操作函数
#define IIC_SCL PBout(8) //SCL
#define IIC_SDA PBout(9) //SDA
#define READ_SDA PBin(9) //输入 SDA

疑惑的代码
SDA_IN(); //SDA 设置为输入
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);




SDA_IN()不是把PB9置成输入模式了吗
怎么还可以PBout(9)=1,PBout(9)不是在输出模式下才可以用吗
回复

使用道具 举报

9

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-11-11
在线时间
35 小时
发表于 2019-3-14 22:47:30 | 显示全部楼层
maqiufeng 发表于 2017-10-27 13:02
#define SDA_IN() {GPIOB->MODER&=~(3

我也突然发现这个表面上的逻辑矛盾,你明白了吗?有没有大神解答一下疑惑!
回复

使用道具 举报

9

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2018-11-11
在线时间
35 小时
发表于 2019-3-15 11:00:42 | 显示全部楼层
本帖最后由 八蹄马 于 2019-3-15 11:02 编辑
八蹄马 发表于 2019-3-14 22:47
我也突然发现这个表面上的逻辑矛盾,你明白了吗?有没有大神解答一下疑惑!

哈哈,看来大家都是脑子突然乱了,自己回去看了一眼,顺便解答一下(有问题请大家及时指正,只是自己的看法)
QQ截图20190315011536.png
QQ截图20190315103027.png

另外一个帖中原子哥回复网友的话,看了大概有一点开壳。另外原子哥让我们回去看按键实验教程,
但是貌似教程也没有展开得太详细,因为重点都是在讲程序上了。而且开发指南也只是说了输入配置下,
对输入数据寄存器可读。如下图:
QQ截图20190315103754.png

QQ截图20190315011632.png

看看GPIO口的寄存器,其中端口模式寄存器决定是输入还是输出,另外,输入输出数据寄存器应该也还是可以
单独进行读或者写(输入数据寄存器只能读),这样根据原理图,输入模式下,使输出数据寄存器为1,,代表一个上拉,输入数据寄存器也是1,
就默认是IIC接受的无应答信号,在等待一个为0的应答信号。
[mw_shl_code=c,true]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;  
} [/mw_shl_code]
IIC_SCL是PB8的输出数据,IIC_SDA是PB9的输出数据
[mw_shl_code=applescript,true]//IO方向设置
#define SDA_IN()  {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<9*2;}        //PB9输入模式
#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;} //PB9输出模式
//IO操作函数         
#define IIC_SCL    PBout(8) //SCL
#define IIC_SDA    PBout(9) //SDA         
#define READ_SDA   PBin(9)  //输入SDA [/mw_shl_code]
QQ截图20190315105447.png

其实,疑问又有了,这个时候上下拉寄存器是干在干嘛的?
希望大家帮忙看一下我的回答有没有大问题,另外最后一个红色的问题怎么理解



InkedQQ截图20190315102758_LI.jpg
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 04:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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