IIC实例的SDA_In和SDA_Out的代码理解GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<9*2;


IIC通讯实验里面的例程:

#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输出模式


不是右移3位

前部分GPIOB->MODER&=~(3<<(9*2));  是将十进制的3(二进制是11)左移(9*2)个位,也就是将16,17位置置为11,然后取反变为00,再和GPIOB->MODER与运算,此时GPIOB->MODER的16,17位变为00。第一句也就是将GPIOB->MODER的16,17位置0.
后部分GPIOB->MODER|=0<<9*2和GPIOB->MODER|=1<<9*2也就是根据参考手册的输入输出给这两个位置赋值,过程和上面是一样的。

应该就是这样吧,,我也是初学,,


3 << 2,则是将数字3左移2位

罪过啊,移位运算符的符、规则没有记清楚,所以就蒙蔽了,在这里记一笔,以后忘记了过来翻翻看看。


当然,下面是在stm32g070xx单片机的代码: ```c #ifndef __IIC_H #define __IIC_H #include "main.h" // IIC GPIO定义 #define I2C_SCL_PIN GPIO_PIN_6 #define I2C_SCL_PORT GPIOB #define I2C_SDA_PIN GPIO_PIN_7 #define I2C_SDA_PORT GPIOB // IIC读写方向 #define I2C_DIRECTION_TRANSMITTER 0 #define I2C_DIRECTION_RECEIVER 1 // IIC读写返回值 #define I2C_ACK 1 #define I2C_NACK 0 // IIC初始化 void I2C_Init(void); // IIC开始信号 void I2C_Start(void); // IIC停止信号 void I2C_Stop(void); // IIC发送数据 void I2C_SendByte(uint8_t byte); // IIC接收数据 uint8_t I2C_ReceiveByte(uint8_t ack); // IIC等待应答信号 uint8_t I2C_WaitAck(void); // IIC发送应答信号 void I2C_SendAck(uint8_t ack); // SDA口设置为输入模式 #define SDA_IN() {I2C_SDA_PORT->MODER &= ~(GPIO_MODER_MODE7_Msk);\ I2C_SDA_PORT->MODER |= (GPIO_MODER_MODE7_0);} // SDA口设置为输出模式 #define SDA_OUT() {I2C_SDA_PORT->MODER &= ~(GPIO_MODER_MODE7_Msk);\ I2C_SDA_PORT->MODER |= (GPIO_MODER_MODE7_0);\ I2C_SDA_PORT->OTYPER &= ~(GPIO_OTYPER_OT7_Msk);} #endif ``` 这段代码包含了IIC通信所需的宏定义和函数声明,同时也包含了GPIO的定义。在初始化函数中,需要初始化IICGPIO口为推挽输出模式,并将SCL和SDA口拉高。在发送数据时需要先发送起始信号,然后发送数据,最后发送停止信号。在接收数据时需要等待应答信号,然后接收数据,最后发送应答信号。在SDA_IN和SDA_OUT宏定义中,SDA口的设置也做了相应的修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值