2.4. I2C

Overview

提供 I2C 应用示例、配置介绍和常见问题。

2.4.1. 应用实例

示例演示:

  • 软件 I2C 读写数据

  • 硬件 I2C 读写数据

example: 具体示例代码详见 apps/common/example/peripheral/iic/main.c ,示例工程实现需在 apps/demo/demo_DevKitBoard/include/demo_config.h 中开启宏 USE_HW_I2C_TEST_DEMOUSE_SW_I2C_TEST_DEMO

2.4.2. 常见问题

  • 硬件 I2C 和软件 I2C 的如何配置驱动程序?

    答:① 硬件 I2C 在 board.c 中配置参数

    //1.添加头文件
    #include "device/iic.h"
    #include "asm/iic.h"
    
    //2.添加软件IIC硬件配配置信息
    HW_IIC0_PLATFORM_DATA_BEGIN(hw_iic1_data)
        .clk_pin = IO_PORTC_01,//clk
        .dat_pin = IO_PORTC_02,//sdat
        .baudrate = 2,//baudrate为lsb_clk时钟的分频系数,越小IIC时钟越快,IIC时钟=lsb_clk/((baudrate+1)*2) + 上拉电阻时间
    HW_IIC0_PLATFORM_DATA_END()
    
    //3.设备列表添加iic设备
    { "iic0",  &iic_dev_ops, (void *)&hw_iic1_data },
    

    ② 软件 I2C 在 board.c 中配置参数

    //1.添加头文件
    #include "device/iic.h"
    
    //2.添加软件IIC硬件配配置信息
    SW_IIC_PLATFORM_DATA_BEGIN(sw_iic0_data)
        .clk_pin = IO_PORTC_01,//clk
        .dat_pin = IO_PORTC_02,//sdat
        .sw_iic_delay = 50,//clk时钟周期(系统的nop时间个数)
    SW_IIC_PLATFORM_DATA_END()
    
    //3设备列表添加iic设备
    { "iic0",  &iic_dev_ops, (void *)&sw_iic0_data },
    
  • baudrate 值太大,则会引起 IIC 读写速度慢,需要留意该值配置。

  • 软件 IIC 可以指定任意引脚,但是硬件 IIC 只能跟随硬件 IO,硬件 IIC 的 IO 详情请查看对应封装的数据手册。

2.4.3. API参考

  • I2C 的 API 接口说明如下:

Functions

void *dev_open(const char *name, void *arg)

dev_open:用于打开一个设备

Parameters
  • name – 设备名称

  • arg – 控制参数,一般为NULL

int dev_read(void *device, void *buf, u32 len)

dev_read:用于设备数据的接收。

Parameters
  • device – 设备句柄

  • buf – 要读入的 buffer 缓冲区

  • len – 要读入的长度

int dev_write(void *device, void *buf, u32 len)

dev_write:用于设备数据的发送。

Parameters
  • device – 设备句柄

  • buf – 要写入的 buffer 缓冲区

  • len – 要写入的长度

int dev_ioctl(void *device, int cmd, u32 arg)

dev_ioctl:用于对设备进行控制和参数的修改

Parameters
  • device – 设备句柄

  • cmd – 设备控制命令

  • arg – 控制参数

int dev_close(void *device)

dev_close:用于关闭一个设备

Parameters

device – 设备句柄