龙空技术网

「正点原子Linux连载」第二十六章I2C实验(二)

正点原子日常 74

前言:

此刻我们对“试编写算法计算i2”大致比较珍视,看官们都需要学习一些“试编写算法计算i2”的相关知识。那么小编在网摘上收集了一些关于“试编写算法计算i2””的相关知识,希望兄弟们能喜欢,看官们一起来了解一下吧!

1)实验平台:正点原子Linux开发板

2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南》

关注官方微信号公众号,获取更多资料:正点原子

第16到22行定义了一些I2C状态相关的宏。第27到31行定义了一个枚举类型i2c_direction,此枚举类型用来表示I2C主机对从机的操作,也就是读数据还是写数据。第36到44行定义了一个结构体i2c_transfer,此结构体用于I2C的数据传输。剩下的就是一些函数声明了,总体来说bsp_i2c.h文件里面的内容还是很简单的。接下来在文件bsp_i2c.c里面输入如下内容:

示例代码26.3.2 bsp_i2c.c文件代码

/***************************************************************

Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.

文件名 : bsp_i2c.c

作者 : 左忠凯

版本 : V1.0

描述 : IIC驱动文件。

其他 : 无

论坛 :

日志 : 初版V1.0 2019/1/15 左忠凯创建

***************************************************************/

1 #include "bsp_i2c.h"

2 #include "bsp_delay.h"

3 #include "stdio.h"

4

5/*

6 * @description : 初始化I2C,波特率100KHZ

7 * @param – base : 要初始化的IIC设置

8 * @return : 无

9 */

10void i2c_init(I2C_Type *base)

11{

12/* 1、配置I2C */

13 base->I2CR &=~(1<<7);/* 要访问I2C的寄存器,首先需要先关闭I2C */

14

15/* 设置波特率为100K

16 * I2C的时钟源来源于IPG_CLK_ROOT=66Mhz

17 * IFDR设置为0X15,也就是640分频,

18 * 66000000/640=103.125KHz≈100KHz。

19 */

20 base->IFDR =0X15<<0;

21

22/* 设置寄存器I2CR,开启I2C */

23 base->I2CR |=(1<<7);

24}

25

26/*

27 * @description : 发送重新开始信号

28 * @param - base : 要使用的IIC

29 * @param - addrss : 设备地址

30 * @param - direction : 方向

31 * @return : 0 正常其他值出错

32 */

33unsignedchar i2c_master_repeated_start(I2C_Type *base,

unsignedchar address,

enum i2c_direction direction)

34{

35/* I2C忙并且工作在从模式,跳出 */

36if(base->I2SR &(1<<5)&&(((base->I2CR)&(1<<5))==0))

37return1;

38

39/*

40 * 设置寄存器I2CR

41 * bit[4]: 1 发送

42 * bit[2]: 1 产生重新开始信号

43 */

44 base->I2CR |=(1<<4)|(1<<2);

45

46/*

47 * 设置寄存器I2DR,bit[7:0] : 要发送的数据,这里写入从设备地址

48 */

49 base->I2DR =((unsignedint)address <<1)|

((direction == kI2C_Read)?1:0);

50return0;

51}

52

53/*

54 * @description : 发送开始信号

55 * @param - base : 要使用的IIC

56 * @param - addrss : 设备地址

57 * @param - direction : 方向

58 * @return : 0 正常其他值出错

59 */

60unsignedchar i2c_master_start(I2C_Type *base,

unsignedchar address,

enum i2c_direction direction)

61{

62if(base->I2SR &(1<<5))/* I2C忙 */

63return1;

64

65/*

66 * 设置寄存器I2CR

67 * bit[5]: 1 主模式

68 * bit[4]: 1 发送

69 */

70 base->I2CR |=(1<<5)|(1<<4);

71

72/*

73 * 设置寄存器I2DR,bit[7:0] : 要发送的数据,这里写入从设备地址

74 */

75 base->I2DR =((unsignedint)address <<1)|

((direction == kI2C_Read)?1:0);

76return0;

77}

78

79/*

80 * @description : 检查并清除错误

81 * @param - base : 要使用的IIC

82 * @param - status : 状态

83 * @return : 状态结果

84 */

85unsignedchar i2c_check_and_clear_error(I2C_Type *base,

unsignedint status)

