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中文参考手册里的定义是:


猜你喜欢

转载自blog.csdn.net/heda3/article/details/80587655
sda
今日推荐