Driver: I2C Master¶
1 功能概述¶
`i2c_master sample`演示了Zephyr I2C Driver在PAN1080 SoC上的使用方法,主要包括:
I2C Master 配置
按照地址 I2C Slave 地址写入 I2C数据
按照地址 I2C Slave 地址读取 I2C数据
(可选) 通过逻辑分析仪抓取I2C数据观测
2 配置说明¶
prj.conf
为默认配置,DMA未使能prj_dma.conf
为DMA使能配置CONFIG_I2C_PANCHIP_DMA_DRIVEN
: 使能DMA featureCONFIG_I2C_PANCHIP_DMA_TIMEOUT为DMA
:操作时的超时时间(未及时触发DMA中断),单位为ms。
3 环境要求¶
PAN1080 EVB 一块
USB-TypeC 线一条(用于供电和查看串口打印 Log)
(可选)Saleae16 Logic Analysis与配套软件
Logic 2.3.50
硬件接线:
使用USB线,将 PC USB 与 EVB USB-TypeC(USB->UART)相连
根据 EVB 核心板芯片的封装不同,使用杜邦线将 EVB 底板上的:
TX0 与 P30 相连
RX0 与 P31 相连
I2C Master P01 与 Slave P01 相连,I2C Master P00 与 Slave P00 相连(若 EVB 板芯片为 QFN32 或 LQFP64 封装)
I2C Master P40 与 Slave P40 相连,I2C Master P041 与 Slave P41 相连(若 EVB 板芯片为 QFN48 封装)
(可选)Master P01(或P40) 与 逻辑分析仪 SDA channel 相连,Master P00(或P41) 与 逻辑分析仪 SCL channel 相连,并且 EVB 与 Logic Analysis GND 相连
PC 软件: 串口调试助手(UartAssist)或终端工具(SecureCRT),波特率921600
4 编译和烧录¶
例程位置:zephyr\samples_panchip\driver\i2c\i2c_master
使用 ZAL 工具可以对其进行编译、烧录、打开 VS Code 调试等操作。关于 ZAL 工具的详细介绍请参考:Zephyr APP Launcher 工具介绍。
5 演示说明¶
连线
运行脚本`quick_build_samples\i2c_master.bat`,编译后进行烧录至 pan108xxb5_evb 之后将master P01(I2C SDA)与slave端P01进行连接,master P00(I2C SCL)与slave端P00进行连接 有额外条件还可将P01,P00与逻辑分析仪2个channel进行连接,GND与逻辑分析仪GND连接后,开始抓数据
I2C Master |
I2C Slave |
Logic Analyzer |
---|---|---|
P01(I2C SDA) |
P01(I2C SDA) |
CH0 SDA |
P00(I2C SCL) |
P00(I2C SCL) |
CH1 SCL |
GND |
GND |
Sample执行流程:
先进行I2C Slave的下载并复位
配置I2C为Master 模式,并配置标准速率模式
生成16B数据(Ex:data[i] = i),通过I2C Master 指定Slave I2C通信地址(0x50)后,发送全部16B数据
通过I2C Master 指定Slave I2C通信地址(0x50)后,读取16B数据
对比写入与读出的数据是否一致
Slave端收转发,Master端发转收,完成I2C Master对I2C Slave的读写操作
示例打印出master读出的写入slave数据
cmp_data[0] = 0
cmp_data[1] = 1
cmp_data[2] = 2
cmp_data[3] = 3
cmp_data[4] = 4
cmp_data[5] = 5
cmp_data[6] = 6
cmp_data[7] = 7
cmp_data[8] = 8
cmp_data[9] = 9
cmp_data[10] = 10
cmp_data[11] = 11
cmp_data[12] = 12
cmp_data[13] = 13
cmp_data[14] = 14
cmp_data[15] = 15
逻辑分析仪示例数据:抓取了从写开始到写到终止,到读开始到读终止
6 开发说明¶
6.2 I2C API¶
I2C使用包括:获取I2C设备;配置I2C基础模式;配置读/写进行通信操作
相关底层实现存在于zephyr\drivers\i2c\i2c_panchip.c
6.2.1 通过 label
获取 DTS I2C
¶
const struct device *i2c_dev = DEVICE_DT_GET(DT_NODELABEL(i2c0));
6.2.2 配置I2C速率与Master模式¶
uint32_t i2c_cfg = I2C_SPEED_SET(I2C_SPEED_STANDARD) | I2C_MODE_MASTER
i2c_configure(i2c_dev, i2c_cfg)
6.2.3 I2C Master Write to I2C Slave Addr¶
i2c_write(i2c_dev, datas, 16, TAR_I2C_ADDR);
6.2.4 I2C Master Read to I2C Slave Addr¶
i2c_read(i2c_dev, cmp_data, 16, TAR_I2C_ADDR);
7 RAM/Flash资源使用情况¶
Memory region Used Size Region Size %age Used
FLASH: 18992 B 256 KB 7.24%
SRAM: 4184 B 64 KB 6.38%