跳转至

集成电路总线(IIC)


IIC概述

IIC总线是飞利浦半导体公司开发的,用于芯片之间连接的一种双线双向的串行总线。IIC总线由一根串行数据线(SDA)和一根串行时钟线(SCL)组成。允许多个Master 和多个Slave设备共享总线。任何时刻总线只能由一个主设备控制,当从设备空闲时总线启动数据传输。它包括总线冲突检查和仲裁机制,以保证当多个主机试图控制总线时,数据不会丢失。该总线特别适合于多个器件之间的短距离通信。I²C总线的标准速率为100kbit/s,快速模式为400kbit/s。


API

函数名 描述
i2c_init Master 模式初始化
i2c_slave_init Slave 模式初始化
i2c_io_init I/O 初始化
i2c_master_transfer 消息传输
i2c_master_send 发送数据
i2c_master_recv 接收数据


使用示例

 /**
  * @ 以slave设备es8388为例子列出接口,用户
  * @ 可根据需求定义函数名称、参数及内部操作。
  */
#include "ci110x_i2c.h"          /*包含I2C相关接口定义*/
#include "ci110x_system.h"       /*包含I2C寄存器、基地址相关定义*/
#include "platform_config.h"     /*包含引脚选择接口定义i2c_io_init*/
#include "string.h"              /*包含strcpy接口定义*/
#define ES8388_I2C_ADDR  0x10    /*SLAVE设备IIC总线地址*/

/**
  * @功能: es8388读单个字节
  * @参数: reg 寄存器地址
  * @返回值:读出来的值
  */
uint8_t es8388_read_data(uint8_t reg)      
{
    int8_t buf[2] = {0};                 
    struct i2c_client client = {0};      
    client.I2Cx = IIC1;                  
    client.addr = ES8388_I2C_ADDR;       
    strcpy(client.name,"es8388");      
    buf[0] = reg;                        
    i2c_master_recv(&client,buf,1,1);    /*调用i2c接口发送1字节寄存器,读出1字节数据*/
    return (uint8_t)buf[0];              
}

/**
  * @功能:es8388读单个字节
  * @参数:reg 寄存器地址
  * @     val 写进去的值
  */
int32_t es8388_write_data(uint8_t reg,uint8_t val)
{
    int8_t buf[2] = {0};
    struct i2c_client client = {0}; 
    client.I2Cx = IIC1;
    client.addr = ES8388_I2C_ADDR;
    strcpy(client.name,"es8388");
    buf[0] = reg;
    buf[1] = val;
    i2c_master_send(&client,buf,2);    /*发送1字节寄存器地址,发送1字节数据*/
    return 0;
}

void i2c_test()
{
    /*单字节值缓存*/
    uint8_t val;          

    /*I/O 引脚初始化,参数含义请查看platform_config.c中该接口注释*/
    i2c_io_init(I2C1_SCL_PAD,I2C1_SDA_PAD);
    i2c_init(IIC1,100,0X5FFFFF);

    /*寄存器地址:0x11*/
    /*写入的值:0x55*/
    val = es8388_read_data(0x11);
    es8388_write_data(0x11,0x55);
}

注意:更多示例可参考SDK下文件components\example\ci110x_i2c_test.c 。