1.5. IIC

硬件iic/软件模拟iic主机接口,可以选择任意io,硬件iic频率不精确,受通信速度和上拉电阻影响略有偏差,软件iic频率不准。

软件硬件iic选择:(c文件中添加如下代码)

#if 1 //0:软件iic,  1:硬件iic
#define _IIC_USE_HW
#endif
#include "iic_api.h"

1.5.1. 示例

详见文件 iic_master_demo.c
        iic_eeprom_test.c

1.5.2. 硬件/软件iic设备交互接口

1.5.2.1. i2c_master_read_nbytes_from_device

硬件/软件iic从指定设备获取指定长度的数据(该类接口是对以下基本接口的封装)。

原型:

int i2c_master_read_nbytes_from_device(iic_dev iic,   //iic索引
        unsigned char dev_addr, //设备地址 //无设备寄存器地址
        unsigned char *read_buf, int read_len);//缓存buf, 长度
参数:

iic

硬件/软件iic索引号0~n

dev_addr

指定设备地址

read_buf

接收缓存buf

read_len

接收长度

返回值

接收的数据长度:=read_len:成功;其他值:失败

1.5.2.2. i2c_master_read_nbytes_from_device_reg

硬件/软件iic从指定设备的某个寄存器地址获取指定长度的数据(该类接口是对以下基本接口的封装)。

原型:

int i2c_master_read_nbytes_from_device_reg(iic_dev iic,
        unsigned char dev_addr, //设备地址
        unsigned char *reg_addr, unsigned char reg_len,//设备寄存器地址,长度
        unsigned char *read_buf, int read_len);//缓存buf,长度
参数:

iic

硬件/软件iic索引号0~n

dev_addr

指定设备地址

reg_addr

设备的寄存器地址

reg_len

寄存器长度

read_buf

接收缓存buf

read_len

接收长度

返回值

接收的数据长度:=read_len:成功;其他值:失败

1.5.2.3. i2c_master_write_nbytes_to_device

硬件/软件iic将指定长度的数据发送到指定设备(该类接口是对以下基本接口的封装)。

原型:

int i2c_master_write_nbytes_to_device(iic_dev iic,
        unsigned char dev_addr, //设备地址 //无设备寄存器地址
        unsigned char *write_buf, int write_len); //数据buf, 长度
参数:

iic

硬件/软件iic索引号0~n

dev_addr

指定设备地址

write_buf

发送缓存buf

write_len

发送长度

返回值

发送的数据长度:=write_len:成功;其他值:失败

1.5.2.4. i2c_master_write_nbytes_to_device_reg

硬件/软件iic将指定长度的数据发送到指定设备的某个寄存器地址(该类接口是对以下基本接口的封装)。

原型:

int i2c_master_write_nbytes_to_device_reg(iic_dev iic,
        unsigned char dev_addr, //设备地址
        unsigned char *reg_addr, unsigned char reg_len,//设备寄存器地址,长度
        unsigned char *write_buf, int write_len);//数据buf, 长度
参数:

iic

硬件/软件iic索引号0~n

dev_addr

指定设备地址

reg_addr

设备的寄存器地址

reg_len

寄存器长度

write_buf

发送缓存buf

write_len

发送长度

返回值

发送的数据长度:=write_len:成功;其他值:失败

1.5.3. 硬件/软件iic基本接口

1.5.3.1. get_iic_config

为兼容旧接口新增,功能:获取硬件/软件iic配置结构体。

原型:

struct iic_master_config *get_iic_config(iic_dev iic);
参数:

iic

硬件/软件iic索引号0~n

返回值

硬件/软件iic配置信息

1.5.3.2. iic_init

初始化硬件/软件iic。

原型:

//iic_index:硬件/软件iic索引号
enum iic_state_enum iic_init(iic_dev iic, struct iic_master_config *i2c_config);
参数:

iic

硬件/软件iic索引号0~n

i2c_config

硬件/软件iic配置信息

返回值

返回执行状态,详见枚举enum iic_state_enum