86{

87if(status &(1<<4)) /* 检查是否发生仲裁丢失错误 */

88{

89 base->I2SR &=~(1<<4); /* 清除仲裁丢失错误位 */

90 base->I2CR &=~(1<<7); /* 先关闭I2C */

91 base->I2CR |=(1<<7); /* 重新打开I2C */

92return I2C_STATUS_ARBITRATIONLOST;

93}

94elseif(status &(1<<0)) /* 没有接收到从机的应答信号 */

95{

96return I2C_STATUS_NAK; /* 返回NAK(No acknowledge) */

97}

98return I2C_STATUS_OK;

99}

100

101/*

102 * @description : 停止信号

103 * @param - base : 要使用的IIC

104 * @param : 无

105 * @return : 状态结果

106 */

107unsignedchar i2c_master_stop(I2C_Type *base)

108{

109unsignedshort timeout =0XFFFF;

110

111/* 清除I2CR的bit[5:3]这三位 */

112 base->I2CR &=~((1<<5)|(1<<4)|(1<<3));

113while((base->I2SR &(1<<5))) /* 等待忙结束 */

114{

115 timeout--;

116if(timeout ==0) /* 超时跳出 */

117return I2C_STATUS_TIMEOUT;

118}

119return I2C_STATUS_OK;

120}

121

122/*

123 * @description : 发送数据

124 * @param - base : 要使用的IIC

125 * @param - buf : 要发送的数据

126 * @param - size : 要发送的数据大小

127 * @param - flags : 标志

128 * @return : 无

129 */

130void i2c_master_write(I2C_Type *base,constunsignedchar*buf,

unsignedint size)

131{

132while(!(base->I2SR &(1<<7))); /* 等待传输完成 */

133 base->I2SR &=~(1<<1); /* 清除标志位 */

134 base->I2CR |=1<<4; /* 发送数据 */

135while(size--)

136{

137 base->I2DR =*buf++;/* 将buf中的数据写入到I2DR寄存器 */

138while(!(base->I2SR &(1<<1))); /* 等待传输完成 */

139 base->I2SR &=~(1<<1); /* 清除标志位 */

140

141/* 检查ACK */

142if(i2c_check_and_clear_error(base, base->I2SR))

143break;

144}

145 base->I2SR &=~(1<<1);

146 i2c_master_stop(base); /* 发送停止信号 */

147}

148

149/*

150 * @description : 读取数据

151 * @param - base : 要使用的IIC

152 * @param - buf : 读取到数据

153 * @param - size : 要读取的数据大小

154 * @return : 无

155 */

156void i2c_master_read(I2C_Type *base,unsignedchar*buf,

unsignedint size)

157{

158volatileuint8_t dummy =0;

159

160 dummy++; /* 防止编译报错 */

161while(!(base->I2SR &(1<<7))); /* 等待传输完成 */

162 base->I2SR &=~(1<<1); /* 清除中断挂起位 */

163 base->I2CR &=~((1<<4)|(1<<3));/* 接收数据 */

164if(size ==1) /* 如果只接收一个字节数据的话发送NACK信号 */

165 base->I2CR |=(1<<3);

166

167 dummy = base->I2DR; /* 假读 */

168while(size--)

169{

170while(!(base->I2SR &(1<<1))); /* 等待传输完成 */

171 base->I2SR &=~(1<<1); /* 清除标志位 */

172

173if(size ==0)

174 i2c_master_stop(base); /* 发送停止信号 */

175if(size ==1)

176 base->I2CR |=(1<<3);

177*buf++= base->I2DR;

178}

179}

180

181/*

182 * @description : I2C数据传输,包括读和写

183 * @param – base : 要使用的IIC

184 * @param – xfer : 传输结构体

185 * @return : 传输结果,0 成功,其他值失败;

186 */

187unsignedchar i2c_master_transfer(I2C_Type *base,

struct i2c_transfer *xfer)

