当前文档版本为 v0.4.1,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

Driver: I2C Master

1 功能概述

i2c_master sample演示了Zephyr I2C Driver在PAN1080 SoC上的使用方法,主要包括:

  • I2C Master 配置

  • 按照地址 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 P01接口与 Slave P01相连

      • Master P00接口与 Slave P00相连

      • (可选)Master P01 与 逻辑分析仪 SDA channel 相连,Master P00 与 逻辑分析仪 SCL channel 相连,并且EVB与Logic Analysis GND相连

  • PC软件: 串口调试助手(UartAssist)或终端工具(SecureCRT),波特率921600

3 编译和烧录

例程位置:zephyr\samples_panchip\driver\i2c\i2c_master

目前可使用ZAL工具或quick build脚本进行编译和下载。

脚本位置:quick_build_samples\drivers\i2c_master.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_master.bat,编译后进行烧录至 pan1080a_afld_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
  • 逻辑分析仪示例数据:抓取了从写开始到写到终止,到读开始到读终止

    image

    I2C读写波形1

    image

    I2C读写波形2

    image

    I2C读写波形3

5 开发说明

5.1 I2C Kconfig

使用I2C时,需要使能I2C指定宏

CONFIG_I2C=y

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速率与Master模式

uint32_t i2c_cfg = I2C_SPEED_SET(I2C_SPEED_STANDARD) | I2C_MODE_MASTER
i2c_configure(i2c_dev, i2c_cfg)

5.2.3 I2C Master Write to I2C Slave Addr

i2c_write(i2c_dev, datas, 16, TAR_I2C_ADDR);

5.2.4 I2C Master Read to I2C Slave Addr

i2c_read(i2c_dev, cmp_data, 16, TAR_I2C_ADDR);