I2C - eeprom

本 demo 主要介绍 I2C 读写 eeprom。

硬件连接

本 demo 使用到的 gpio 参考 board_i2c0_gpio_init ,将 eeprom 模块与开发板连接,具体引脚连接方式如下表(以BL616为例):

硬件连接

开发板 I2C 引脚

eeprom 模块

SCL(GPIO14)

SCL

SDA(GPIO15)

SDA

GND

GND

VCC

VCC

软件实现

更详细的代码请参考 examples/peripherals/i2c/i2c_eeprom

1board_init();
  • board_init 中会开启 I2C IP 时钟,并选择 I2C 时钟源和分频。

1board_i2c0_gpio_init();
  • 配置相关引脚为 I2C 功能

1i2c0 = bflb_device_get_by_name("i2c0");
2
3bflb_i2c_init(i2c0, 400000);
  • 获取 i2c0 句柄,并初始化 i2c0 频率为 400K

 1struct bflb_i2c_msg_s msgs[2];
 2uint8_t subaddr[2] = { 0x00, EEPROM_SELECT_PAGE0};
 3uint8_t write_data[256];
 4
 5/* Write and read buffer init */
 6for (size_t i = 0; i < 256; i++) {
 7    write_data[i] = i;
 8    read_data[i] = 0;
 9}
10
11/* Write page 0 */
12msgs[0].addr = 0x50;
13msgs[0].flags = I2C_M_NOSTOP;
14msgs[0].buffer = subaddr;
15msgs[0].length = 2;
16
17msgs[1].addr = 0x50;
18msgs[1].flags = 0;
19msgs[1].buffer = write_data;
20msgs[1].length = EEPROM_TRANSFER_LENGTH;
21
22bflb_i2c_transfer(i2c0, msgs, 2);
  • 初始化发送数据(write_data),接收buffer和配置从设备信息(msgs)

  • bflb_i2c_transfer(i2c0, msgs, 2) 开启 i2c 传输

1uint8_t read_data[256];
2
3/* Read page 0 */
4msgs[1].addr = 0x50;
5msgs[1].flags = I2C_M_READ;
6msgs[1].buffer = read_data;
7msgs[1].length = EEPROM_TRANSFER_LENGTH;
8bflb_i2c_transfer(i2c0, msgs, 2);
  • 读取从设备寄存器地址中的数据,存放至 read_data 中

  • bflb_i2c_transfer(i2c0, msgs, 2) 开启 i2c 传输

1/* Check read data */
2for (uint8_t i = 0; i < EEPROM_TRANSFER_LENGTH; i++) {
3    if (write_data[i] != read_data[i]) {
4        printf("check fail, %d write: %02x, read: %02x\r\n", i, write_data[i], read_data[i]);
5    }
6}
  • 检查发送和读取的数据是否一致

编译和烧录

参考 环境搭建

实验现象

按下 RST 按键,数据传输完成后,打印“write over”,“read over”和“check over”。