IIC读取:SDA_in SDA_out寄存器设置

IIC读取语句里的语句:
uchar DAC5571_check(void)
{
        uchar slaveack;
        SDA_in;                       
        SCL_H;                     
        I2C_delay();                  
        slaveack = SDA_read ;         
        SCL_L;                     
        I2C_delay();                  
        SDA_out;                    
        if(slaveack)    return 0;       
        else            return 1;  
}    
其中的两条语句的解析:
#define SDA_in  {GPIOB->MODER&=~(3<<(11*2));GPIOB->MODER|=0<<11*2;}    
#define SDA_out {GPIOB->MODER&=~(3<<(11*2));GPIOB->MODER|=1<<11*2;}

语句的意思是:~(3<<(11*2)) :相当于11左移22位,也就是22和23位都是1,再取反就是00,GPIOB->MODER和22、23位(00)取与运算,则为00,同理00左移22位再和GPIOB->MODER取或运算(不变);
对应下表的指示00代表 输入复位状态。
#define SDA_out {GPIOB->MODER&=~(3<<(11*2));GPIOB->MODER|=1<<11*2;}
前面的一句和上面的分析一样不变,关键是后一句GPIOB->MODER|=1<<11*2,01左移22位,表示22为1,23位为0,再取或则22位为1,23位保持不变即是为0;显然对应下面的通用输出模式。
因为我们的器件作为从机 要读取从机的地址故数据方向为从机到MCU的传输,所以IO口作为输入,同时用完以后恢复输出模式。
寄存器在STM32F4中文参考手册里的定义是:


————————————————
版权声明:本文为CSDN博主「heda3」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/heda3/article/details/80587655

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值