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

2019-07-21 04:20发布

[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,是什么意思?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
八蹄马
2019-07-21 17:23
本帖最后由 八蹄马 于 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

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



一周热门 更多>