介绍关于I2C初始化、各类模式下收发数据、关闭等功能所调用的一些抽象函数。

API列表

函数名称 功能描述
hal_i2c_init 初始化指定I2C端口
hal_i2c_master_send master模式下从指定的I2C端口发送数据
hal_i2c_master_recv master模式下从指定的I2C端口接收数据
hal_i2c_slave_send slave模式下从指定的I2C端口发送数据
hal_i2c_slave_recv slave模式下从指定的I2C端口接收数据
hal_i2c_mem_write mem模式下从指定的I2C端口发送数据
hal_i2c_mem_read mem模式下从指定的I2C端口接收数据
hal_i2c_finalize 关闭指定I2C端口

hal_i2c_init

定义描述
定义 描述
函数原型 int32_t hal_i2c_init(i2c_dev_t *i2c)
描述 初始化指定I2C端口
参数 i2c:I2C设备描述,定义需要初始化的I2C参数
返回值 返回成功或失败,返回0表示I2C初始化成功,非0表示失败

调用示例

具体请参见使用示例

hal_i2c_master_send

定义描述
定义 描述
函数原型 int32_t hal_i2c_master_send(i2c_dev_t *i2c, uint16_t dev_addr, const uint8_t *data, uint16_t size, uint32_t timeout)
描述 master模式下从指定的I2C端口发送数据
参数
  • i2c:I2C设备描述
  • dev_addr:目标设备地址
  • data:指向发送缓冲区的数据指针
  • size:要发送的数据字节数
  • timeout:超时时间(单位ms),如果希望一直等待设置为HAL_WAIT_FOREVER
返回值 返回成功或失败,返回0表示成功发送size个数据,非0表示失败

调用示例

具体请参见使用示例

hal_i2c_master_recv

定义描述
定义 描述
函数原型 int32_t hal_i2c_master_recv(i2c_dev_t *i2c, uint16_t dev_addr, uint8_t *data, uint16_t size, uint32_t timeout)
描述 master模式下从指定的I2C端口接收数据
参数
  • i2c:I2C设备描述
  • dev_addr:目标设备地址
  • data:指向接收缓冲区的数据指针
  • size:期望接收的数据字节数
  • timeout:超时时间(单位ms),如果希望一直等待设置为HAL_WAIT_FOREVER
返回值 返回成功或失败,返回0表示成功接收size个数据,非0表示失败

调用示例

具体请参见使用示例

hal_i2c_slave_send

定义描述
定义 描述
函数原型 int32_t hal_i2c_slave_send(i2c_dev_t *i2c, const uint8_t *data, uint16_t size, uint32_t timeout)
描述 slave模式下从指定的I2C端口发送数据
参数
  • i2c:I2C设备描述
  • data:指向发送缓冲区的数据指针
  • size:期望发送的数据字节数
  • timeout:超时时间(单位ms),如果希望一直等待设置为HAL_WAIT_FOREVER
返回值 返回成功或失败,返回0表示成功发送size个数据,非0表示失败

调用示例

具体请参见使用示例

hal_i2c_slave_recv

定义描述
定义 描述
函数原型 int32_t hal_i2c_slave_recv(i2c_dev_t *i2c, uint8_t *data, uint16_t size, uint32_t timeout)
描述 slave模式下从指定的I2C端口接收数据
参数
  • i2c:I2C设备描述
  • data:指向要接收数据的数据指针
  • size:要接收的数据字节数
  • timeout:超时时间(单位ms),如果希望一直等待设置为HAL_WAIT_FOREVER
返回值 返回成功或失败,返回0表示成功接收size个数据,非0表示失败

调用示例

具体请参见使用示例

hal_i2c_mem_write

定义描述
定义 描述
函数原型 int32_t hal_i2c_mem_write(i2c_dev_t *i2c, uint16_t dev_addr, uint16_t mem_addr, uint16_t mem_addr_size, const uint8_t *data, uint16_t size, uint32_t timeout)
描述 mem模式下从指定的I2C端口发送数据
参数
  • i2c:I2C设备描述
  • dev_addr:目标设备地址
  • mem_addr:内部内存地址
  • mem_addr_size:内部内存地址大小
  • data:指向要发送数据的数据指针
  • size:要发送的数据字节数
  • timeout:超时时间(单位ms),如果希望一直等待设置为HAL_WAIT_FOREVER
返回值 返回成功或失败,返回0表示成功发送size个数据,非0表示失败

调用示例

具体请参见使用示例

hal_i2c_mem_read

