OpenEdv-开源电子网

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

原子的模拟I2C配置有疑问,SDA_IN的时候,为什么还能IIC_SDA=1,也就是配置为输入的时候还能输出?

[复制链接]

10

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-7-7
在线时间
110 小时
发表于 2016-7-22 16:16:26 | 显示全部楼层 |阅读模式
1金钱
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#楼]

质疑正确。这句是无效的,不会导致SDA输出1,因为已经设置为输入了。 估计是笔误,删掉这一句,不会有影响。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6291

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11406
金钱
11406
注册时间
2014-4-1
在线时间
1282 小时
发表于 2016-7-22 16:16:27 | 显示全部楼层

质疑正确。这句是无效的,不会导致SDA输出1,因为已经设置为输入了。
估计是笔误,删掉这一句,不会有影响。




回复

使用道具 举报

10

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
459
金钱
459
注册时间
2016-7-7
在线时间
110 小时
 楼主| 发表于 2016-7-22 16:32:45 | 显示全部楼层
xuande 发表于 2016-7-22 16:26
质疑正确。这句是无效的,不会导致SDA输出1,因为已经设置为输入了。
估计是笔误,删掉这一句,不会有影 ...

,谢谢啊,看过那么多32的教程,原子的写的最详细
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-6-6
在线时间
2 小时
发表于 2016-12-9 18:29:43 | 显示全部楼层
我也看到这上下矛盾的语句。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-6-6
在线时间
2 小时
发表于 2016-12-9 18:31:05 | 显示全部楼层
我纠结了半天,看来看去知道原子写错了。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-6-6
在线时间
2 小时
发表于 2016-12-9 18:44:06 | 显示全部楼层
这个函数写得一塌糊涂。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-6-6
在线时间
2 小时
发表于 2016-12-9 18:57:13 | 显示全部楼层
正确的顺序应该是:
1)GPIO设置为输入
2)GPIO PIN7 PIN6配置为高
3)PIN6 SCL拉低,为PIN7信号变化做准备。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-6-6
在线时间
2 小时
发表于 2016-12-9 19:38:57 | 显示全部楼层
任何时候等待ACK时,只需要读从机输入就可以了。不需要设置SDA。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-6-6
在线时间
2 小时
发表于 2016-12-10 10:29:13 | 显示全部楼层
看了好多帖子,然后又看回GPIO的寄存器,才知道SDA_in( )设置配置,需要设置ODR为1;
另外一个问题,SDA_OUT( )配置为推挽输出,为何不配置为开漏输出?因为II2C的标准外设配置都是开漏输出?
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-7-15
在线时间
1 小时
发表于 2016-12-16 14:18:25 | 显示全部楼层
刚想发贴问,原来已经有人问过了; 这样改了下,运行也正常,不知这样好不好,

u8 IIC_Wait_Ack(void)
{
    u8 ucErrTime=0;
   
    IIC_SDA=1;delay_us(1);
    IIC_SCL=1;delay_us(1);

    SDA_IN(); //SDA 设置为输入

    while(READ_SDA)
    {
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-2-13
在线时间
27 小时
发表于 2020-2-29 14:11:06 | 显示全部楼层


ODR寄存器可以在输入模式下设置成上下拉
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-2-13
在线时间
27 小时
发表于 2020-2-29 14:15:15 | 显示全部楼层
在输出模式下,ODR寄存器的意思是输出高(置1)低(置0)电平;
而在输入模式下,ODR寄存器的意思是开启芯片内部的上拉(置1)还是下拉(下拉)电阻,主要作用是在没有输入信号的时候确定管脚电平状态的

回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2020-3-13
在线时间
3 小时
发表于 2020-3-13 14:25:14 | 显示全部楼层
为什么我删去IIC_SDA=1和IIC_SCL=1后会出错呀
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-11-28
在线时间
4 小时
发表于 2020-10-6 15:49:19 | 显示全部楼层
梨夫1234 发表于 2020-3-13 14:25
为什么我删去IIC_SDA=1和IIC_SCL=1后会出错呀

SCL不能删除
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2020-11-23
在线时间
26 小时
发表于 2023-6-5 23:13:47 | 显示全部楼层
SDA_IN(); //设置为上/下拉输入
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2020-11-23
在线时间
26 小时
发表于 2023-6-5 23:22:05 | 显示全部楼层
我觉得应该是这样理解
SDA_IN();      //SDA设置为上/下拉输入  
IIC_SDA=1; //通过位操作设置了寄存器 ODR相应位为1
应该两句一起理解就是配置成上拉输入
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 07:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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