188{

189unsignedchar ret =0;

190enum i2c_direction direction = xfer->direction;

191

192 base->I2SR &=~((1<<1)|(1<<4)); /* 清除标志位 */

193while(!((base->I2SR >>7)&0X1)){}; /* 等待传输完成 */

194/* 如果是读的话,要先发送寄存器地址,所以要先将方向改为写 */

195if((xfer->subaddressSize >0)&&(xfer->direction ==

kI2C_Read))

196 direction = kI2C_Write;

197 ret = i2c_master_start(base, xfer->slaveAddress, direction);

198if(ret)

199return ret;

200while(!(base->I2SR &(1<<1))){}; /* 等待传输完成 */

201 ret = i2c_check_and_clear_error(base, base->I2SR);

202if(ret)

203{

204 i2c_master_stop(base); /* 发送出错,发送停止信号 */

205return ret;

206}

207

208/* 发送寄存器地址 */

209if(xfer->subaddressSize)

210{

211do

212{

213 base->I2SR &=~(1<<1); /* 清除标志位 */

214 xfer->subaddressSize--; /* 地址长度减一 */

215 base->I2DR =((xfer->subaddress)>>(8*

xfer->subaddressSize));

216while(!(base->I2SR &(1<<1))); /* 等待传输完成 */

217/* 检查是否有错误发生 */

218 ret = i2c_check_and_clear_error(base, base->I2SR);

219if(ret)

220{

221 i2c_master_stop(base); /* 发送停止信号 */

222return ret;

223}

224}while((xfer->subaddressSize >0)&&(ret ==

I2C_STATUS_OK));

225

226if(xfer->direction == kI2C_Read) /* 读取数据 */

227{

228 base->I2SR &=~(1<<1); /* 清除中断挂起位 */

229 i2c_master_repeated_start(base, xfer->slaveAddress,

kI2C_Read);

230while(!(base->I2SR &(1<<1))){}; /* 等待传输完成 */

231

232/* 检查是否有错误发生 */

233 ret = i2c_check_and_clear_error(base, base->I2SR);

234if(ret)

235{

236 ret = I2C_STATUS_ADDRNAK;

237 i2c_master_stop(base); /* 发送停止信号 */

238return ret;

239}

240}

241}

242

243/* 发送数据 */

244if((xfer->direction == kI2C_Write)&&(xfer->dataSize >0))

245 i2c_master_write(base, xfer->data, xfer->dataSize);

246/* 读取数据 */

247if((xfer->direction == kI2C_Read)&&(xfer->dataSize >0))

248 i2c_master_read(base, xfer->data, xfer->dataSize);

249return0;

250}

文件bsp_i2c.c中一共有8个函数,我们依次来看一下这些函数的功能,首先是函数i2c_init,此函数用来初始化I2C,重点是设置I2C的波特率,初始化完成以后开启I2C。第2个函数是i2c_master_repeated_start,此函数用来发送一个重复开始信号,发送开始信号的时候也会顺带发送从设备地址。第3个函数是i2c_master_start,此函数用于发送一个开始信号,发送开始信号的时候也顺带发送从设备地址。第4个函数是i2c_check_and_clear_error,此函数用于检查并清除错误。第5个函数是i2c_master_stop,用于产生一个停止信号。第6和第7个函数分别为i2c_master_write和i2c_master_read,这两个函数分别用于完成向I2C从设备写数据和从I2C从设备读数据。最后一个函数是i2c_master_transfer,此函数就是用户最终调用的,用于完成I2C通信的函数,此函数会使用前面的函数拼凑出I2C读/写时序。此函数就是按照26.1.1小节讲解的I2C读写时序来编写的。

I2C的操作函数已经准备好了,接下来就是使用前面编写I2C操作函数来配置AP3216C了,配置完成以后就可以读取AP3216C里面的传感器数据,在bsp_ap3216c.h输入如下所示内容:

示例代码26.3.3 bsp_ap3216c.h文件代码

1 #ifndef _BSP_AP3216C_H

2 #define _BSP_AP3216C_H

3/***************************************************************

4 Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.

5文件名 : bsp_ap3216c.h

6作者 : 左忠凯

7版本 : V1.0

8描述 : AP3216C驱动头文件。

9其他 : 无

10论坛 :

11日志 : 初版V1.0 2019/3/26 左忠凯创建

12 ***************************************************************/

13 #include "imx6ul.h"

14

15 #define AP3216C_ADDR 0X1E/* AP3216C器件地址 */

16

17/* AP3316C寄存器 */

18 #define AP3216C_SYSTEMCONG 0x00/* 配置寄存器 */

19 #define AP3216C_INTSTATUS 0X01/* 中断状态寄存器 */

20 #define AP3216C_INTCLEAR 0X02/* 中断清除寄存器 */

21 #define AP3216C_IRDATALOW 0x0A/* IR数据低字节 */

22 #define AP3216C_IRDATAHIGH 0x0B/* IR数据高字节 */

23 #define AP3216C_ALSDATALOW 0x0C/* ALS数据低字节 */

24 #define AP3216C_ALSDATAHIGH 0X0D/* ALS数据高字节 */

25 #define AP3216C_PSDATALOW 0X0E/* PS数据低字节 */