定义描述
定义 描述
函数原型 int32_t hal_i2c_mem_read(i2c_dev_t *i2c, uint16_t dev_addr, uint16_t mem_addr, uint16_t mem_addr_size, uint8_t *data, uint16_t size, uint32_t timeout)
描述 mem模式下从指定的I2C端口接收数据
参数
  • i2c:I2C设备描述
  • dev_addr:目标设备地址
  • mem_addr:内部内存地址
  • mem_addr_size:内部内存地址大小
  • data:指向接收缓冲区的数据指针
  • size:要接收的数据字节数
  • timeout:超时时间(单位ms),如果希望一直等待设置为HAL_WAIT_FOREVER
返回值 返回成功或失败,返回0表示成功接收size个数据,非0表示失败

调用示例

具体请参见使用示例

hal_i2c_finalize

定义描述
定义 描述
函数原型 int32_t hal_i2c_finalize(i2c_dev_t *i2c)
描述 关闭指定I2C端口
参数 i2c:I2C设备描述
返回值 类型:int 返回成功或失败,返回0表示I2C关闭成功,非0表示失败

调用示例

具体请参见使用示例

相关宏定义

#define I2C_MODE_MASTER 1 /* i2c communication is master mode */
#define I2C_MODE_SLAVE  2 /* i2c communication is slave mode */

#define I2C_MEM_ADDR_SIZE_8BIT  1 /* i2c menory address size 8bit */
#define I2C_MEM_ADDR_SIZE_16BIT 2 /* i2c menory address size 16bit */

/*
 * Specifies one of the standard I2C bus bit rates for I2C communication
 */
#define I2C_BUS_BIT_RATES_100K  100000
#define I2C_BUS_BIT_RATES_400K  400000
#define I2C_BUS_BIT_RATES_3400K 3400000

#define I2C_HAL_ADDRESS_WIDTH_7BIT  0
#define I2C_HAL_ADDRESS_WIDTH_10BIT 1

i2c_dev_t数据结构

typedef struct {
    uint8_t      port;   /* i2c port */
    i2c_config_t config; /* i2c config */
    void        *priv;   /* priv data */
} i2c_dev_t;

i2c_config_t数据结构

typedef struct {
    uint32_t address_width;
    uint32_t freq;
    uint8_t  mode;
    uint16_t dev_addr;
} i2c_config_t;

使用示例

#include <aos/hal/i2c.h>

#define I2C1_PORT_NUM  1
#define I2C_BUF_SIZE   10
#define I2C_TX_TIMEOUT 10
#define I2C_RX_TIMEOUT 10

#define I2C_DEV_ADDR       0x30f
#define I2C_DEV_ADDR_WIDTH 8

/* define dev */
i2c_dev_t i2c1;

/* data buffer */
char i2c_data_buf[I2C_BUF_SIZE];

int application_start(int argc, char *argv[])
{
    int count   = 0;
    int ret     = -1;
    int i       = 0;
    int rx_size = 0;

    /* i2c port set */
    i2c1.port = I2C1_PORT_NUM;

    /* i2c attr config */
    i2c1.config.mode          = I2C_MODE_MASTER;
    i2c1.config.freq          = 300000;
    i2c1.config.address_width = I2C_DEV_ADDR_WIDTH;
    i2c1.config.dev_addr      = I2C_DEV_ADDR;

    /* init i2c1 with the given settings */
    ret = hal_i2c_init(&i2c1);
    if (ret != 0) {
        printf("i2c1 init error !\n");
        return -1;
    }

    /* init the tx buffer */
    for (i = 0; i < I2C_BUF_SIZE; i++) {
        i2c_data_buf[i] = i + 1;
    }

    /* send 1,2,3,4,5,6,7,8,9,10 by i2c1 */
    ret = hal_i2c_master_send(&i2c1, I2C_DEV_ADDR, i2c_data_buf,
                              I2C_BUF_SIZE, I2C_TX_TIMEOUT);
    if (ret == 0) {
        printf("i2c1 data send succeed !\n");
    }

    ret = hal_i2c_master_recv(&i2c1, I2C_DEV_ADDR, i2c_data_buf,
                              I2C_BUF_SIZE, I2C_RX_TIMEOUT);
    if (ret == 0) {
        printf("i2c1 data received succeed !\n");
    }

    while(1) {
        printf("AliOS Things is working !\n");

        /* sleep 1000ms */
        aos_msleep(1000);
    };
}
说明
  • port为逻辑端口号,其与物理端口号的对应关系见具体的对接实现。
  • 移植前,请新建hal_i2c_xxmcu.chal_i2c_xxmcu.h的文件,并将这两个文件放到platform/mcu/xxmcu/hal目录下。在hal_i2c_xxmcu.c中实现所需要的hal函数,hal_i2c_xxmcu.h中放置相关宏定义。具体请参见platform/mcu/stm32l4xx_cube/hal/hal_i2c_stm32l4.c