• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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