> 技术文档 > ARM-I2C软实现

ARM-I2C软实现


开发流程

  1. 引脚初始化
  2. 引脚功能定义
  3. 实现读操作
  4. 实现写操作

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;}