示例:

struct iic_master_config iic_config_test = {
    .role = IIC_MASTER,
    .scl_io = IIC_SCL_IO,
    .sda_io = IIC_SDA_IO,
    .io_mode = PORT_INPUT_PULLUP_10K,//上拉或浮空(外接上拉)
    .hdrive = PORT_DRIVE_STRENGT_2p4mA,   //enum GPIO_HDRIVE 0:2.4MA, 1:8MA, 2:26.4MA, 3:40MA
    .master_frequency = 100000, //硬件/软件iic频率不准(hz)
    .io_filter = 1,  //硬件/软件无效
};
enum iic_state_enum iic_init_state = iic_init(0, &iic_config_test);
if (iic_init_state == IIC_OK) {
    log_info("iic master init ok");
} else {
    log_error("iic master init fail");
}

1.5.3.3. iic_uninit

关闭硬件/软件iic,释放io为高阻状态。

原型:

enum iic_state_enum iic_uninit(iic_dev iic);
参数:

iic

硬件/软件iic索引号0~n

返回值

返回执行状态,详见枚举enum iic_state_enum

示例:

enum iic_state_enum iic_init_state = iic_uninit(0);
if (iic_init_state == IIC_OK) {
    log_info("iic master uninit ok");
} else {
    log_error("iic master uninit fail");
}

1.5.3.4. iic_suspend

挂起硬件/软件iic,释放io为高阻状态。

原型:

enum iic_state_enum iic_suspend(iic_dev iic);
参数:

iic

硬件/软件iic索引号0~n

返回值

返回执行状态,详见枚举enum iic_state_enum

1.5.3.5. iic_resume

恢复硬件/软件iic,还原io状态到初始化状态。

原型:

enum iic_state_enum iic_resume(iic_dev iic);
参数:

iic

硬件/软件iic索引号0~n

返回值

返回执行状态,详见枚举enum iic_state_enum

1.5.3.6. iic_check_busy

检查指定索引号的硬件/软件iic是否繁忙,空闲方可通信。

原型:

enum iic_state_enum iic_check_busy(iic_dev iic);
参数:

iic

硬件/软件iic索引号0~n

返回值

返回执行状态,详见枚举enum iic_state_enum

1.5.3.7. iic_start

硬件/软件iic发送起始位。

原型:

void iic_start(iic_dev iic);
参数:

iic

硬件/软件iic索引号0~n

返回值

1.5.3.8. iic_stop

硬件/软件iic发送结束位。

原型:

void iic_stop(iic_dev iic);
参数:

iic

硬件/软件iic索引号0~n

返回值

1.5.3.9. iic_tx_byte

硬件/软件iic发送一个byte数据,返回应答状态。

原型:

u8 iic_tx_byte(iic_dev iic, u8 byte);
参数:

iic

硬件/软件iic索引号0~n

byte

待发送的数据

返回值

1:有应答,0:无应答

1.5.3.10. iic_rx_byte

硬件/软件iic接收一个byte数据。

原型:

u8 iic_rx_byte(iic_dev iic, u8 ack);
参数:

iic

硬件/软件iic索引号0~n

ack

1:收到数据后回应答,0:收到数据后不回应答

返回值

接收的数据

1.5.3.11. iic_read_buf

硬件/软件iic接收指定长度的数据。

原型:

int iic_read_buf(iic_dev iic, void *buf, int len);
参数:

iic

硬件/软件iic索引号0~n

buf

接收缓存buf

len

接收长度

返回值

接收的数据长度:=len:成功;其他值:失败

1.5.3.12. iic_write_buf

硬件/软件iic发送指定长度的数据。

原型:

int iic_write_buf(iic_dev iic, const void *buf, int len);
参数:

iic

硬件/软件iic索引号0~n

buf

发送缓存buf

len

发送长度

返回值

发送的数据长度:=len:成功;其他值:失败

1.5.4. 硬件iic从机接口

  1. 硬件iic从机轮询模式设备交互接口

  2. 硬件iic从机基本接口