26 #define AP3216C_PSDATAHIGH 0X0F/* PS数据高字节 */

27

28/* 函数声明 */

29unsignedchar ap3216c_init(void);

30unsignedchar ap3216c_readonebyte(unsignedchar addr,

unsignedchar reg);

31unsignedchar ap3216c_writeonebyte(unsignedchar addr,

unsignedchar reg,

unsignedchar data);

32void ap3216c_readdata(unsignedshort*ir,unsignedshort*ps,

unsignedshort*als);

33

34 #endif

第45到26行定义了一些宏,分别为AP3216C的设备地址和寄存器地址,剩下的就是函数声明。接下来在bsp_ap3216c.c中输入如下所示内容:

示例代码26.3.4 bsp_ap3216c.c文件代码

/***************************************************************

Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.

文件名 : bsp_ap3216c.c

作者 : 左忠凯

版本 : V1.0

描述 : AP3216C驱动文件。

其他 : 无

论坛 :

日志 : 初版V1.0 2019/3/26 左忠凯创建

***************************************************************/

1 #include "bsp_ap3216c.h"

2 #include "bsp_i2c.h"

3 #include "bsp_delay.h"

4 #include "cc.h"

5 #include "stdio.h"

6

7/*

8 * @description : 初始化AP3216C

9 * @param : 无

10 * @return : 0 成功,其他值错误代码

11 */

12unsignedchar ap3216c_init(void)

13{

14unsignedchar data =0;

15

16/* 1、IO初始化,配置I2C IO属性

17 * I2C1_SCL -> UART4_TXD

18 * I2C1_SDA -> UART4_RXD

19 */

20 IOMUXC_SetPinMux(IOMUXC_UART4_TX_DATA_I2C1_SCL,1);

21 IOMUXC_SetPinMux(IOMUXC_UART4_RX_DATA_I2C1_SDA,1);

22 IOMUXC_SetPinConfig(IOMUXC_UART4_TX_DATA_I2C1_SCL,0x70B0);

23 IOMUXC_SetPinConfig(IOMUXC_UART4_RX_DATA_I2C1_SDA,0X70B0);

24

25/* 2、初始化I2C1 */

26 i2c_init(I2C1);

27

28/* 3、初始化AP3216C */

29 /* 复位AP3216C */

30 ap3216c_writeonebyte(AP3216C_ADDR, AP3216C_SYSTEMCONG,0X04);

31 delayms(50);/* AP33216C复位至少10ms */

32

33 /* 开启ALS、PS+IR */

34 ap3216c_writeonebyte(AP3216C_ADDR, AP3216C_SYSTEMCONG,0X03);

35

36 /* 读取刚刚写进去的0X03 */

37 data = ap3216c_readonebyte(AP3216C_ADDR, AP3216C_SYSTEMCONG);

38if(data ==0X03)

39return0;/* AP3216C正常 */

40else

41return1;/* AP3216C失败 */

42}

43

44/*

45 * @description : 向AP3216C写入数据

46 * @param – addr : 设备地址

47 * @param - reg : 要写入的寄存器

48 * @param – data : 要写入的数据

49 * @return : 操作结果

50 */

51unsignedchar ap3216c_writeonebyte(unsignedchar addr,

unsignedchar reg,

unsignedchar data)

52{

53unsignedchar status=0;

54unsignedchar writedata=data;

55struct i2c_transfer masterXfer;

56

57/* 配置I2C xfer结构体 */

58 masterXfer.slaveAddress = addr; /* 设备地址 */

59 masterXfer.direction = kI2C_Write; /* 写入数据 */

60 masterXfer.subaddress = reg; /* 要写入的寄存器地址 */

61 masterXfer.subaddressSize =1; /* 地址长度一个字节 */

62 masterXfer.data =&writedata; /* 要写入的数据 */

63 masterXfer.dataSize =1; /* 写入数据长度1个字节 */

64

65if(i2c_master_transfer(I2C1,&masterXfer))

66 status=1;

67

68return status;

69}

70

71/*

72 * @description : 从AP3216C读取一个字节的数据

73 * @param – addr : 设备地址

74 * @param - reg : 要读取的寄存器

75 * @return : 读取到的数据。

76 */

77unsignedchar ap3216c_readonebyte(unsignedchar addr,

unsignedchar reg)

