【IIC】#define SDA_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}

在软件IIC中看到以下代码,花了好长时间搞懂,特此记录

// SDA对应IO口方向的设置
#define SDA_IN()  {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}// 1000 上拉输入模式 
#define SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=3<<4;}// 输出模式,最大速度50mhz 

首先了解所操作的CRH寄存器

文档寄存器说明

1.清零

GPIOB->CRH&=0XFFFFFF0F

在这里插入图片描述
注意CRH是高八位IO控制寄存器,是一个32位的寄存器,其中CNFX 和 MODEX 这16位来控制一个IO的工作模式, 注意只用到每八位的[1:0]两位

SDA对应PB9
GPIOB->CRH&=0XFFFFFF0F
因此此代码将SDA对应的位置清零

2.设定

GPIOB->CRH|=8<<4

8 :1000
因为每16位对应4位二进制代码,为了跳过 PB8对应的位数,左移4来实现。

那么为了操作PB10 就是

GPIOB->CRH|=8<<8

那么为了操作PB11 就是

GPIOB->CRH|=8<<12

是不是很清除了呢?

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当然,下面是在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口的设置也做了相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

おもいね

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值