1# I2C概述 2 3## 简介 4 5- I2C\(Inter Integrated Circuit\)总线是由Philips公司开发的一种简单、双向二线制同步串行总线。 6- I2C以主从方式工作,通常有一个主设备和一个或者多个从设备,主从设备通过SDA\(SerialData\)串行数据线以及SCL\(SerialClock\)串行时钟线两根线相连。 7- I2C数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。数据传输以字节为单位,高位在前,逐个bit进行传输。 8- I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址,当主设备需要和某一个从设备通信时,通过广播的方式,将从设备地址写到总线上,如果某个从设备符合此地址,将会发出应答信号,建立传输。 9- I2C接口定义了完成I2C传输的通用方法集合,包括: 10 11 - I2C控制器管理: 打开或关闭I2C控制器 12 - I2C消息传输:通过消息传输结构体数组进行自定义传输 13 14## 接口说明 15 16### 包含头文件: 17 18```c 19#include "lz_hardware.h" 20``` 21 22#### 1. I2C驱动IO管脚配置: 23 24```C 25I2cBusIo g_i2c0m0 = { 26 .scl = {.gpio = GPIO0_PB5, .func = MUX_FUNC4, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = GPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP}, 27 .sda = {.gpio = GPIO0_PB4, .func = MUX_FUNC4, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = GPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP}, 28 .id = FUNC_ID_I2C0, 29 .mode = FUNC_MODE_M0, 30}; 31``` 32 33#### 2. I2C驱动IO管脚初始化接口 34 35```c 36unsigned int I2cIoInit(I2cBusIo io); 371) 参数说明: 38 io: io引脚相关配置 392) 返回值: 40 成功返回LZ_HARDWARE_SUCCESS, 出错返回错误码 41``` 42 43#### 3.I2C设备初始化接口: 44 45```c 46unsigned int LzI2cInit(unsigned int id, unsigned int freq); 471) 参数说明: 48 id: i2c总线id 49 freq:i2c频率 502) 返回值: 51 成功返回LZ_HARDWARE_SUCCESS, 出错返回错误码 52``` 53 54#### 4.I2C设备释放接口: 55 56```c 57unsigned int LzI2cDeinit(unsigned int id); 581) 参数说明: 59 id: i2c总线id 602) 返回值: 61 成功返回LZ_HARDWARE_SUCCESS, 出错返回错误码 62``` 63 64#### 5.I2C设备设置频率: 65 66```c 67unsigned int LzI2cSetFreq(unsigned int id, unsigned int freq); 681) 参数说明: 69 id: i2c总线id 70 freq:i2c频率 712) 返回值: 72 成功返回LZ_HARDWARE_SUCCESS, 出错返回错误码 73``` 74 75#### 6.I2C设备Transfer接口: 76 77```c 78unsigned int LzI2cTransfer(unsigned id, LzI2cMsg *msgs, unsigned int num); 791) 参数说明: 80 id: i2c总线id 81 msgs:需要转发给从设备的消息 82 num: 消息数量 832) 返回值: 84 成功返回LZ_HARDWARE_SUCCESS, 出错返回错误码 85``` 86 87#### 7.I2C设备读接口: 88 89```c 90static inline unsigned int LzI2cRead(unsigned int id, unsigned short slaveAddr, unsigned char *data, unsigned int len); 911) 参数说明: 92 id: i2c总线id 93 slaveAddr:从机地址 94 data: 需要读取的消息 95 len: 读取消息长度 962) 返回值: 97 成功返回LZ_HARDWARE_SUCCESS, 出错返回错误码 98``` 99 100#### 8.I2C设备写接口: 101 102```c 103static inline unsigned int LzI2cWrite(unsigned int id, unsigned short slaveAddr, const unsigned char *data, unsigned int len) 1041) 参数说明: 105 id: i2c总线id 106 slaveAddr:从机地址 107 data: 需要写入的消息 108 len: 写入消息长度 1092) 返回值: 110 成功返回LZ_HARDWARE_SUCCESS, 出错返回错误码 111``` 112 113#### 9.I2C设备读寄存器接口: 114 115```c 116static inline unsigned int LzI2cReadReg(unsigned int id, unsigned short slaveAddr, 117 unsigned char *regAddr, unsigned int regLen, 118 unsigned char *data, unsigned int len) 1191) 参数说明: 120 id: i2c总线id 121 slaveAddr:从机地址 122 regAddr: 从机寄存器地址 123 regLen: 从机寄存器地址长度 124 data: 需要写入的消息 125 len: 写入消息长度 1262) 返回值: 127 成功返回LZ_HARDWARE_SUCCESS, 出错返回错误码 128``` 129 130#### 10.I2C设备写寄存器接口: 131 132```c 133static inline unsigned int LzI2cWriteReg(unsigned int id, unsigned short slaveAddr, 134 unsigned char *regAddr, unsigned int regLen, 135 unsigned char *data, unsigned int len) 1361) 参数说明: 137 id: i2c总线id 138 slaveAddr:从机地址 139 regAddr: 从机寄存器地址 140 regLen: 从机寄存器地址长度 141 data: 需要写入的消息 142 len: 写入消息长度 1432) 返回值: 144 成功返回LZ_HARDWARE_SUCCESS, 出错返回错误码 145``` 146 147## 使用实例 148 149```c 150#include "lz_hardware.h" 151 152#定义从机地址 153#define ATH20_ADDR 0x38 154#define I2C1_BUS 1 155 156#io管脚配置 157I2cBusIo g_i2c1m2 = { 158 .scl = {.gpio = GPIO0_PA3, .func = MUX_FUNC3, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = GPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP}, 159 .sda = {.gpio = GPIO0_PA2, .func = MUX_FUNC3, .type = PULL_NONE, .drv = DRIVE_KEEP, .dir = GPIO_DIR_KEEP, .val = LZGPIO_LEVEL_KEEP}, 160 .id = FUNC_ID_I2C1, 161 .mode = FUNC_MODE_M2, 162}; 163 164unsigned int g_i2c1_freq = 400000; 165 166unsigned int i2c_sample() 167{ 168 uint32_t ret = LZ_HARDWARE_SUCCESS; 169 uint8_t buff[6]; 170 int32_t len = 6; 171 #初始化I2C 172 if (I2cIoInit(g_i2c1m2) != LZ_HARDWARE_SUCCESS) 173 return LZ_HARDWARE_FAILURE; 174 if (LzI2cInit(I2C1, g_i2c1_freq) != LZ_HARDWARE_SUCCESS) 175 return LZ_HARDWARE_FAILURE; 176 177 #i2c写数据示例 178 len = 6; 179 buff[0] = 0xAC; 180 buff[1] = 0x33; 181 buff[2] = 0x00; 182 len = 3; 183 ret = LzI2cWrite(I2C1_BUS, ATH20_ADDR, buff, len); 184 if (ret < 0) 185 { 186 return LZ_HARDWARE_FAILURE; 187 } 188 189 # 190 ToyUdelay(75); 191 192 len = 0; 193 ret = LzI2cWrite(I2C1_BUS, ATH20_ADDR, buff, len); 194 if (ret < 0) 195 { 196 return LZ_HARDWARE_FAILURE; 197 } 198 199 #i2c读取数据示例 200 buff[0] = 0x00; 201 buff[1] = 0x00; 202 buff[2] = 0x00; 203 len = 6; 204 ret = LzI2cRead(I2C1_BUS, ATH20_ADDR, buff, len); 205 if (ret < 0) 206 { 207 LZ_HARDWARE_LOGE(LOG_FACTORY,"read error:%d",ret); 208 return LZ_HARDWARE_FAILURE; 209 } 210 211 return LZ_HARDWARE_SUCCESS; 212} 213``` 214