78{

79unsignedchar val=0;

80

81struct i2c_transfer masterXfer;

82 masterXfer.slaveAddress = addr; /* 设备地址 */

83 masterXfer.direction = kI2C_Read; /* 读取数据 */

84 masterXfer.subaddress = reg; /* 要读取的寄存器地址 */

85 masterXfer.subaddressSize =1; /* 地址长度一个字节 */

86 masterXfer.data =&val; /* 接收数据缓冲区 */

87 masterXfer.dataSize =1; /* 读取数据长度1个字节 */

88 i2c_master_transfer(I2C1,&masterXfer);

89

90return val;

91}

92

93/*

94 * @description : 读取AP3216C的原始数据,包括ALS,PS和IR, 注意!如果

95 * :同时打开ALS,IR+PS两次数据读取的时间间隔要大于112.5ms

96 * @param - ir : ir数据

97 * @param - ps : ps数据

98 * @param - ps : als数据

99 * @return : 无。

100 */

101void ap3216c_readdata(unsignedshort*ir,unsignedshort*ps,unsignedshort*als)

102{

103unsignedchar buf[6];

104unsignedchar i;

105

106/* 循环读取所有传感器数据 */

107for(i =0; i <6; i++)

108{

109 buf[i]= ap3216c_readonebyte(AP3216C_ADDR,

AP3216C_IRDATALOW + i);

110}

111

112if(buf[0]&0X80) /* IR_OF位为1,则数据无效 */

113*ir =0;

114else /* 读取IR传感器的数据 */

115*ir =((unsignedshort)buf[1]<<2)|(buf[0]&0X03);

116

117*als =((unsignedshort)buf[3]<<8)| buf[2];/* 读取ALS数据 */

118

119if(buf[4]&0x40) /* IR_OF位为1,则数据无效 */

120*ps =0;

121else /* 读取PS传感器的数据 */

122*ps =((unsignedshort)(buf[5]&0X3F)<<4)|

(buf[4]&0X0F);

123}

文件bsp_ap3216c.c里面共有4个函数,第1个函数是ap3216c_init,顾名思义,此函数用于初始化AP3216C,初始化成功的话返回0,如果初始化失败就返回其他值。此函数先初始化所使用到的IO,比如初始化I2C1的相关IO,并设置其复用为I2C1。然后此函数会调用i2c_init来初始化I2C1,最后初始化AP3216C。第2个和第3个函数分别为ap3216c_writeonebyte和ap3216c_readonebyte,这两个函数分别是向AP3216C写入数据和从AP3216C读取数据。这两个函数都通过调用bsp_i2c.c中的函数i2c_master_transfer来完成对AP3216C的读写。最后一个函数就是ap3216c_readdata,此函数用于读取AP3216C中的ALS、PS和IR传感器数据。

最后在main.c中输入如下代码:

示例代码26.3.5 main.c文件代码

/**************************************************************

Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.

文件名 : mian.c

作者 : 左忠凯

版本 : V1.0

描述 : I.MX6U开发板裸机实验18 IIC实验

其他 : IIC是最常用的接口,ALPHA开发板上有多个IIC外设,本实验就

来学习如何驱动I.MX6U的IIC接口,并且通过IIC接口读取板载

AP3216C的数据值。

论坛 :

日志 : 初版V1.0 2019/1/15 左忠凯创建

**************************************************************/

1 #include "bsp_clk.h"

2 #include "bsp_delay.h"

3 #include "bsp_led.h"

4 #include "bsp_beep.h"

5 #include "bsp_key.h"

6 #include "bsp_int.h"

7 #include "bsp_uart.h"

8 #include "bsp_lcd.h"

9 #include "bsp_rtc.h"

10 #include "bsp_ap3216c.h"

11 #include "stdio.h"

12

13/*

14 * @description : main函数

15 * @param : 无

16 * @return : 无

17 */

18int main(void)

