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 排针相连
4 例程演示说明¶
烧录完成后,芯片会通过串口打印测试菜单:
+--------------------------------------------------------------------------------------+ | 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. | +--------------------------------------------------------------------------------------+
串口输入字符‘1’,执行单字节写入测试:向 EEPROM 地址
0x0100写入0xA9。Master Send Data:
串口输入字符‘2’,执行单字节读取测试:从 EEPROM 地址
0x0100读取 1 字节并打印。Master Receive Data: Read data: 0xa9
串口输入字符‘3’,执行多字节写入测试:向 EEPROM 地址
0x0120连续写入10字节数据。Master Write Multiple Bytes:
串口输入字符‘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 字节寄存器数据¶
执行流程:
Start发送
addr + Write发送寄存器地址(16 位时先高后低)
发送 1 字节数据
dataStop
典型总线时序:
8 位寄存器地址:
S | Dev+W | A | RegL | A | Data | A | P16 位寄存器地址:
S | Dev+W | A | RegH | A | RegL | A | Data | A | P
6.3 I2C_ReadReg:读 1 字节寄存器数据¶
执行流程:
Start发送
addr + Write发送寄存器地址(定位要读的寄存器)
Restart发送
addr + Read读取 1 字节,主机回
NACK(表示最后 1 字节)Stop
典型总线时序:
S | Dev+W | A | Reg... | A | Sr | Dev+R | A | Data | N | P
6.4 I2C_WriteRegs:连续写多个字节¶
执行流程:
Start发送
addr + Write发送寄存器起始地址
连续发送
len个数据字节Stop
典型总线时序:
S | Dev+W | A | Reg... | A | D0 | A | D1 | A | ... | Dn | A | P
6.5 I2C_ReadRegs:连续读多个字节¶
执行流程:
Start发送
addr + Write发送寄存器起始地址
Restart发送
addr + Read连续读取
len字节:前
len-1字节回ACK(继续读取)最后 1 字节回
NACK(结束读取)
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,并确保缓冲区有效。