当前页面为 开发中 版本,查看特定版本的文档,请在页面左下角的下拉菜单中进行选择。

I2C

1 功能概述

本例程演示 I2C Driver 的基本功能与使用方法,使用 PAN271x 作为 I2C 主机对 AT24C32 EEPROM 进行读写操作。

2 环境准备

  • 硬件设备与线材:

    • PAN271x EVB 核心板底板各一块

    • JLink 仿真器(用于烧录例程程序)

    • USB-TypeC 线一条(用于底板供电和查看串口打印 Log)

    • AT24C32 EEPROM 模块一个

    • 杜邦线数根或跳线帽数个(用于连接各个硬件设备)

  • 硬件接线:

    • 将 EVB 核心板插到底板上

    • 连接串口日志口:

      • 使用 USB-TypeC 线,将 PC USB 插口与 EVB 底板 USB->UART 插口相连

      • 使用杜邦线或跳线帽将 EVB 底板 J8 排针对 (P06 & TXD) 和 J9 排针对 (P05 & RXD) 分别短接起来(用作 log 输出)

    • 连接 AT24C32 EEPROM 模块:

      • EEPROM VCC 接 EVB 3.3V

      • EEPROM GND 接 EVB GND

      • EEPROM SCL 接 EVB P14(I2C0_SCL,对应 P1.4)

      • EEPROM SDA 接 EVB P13(I2C0_SDA,对应 P1.3)

    • 连接 Jlink,使用杜邦线将 JLink 仿真器的:

      • SWD_CLK 引脚与 EVB 底板的 P00 排针相连

      • SWD_DAT 引脚与 EVB 底板的 P01 排针相连

      • SWD_GND 引脚与 EVB 底板的 GND 排针相连

3 编译和烧录

例程位置:<PAN271x-DK>\01_SDK\samples\drivers\i2c

双击 Keil Project 文件打开工程进行编译烧录。

4 例程演示说明

  1. 烧录完成后,芯片会通过串口打印测试菜单:

    +--------------------------------------------------------------------------------------+
    |                       PAN271x I2C Sample Code.                                      |
    +--------------------------------------------------------------------------------------+
    |    Press key to start specific testcase:                                            |
    |                                                                                      |
    |    Input '1'    Testcase 1 : Master  Send Data.                                     |
    |    Input '2'    Testcase 2 : Master  Read  one byte  Data.                          |
    |    Input '3'    Testcase 3 : Master  Write  multiple bytes  Data.                   |
    |    Input '4'    Testcase 4 : Master  Read  multiple bytes  Data.                    |
    +--------------------------------------------------------------------------------------+
    
  2. 串口输入字符‘1’,执行单字节写入测试:向 EEPROM 地址 0x0100 写入 0xA9

    Master Send Data:
    
  3. 串口输入字符‘2’,执行单字节读取测试:从 EEPROM 地址 0x0100 读取 1 字节并打印。

    Master Receive Data:
    Read data: 0xa9
    
  4. 串口输入字符‘3’,执行多字节写入测试:向 EEPROM 地址 0x0120 连续写入 10 字节数据。

    Master Write Multiple Bytes:
    
  5. 串口输入字符‘4’,执行多字节读取测试:从 EEPROM 地址 0x0120 连续读取 10 字节并打印。

    Master Read Multiple Bytes:
    Read data: 0x0 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 0x99
    

说明:建议先执行测试 1 再执行 2,先执行测试 3 再执行 4,便于验证读写一致性。

5 RAM/Otp资源使用情况

  • Otp Size: 以 Keil 编译输出为准

  • RAM Size: 以 Keil 编译输出为准

6 底层接口说明(寄存器读写)

本例程调用了以下 4 个通用 I2C 接口:

bool I2C_WriteReg(uint8_t addr, uint16_t reg, I2C_RegWidth_t width, uint8_t data);
bool I2C_ReadReg(uint8_t addr, uint16_t reg, I2C_RegWidth_t width, uint8_t *data);
bool I2C_WriteRegs(uint8_t addr, uint16_t reg, I2C_RegWidth_t width, uint8_t *data, uint16_t len);
bool I2C_ReadRegs(uint8_t addr, uint16_t reg, I2C_RegWidth_t width, uint8_t *data, uint16_t len);

6.1 参数含义

  • addr:I2C 设备地址。本驱动按 8-bit 地址格式使用(最低位为 R/W 位),调用时通常传入左移后的地址值。

  • reg:器件内部寄存器地址(或 EEPROM 内部地址)。

  • width:寄存器地址位宽:

    • REG_8BIT:发送 1 字节寄存器地址

    • REG_16BIT:先发送高字节,再发送低字节

  • data

    • 对写接口是待发送数据

    • 对读接口是接收缓冲区指针

  • len:连续读写字节数。

  • 返回值:true 表示事务成功,false 表示中途任一步失败(NACK/超时/状态异常)。

6.2 I2C_WriteReg:写 1 字节寄存器数据

执行流程:

  1. Start

  2. 发送 addr + Write

  3. 发送寄存器地址(16 位时先高后低)

  4. 发送 1 字节数据 data

  5. Stop

典型总线时序:

  • 8 位寄存器地址:S | Dev+W | A | RegL | A | Data | A | P

  • 16 位寄存器地址:S | Dev+W | A | RegH | A | RegL | A | Data | A | P

6.3 I2C_ReadReg:读 1 字节寄存器数据

执行流程:

  1. Start

  2. 发送 addr + Write

  3. 发送寄存器地址(定位要读的寄存器)

  4. Restart

  5. 发送 addr + Read

  6. 读取 1 字节,主机回 NACK(表示最后 1 字节)

  7. Stop

典型总线时序:

  • S | Dev+W | A | Reg... | A | Sr | Dev+R | A | Data | N | P

6.4 I2C_WriteRegs:连续写多个字节

执行流程:

  1. Start

  2. 发送 addr + Write

  3. 发送寄存器起始地址

  4. 连续发送 len 个数据字节

  5. Stop

典型总线时序:

  • S | Dev+W | A | Reg... | A | D0 | A | D1 | A | ... | Dn | A | P

6.5 I2C_ReadRegs:连续读多个字节

执行流程:

  1. Start

  2. 发送 addr + Write

  3. 发送寄存器起始地址

  4. Restart

  5. 发送 addr + Read

  6. 连续读取 len 字节:

    • len-1 字节回 ACK(继续读取)

    • 最后 1 字节回 NACK(结束读取)

  7. Stop

典型总线时序:

  • S | Dev+W | A | Reg... | A | Sr | Dev+R | A | D0 | A | ... | Dn | N | P

6.6 使用注意事项

  • 地址格式:若器件手册给的是 7-bit 地址(如 0x50),本驱动调用时通常传入左移后的 8-bit 值(如 0xA0)。

  • REG_8BIT/REG_16BIT 必须与器件寄存器地址位宽匹配,否则会出现读写错位。

  • 连续写 EEPROM 需考虑页写限制(如页边界对齐)和写周期延时;本示例 AT24C32 驱动中写后增加了延时。

  • 调用连续读接口时,建议保证 len > 0,并确保缓冲区有效。