Driver: I2C Slave¶
1 功能概述¶
i2c_slave sample
演示了Zephyr I2C Driver在PAN1080 SoC上的使用方法,主要包括:
I2C Slave 配置
配置 I2C Slave 地址,读取 I2C数据并保存
配置 I2C Slave 地址,写入读到的 I2C数据
(可选) 通过逻辑分析仪抓取I2C数据观测
2 环境要求¶
PAN1080 EVB一块
Micro USB线一条(用于供电和查看串口打印Log)
(可选)Saleae16 Logic Analysis与配套软件
Logic 2.3.50
硬件接线:
使用USB线,将PC USB与EVB MicroUSB(USB->UART)相连
使用杜邦线将EVB上的:
Master P40接口与 Slave P40相连
Master P41接口与 Slave P41相连
(可选)Master P40 与 逻辑分析仪 SDA channel 相连,Master P41 与 逻辑分析仪 SCL channel 相连,并且EVB与Logic Analysis GND相连
PC软件: 串口调试助手(UartAssist)或终端工具(SecureCRT),波特率921600
3 编译和烧录¶
例程位置:zephyr\samples_panchip\driver\i2c\i2c_slave
目前可使用ZAL工具或quick build脚本进行编译和下载。
脚本位置:quick_build_samples\drivers\i2c_slave.bat
打开脚本后默认会编译项目,编译完成时,可输入字符进行后续下载等操作:
Input the keyword to continue:
'b' build 编译项目
'r' make clean and rebuild 重新编译项目
'f' flash download 下载
'e' erase chip 擦除芯片
'o' open project by VS Code 打开 `VS Code`,可查看源码,执行编译下载等
others exit 退出
wait input:
4 演示说明¶
连线
运行脚本quick_build_samples\i2c_slave.bat
,编译后进行烧录至 pan1080a_afld_evb
之后将master P40(I2C SDA)与slave端P40进行连接,master P41(I2C SCL)与slave端P41进行连接
有额外条件还可将P40,P41与逻辑分析仪2个channel进行连接,GND与逻辑分析仪GND连接后,开始抓数据
I2C Master |
I2C Slave |
Logic Analyzer |
---|---|---|
P40(I2C SDA) |
P40(I2C SDA) |
CH0 SDA |
P41(I2C SCL) |
P41(I2C SCL) |
CH1 SCL |
GND |
GND |
Sample执行流程:
配置I2C为Slave 模式,并配置标准速率模式
指定I2C Slave地址并读取16B数据
将读取到的16B数据保存打印,并通过I2C Write发送全部16B数据
进行I2C Slave的下载并复位,打开串口,之后进行I2C master的下载
观察读出的数据是否与master发送的数据一致
Slave端收转发,Master端发转收,完成I2C Master对I2C Slave的读写操作
打印slave收到的master写入数据
datas[0] = 0
datas[1] = 1
datas[2] = 2
datas[3] = 3
datas[4] = 4
datas[5] = 5
datas[6] = 6
datas[7] = 7
datas[8] = 8
datas[9] = 9
datas[10] = 10
datas[11] = 11
datas[12] = 12
datas[13] = 13
datas[14] = 14
datas[15] = 15
逻辑分析仪示例数据:抓取了从写开始到写到终止,到读开始到读终止
5 开发说明¶
5.2 I2C API¶
I2C使用包括:获取I2C设备;配置I2C基础模式;配置读/写进行通信操作
相关底层实现存在于zephyr\drivers\i2c\i2c_panchip.c
5.2.1 通过 label
获取 DTS I2C
¶
const struct device *i2c_dev = DEVICE_DT_GET(DT_NODELABEL(i2c0));
5.2.2 配置I2C速率与Slave模式¶
uint32_t i2c_cfg = I2C_SPEED_SET(I2C_SPEED_STANDARD)
i2c_configure(i2c_dev, i2c_cfg)
5.2.3 I2C Slave Addr Receive¶
i2c_read(i2c_dev, datas, 16, SLAVE_I2C_ADDR);
5.2.4 I2C Slave Addr Write¶
i2c_write(i2c_dev, datas, 16, SLAVE_I2C_ADDR);
5.3 补充说明¶
目前i2c可以演示i2c通信功能,但实际的i2c slave功能完整实现需要借助真实i2c slave设备,完善panchip作为i2c controller对i2c slave的控制。