ARM-I2C软实现
开发流程
- 引脚初始化
- 引脚功能定义
- 实现读操作
- 实现写操作
GD32F4软件I2C初始化
void SoftI2C_init() { // 时钟配置 rcu_periph_clock_enable(SCL_RCU); // 设置输出模式 gpio_mode_set(SCL_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SCL_PIN); gpio_output_options_set(SCL_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, SCL_PIN); // 时钟配置 rcu_periph_clock_enable(SDA_RCU); // 设置输出模式 gpio_mode_set(SDA_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SDA_PIN); gpio_output_options_set(SDA_PORT, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, SDA_PIN);}
- I2C引脚高低电平
GD32F4软件I2C引脚功能
#define SCL_RCURCU_GPIOB#define SCL_PORTGPIOB#define SCL_PINGPIO_PIN_6#define SCL_AFGPIO_AF_4#define SDA_RCURCU_GPIOB#define SDA_PORTGPIOB#define SDA_PINGPIO_PIN_7#define SDA_AFGPIO_AF_4/************** io ***************/#define SCL(BIT) gpio_bit_write(SCL_PORT, SCL_PIN, BIT?SET:RESET)#define SDA(BIT) gpio_bit_write(SDA_PORT, SDA_PIN, BIT?SET:RESET)#define SDA_STATE() gpio_input_bit_get(SDA_PORT, SDA_PIN)#define SDA_IN() gpio_mode_set(SDA_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, SDA_PIN)#define SDA_OUT() gpio_mode_set(SDA_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SDA_PIN)
- IO引脚定义
- 引脚输出模式高低电平输出:SCL高和低,SDA高和低
- SDA模式配置:SDA输出模式,SDA输入模式
- SDA输入模式状态读取。
写操作
uint8_t SoftI2C_write(uint8_t addr, uint8_t reg, uint8_t* data, uint32_t len) { start(); send(addr << 1);//发送设备写地址 if(wait_ack()) return 1;//等待响应 send(reg);//发送寄存器地址 if(wait_ack()) return 2;//等待响应 do { send(*data++); if(wait_ack()) return 3; } while(--len); stop(); return 0;}
读操作
uint8_t SoftI2C_read(uint8_t addr, uint8_t reg, uint8_t* data, uint32_t len) { start(); send(addr << 1);//发送设备写地址 if(wait_ack()) return 1;//等待响应 send(reg);//发送寄存器地址 if(wait_ack()) return 2;//等待响应 start(); send((addr << 1) | 0x01);//发送设备读地址 if(wait_ack()) return 3;//等待响应 do { *data = recv(); data++; if(len != 1) send_ack();// 发送 ACK } while(--len); send_nack();// 发送 NACK stop(); return 0;}