19{

20 unsignedshort ir, als, ps;

21 unsignedchar state = OFF;

22

23 int_init(); /* 初始化中断(一定要最先调用!) */

24 imx6u_clkinit(); /* 初始化系统时钟 */

25 delay_init(); /* 初始化延时 */

26 clk_enable(); /* 使能所有的时钟 */

27 led_init(); /* 初始化led */

28 beep_init(); /* 初始化beep */

29 uart_init(); /* 初始化串口,波特率115200 */

30 lcd_init(); /* 初始化LCD */

31

32 tftlcd_dev.forecolor = LCD_RED;

33 lcd_show_string(30,50,200,16,16,

(char*)"ALPHA-IMX6U IIC TEST");

34 lcd_show_string(30,70,200,16,16,(char*)"AP3216C TEST");

35 lcd_show_string(30,90,200,16,16,(char*)"ATOM@ALIENTEK");

36 lcd_show_string(30,110,200,16,16,(char*)"2019/3/26");

37

38 while(ap3216c_init()) /* 检测不到AP3216C */

39 {

40 lcd_show_string(30,130,200,16,16,

(char*)"AP3216C Check Failed!");

41 delayms(500);

42 lcd_show_string(30,130,200,16,16,

(char*)"Please Check! ");

43 delayms(500);

44 }

45

46 lcd_show_string(30,130,200,16,16,(char*)"AP3216C Ready!");

47 lcd_show_string(30,160,200,16,16,(char*)" IR:");

48 lcd_show_string(30,180,200,16,16,(char*)" PS:");

49 lcd_show_string(30,200,200,16,16,(char*)"ALS:");

50 tftlcd_dev.forecolor = LCD_BLUE;

51 while(1)

52 {

53 ap3216c_readdata(&ir,&ps,&als); /* 读取数据 */

54 lcd_shownum(30+32,160, ir,5,16); /* 显示IR数据 */

55 lcd_shownum(30+32,180, ps,5,16); /* 显示PS数据 */

56 lcd_shownum(30+32,200, als,5,16); /* 显示ALS数据 */

57 delayms(120);

58 state =!state;

59 led_switch(LED0,state);

60 }

61 return0;

62}

第38行调用ap3216c_init来初始化AP3216C,如果AP3216C初始化失败的话就会进入循环,会在LCD上不断的闪烁字符串“AP3216C Check Failed!”和“Please Check!”,直到AP3216C初始化成功。

第53行调用函数ap3216c_readdata来获取AP3216C的ALS、PS和IR传感器数据值,获取完成以后就会在LCD上显示出来。

文件main.c里面的内容总体上还是很简单的,实验程序的编写就到这里。

26.4编译下载验证26.4.1 编写Makefile和链接脚本

修改Makefile中的TARGET为ap3216c,然后在在INCDIRS和SRCDIRS中加入“bsp/i2c”和“bsp/ap3216c”,修改后的Makefile如下:

示例代码26.4.1.1 Makefile文件代码

1 CROSS_COMPILE ?= arm-linux-gnueabihf-

2 TARGET ?=ap3216c

3

4/* 省略掉其它代码...... */

5

6 INCDIRS := imx6ul \

7 stdio/include \

8 bsp/clk \

9 bsp/led \

10 bsp/delay \

11 bsp/beep \

12 bsp/gpio \

13 bsp/key \

14 bsp/exit \

15 bsp/int \

16 bsp/epittimer \

17 bsp/keyfilter \

18 bsp/uart \

19 bsp/lcd \

20 bsp/rtc \

21 bsp/i2c \

22 bsp/ap3216c

23

24 SRCDIRS := project \

25 stdio/lib \

26 bsp/clk \

27 bsp/led \

28 bsp/delay \

29 bsp/beep \

30 bsp/gpio \

31 bsp/key \

32 bsp/exit \

33 bsp/int \

34 bsp/epittimer \

35 bsp/keyfilter \

36 bsp/uart \

37 bsp/lcd \

38 bsp/rtc \

39 bsp/i2c \

40 bsp/ap3216c

41

42/* 省略掉其它代码...... */

43

44 clean:

45 rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS)$(SOBJS)

第2行修改变量TARGET为“ap3216c”,也就是目标名称为“ap3216c”。

第21和22行在变量INCDIRS中添加I2C和AP3216C的驱动头文件(.h)路径。

第39和40行在变量SRCDIRS中添加I2C和AP3216C驱动文件(.c)路径。

链接脚本保持不变。

26.4.2编译下载

使用Make命令编译代码,编译成功以后使用软件imxdownload将编译完成的ap3216c.bin文件下载到SD卡中,命令如下:

chmod 777 imxdownload //给予imxdownload可执行权限,一次即可

./imxdownload ap3216c.bin /dev/sdd //烧写到SD卡中

烧写成功以后将SD卡插到开发板的SD卡槽中,然后复位开发板。程序运行以后LCD界面如图26.4.2.1所示:

图26.4.2.1 LCD显示界面

图26.4.2.1中显示出了AP3216C的三个传感器的数据,大家可以用手遮住或者靠近AP3216C,LCD上的三个数据就会变化。

标签: #试编写算法计算i2