spi收发时的寄存器sr不变_「正点原子Linux连载」第二十七章SPI实验(二)

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

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

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

adde29486193d4da4f14d9f623acc243.png

文件bsp_spi.c中有两个函数:spi_init和spich0_readwrite_byte,函数spi_init是SPI初始化函数,此函数会初始化SPI的时钟,通道等。函数spich0_readwrite_byte是SPI收发函数,通过此函数即可完成SPI的全双工数据收发。

接下来在文件bsp_icm20608.h中输入如下内容:

示例代码27.3.3 bsp_icm20608.h文件代码

1 #ifndef _BSP_ICM20608_H

2 #define _BSP_ICM20608_H

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

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

5 文件名 : bsp_icm20608.h

6 作者 : 左忠凯

7 版本 : V1.0

8 描述 : ICM20608驱动文件。

9 其他 : 无

10 论坛 : www.openedv.com

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

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

13 #include "imx6ul.h"

14 #include "bsp_gpio.h"

15

16/* SPI片选信号 */

17 #define ICM20608_CSN(n)(n ? gpio_pinwrite(GPIO1,20,1):

gpio_pinwrite(GPIO1,20,0))

18

19 #define ICM20608G_ID 0XAF/* ID值 */

20 #define ICM20608D_ID 0XAE/* ID值 */

21

22/* ICM20608寄存器

23 *复位后所有寄存器地址都为0,除了

24 *Register 107(0X6B) Power Management 1 = 0x40

25 *Register 117(0X75) WHO_AM_I = 0xAF或者0xAE

26 */

27/* 陀螺仪和加速度自测(出产时设置,用于与用户的自检输出值比较) */

28 #define ICM20_SELF_TEST_X_GYRO 0x00

29 #define ICM20_SELF_TEST_Y_GYRO 0x01

30 #define ICM20_SELF_TEST_Z_GYRO 0x02

31 #define ICM20_SELF_TEST_X_ACCEL 0x0D

32 #define ICM20_SELF_TEST_Y_ACCEL 0x0E

33 #define ICM20_SELF_TEST_Z_ACCEL 0x0F

34/***********省略掉其他宏定义*************/

35 #define ICM20_ZA_OFFSET_H 0x7D

36 #define ICM20_ZA_OFFSET_L 0x7E

37

38/*

39 * ICM20608结构体

40 */

41struct icm20608_dev_struc

42{

43 signedint gyro_x_adc; /* 陀螺仪X轴原始值 */

44 signedint gyro_y_adc; /* 陀螺仪Y轴原始值 */

45 signedint gyro_z_adc; /* 陀螺仪Z轴原始值 */

46 signedint accel_x_adc; /* 加速度计X轴原始值 */

47 signedint accel_y_adc; /* 加速度计Y轴原始值 */

48 signedint accel_z_adc; /* 加速度计Z轴原始值 */

49 signedint temp_adc; /* 温度原始值 */

50

51 /* 下面是计算得到的实际值,扩大100倍 */

52 signedint gyro_x_act; /* 陀螺仪X轴实际值 */

53 signedint gyro_y_act; /* 陀螺仪Y轴实际值 */

54 signedint gyro_z_act; /* 陀螺仪Z轴实际值 */

55 signedint accel_x_act; /* 加速度计X轴实际值 */

56 signedint accel_y_act; /* 加速度计Y轴实际值 */

57 signedint accel_z_act; /* 加速度计Z轴实际值 */

58 signedint temp_act; /* 温度实际值 */

59};

60

61struct icm20608_dev_struc icm20608_dev;/* icm20608设备 */

62

63/* 函数声明 */

64unsignedchar icm20608_init(void);

65void icm20608_write_reg(unsignedchar reg,unsignedchar value);

66unsignedchar icm20608_read_reg(unsignedchar reg);

67void icm20608_read_len(unsignedchar reg,unsignedchar*buf,

unsignedchar len);

68void icm20608_getdata(void);

69 #endif

文件bsp_icm20608.h里面先定义了一个宏ICM20608_CSN,这个是ICM20608的SPI片选引脚。接下来定义了一些ICM20608的ID和寄存器地址。第41行定义了一个结构体icm20608_dev_struc,这个结构体是ICM20608的设备结构体,里面的成员变量用来保存ICM20608的原始数据值和经过转换得到的实际值。实际值是有小数的,本章例程取两位小数,为了方便计算,实际值扩大了100倍,这样实际值就是整数了,但是在使用的时候要除100重新得到小数部分。最后就是一些函数声明,接下来在文件bsp_icm20608.c中输入如下所示内容:

示例代码27.3.4 bsp_icm20608.c文件代码

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

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

文件名 : bsp_icm20608.c

作者 : 左忠凯

版本 : V1.0

描述 : ICM20608驱动文件。

其他 : 无

论坛 : www.openedv.com

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

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

1 #include "bsp_icm20608.h"

2 #include "bsp_delay.h"

3 #include "bsp_spi.h"

4 #include "stdio.h"

5

6struct icm20608_dev_struc icm20608_dev;/* icm20608设备 */

7

8/*

9 * @description : 初始化ICM20608

10 * @param : 无

11 * @return : 0 初始化成功,其他值初始化失败

12 */

13unsignedchar icm20608_init(void)

14{

15unsignedchar regvalue;

16 gpio_pin_config_t cs_config;

17

18/* 1、ESPI3 IO初始化

19 * ECSPI3_SCLK -> UART2_RXD

20 * ECSPI3_MISO -> UART2_RTS

21 * ECSPI3_MOSI -> UART2_CTS

22 */

23 IOMUXC_SetPinMux(IOMUXC_UART2_RX_DATA_ECSPI3_SCLK,0);

24 IOMUXC_SetPinMux(IOMUXC_UART2_CTS_B_ECSPI3_MOSI,0);

25 IOMUXC_SetPinMux(IOMUXC_UART2_RTS_B_ECSPI3_MISO,0);

26 IOMUXC_SetPinConfig(IOMUXC_UART2_RX_DATA_ECSPI3_SCLK,0x10B1);

27 IOMUXC_SetPinConfig(IOMUXC_UART2_CTS_B_ECSPI3_MOSI,0x10B1);

28 IOMUXC_SetPinConfig(IOMUXC_UART2_RTS_B_ECSPI3_MISO,0x10B1);

29

30/* 初始化片选引脚 */

31 IOMUXC_SetPinMux(IOMUXC_UART2_TX_DATA_GPIO1_IO20,0);

32 IOMUXC_SetPinConfig(IOMUXC_UART2_TX_DATA_GPIO1_IO20,0X10B0);

33 cs_config.direction = kGPIO_DigitalOutput;

34 cs_config.outputLogic =0;

35 gpio_init(GPIO1,20,&cs_config);

36

37/* 2、初始化SPI */

38 spi_init(ECSPI3);

39

40 icm20608_write_reg(ICM20_PWR_MGMT_1,0x80);/* 复位 */

41 delayms(50);

42 icm20608_write_reg(ICM20_PWR_MGMT_1,0x01);/* 关闭睡眠 */

43 delayms(50);

44

45 regvalue = icm20608_read_reg(ICM20_WHO_AM_I);

46 printf("icm20608 id = %#X", regvalue);

47if(regvalue != ICM20608G_ID && regvalue != ICM20608D_ID)

48return1;

49

50 icm20608_write_reg(ICM20_SMPLRT_DIV,0x00); /* 输出速率设置 */

51 icm20608_write_reg(ICM20_GYRO_CONFIG,0x18);/* 陀螺仪±2000dps */

52 icm20608_write_reg(ICM20_ACCEL_CONFIG,0x18);/* 加速度计±16G */

53 icm20608_write_reg(ICM20_CONFIG,0x04);/* 陀螺BW=20Hz */

54 icm20608_write_reg(ICM20_ACCEL_CONFIG2,0x04);

55 icm20608_write_reg(ICM20_PWR_MGMT_2,0x00);/* 打开所有轴 */

56 icm20608_write_reg(ICM20_LP_MODE_CFG,0x00);/* 关闭低功耗 */

57 icm20608_write_reg(ICM20_FIFO_EN,0x00); /* 关闭FIFO */

58return0;

59}

60

61/*

62 * @description : 写ICM20608指定寄存器

63 * @param - reg : 要读取的寄存器地址

64 * @param – value : 要写入的值

65 * @return : 无

66 */

67void icm20608_write_reg(unsignedchar reg,unsignedchar value)

68{

69/* ICM20608在使用SPI接口的时候寄存器地址只有低7位有效,

70 * 寄存器地址最高位是读/写标志位,读的时候要为1,写的时候要为0。

71 */

72 reg &=~0X80;

73

74 ICM20608_CSN(0); /* 使能SPI传输 */

75 spich0_readwrite_byte(ECSPI3, reg); /* 发送寄存器地址 */

76 spich0_readwrite_byte(ECSPI3, value); /* 发送要写入的值 */

77 ICM20608_CSN(1); /* 禁止SPI传输 */

78}

79

80/*

81 * @description : 读取ICM20608寄存器值

82 * @param - reg : 要读取的寄存器地址

83 * @return : 读取到的寄存器值

84 */

85unsignedchar icm20608_read_reg(unsignedchar reg)

86{

87unsignedchar reg_val;

88

89/* ICM20608在使用SPI接口的时候寄存器地址只有低7位有效,

90 * 寄存器地址最高位是读/写标志位,读的时候要为1,写的时候要为0。

91 */

92 reg |=0x80;

93

94 ICM20608_CSN(0); /* 使能SPI传输 */

95 spich0_readwrite_byte(ECSPI3, reg); /* 发送寄存器地址 */

96 reg_val = spich0_readwrite_byte(ECSPI3,0XFF);/* 读取寄存器的值*/

97 ICM20608_CSN(1); /* 禁止SPI传输 */

98return(reg_val); /* 返回读取到的寄存器值 */

99}

100

101/*

102 * @description : 读取ICM20608连续多个寄存器

103 * @param - reg : 要读取的寄存器地址

104 * @return : 读取到的寄存器值

105 */

106void icm20608_read_len(unsignedchar reg,unsignedchar*buf,

unsignedchar len)

107{

108unsignedchar i;

109

110/* ICM20608在使用SPI接口的时候寄存器地址,只有低7位有效,

111 * 寄存器地址最高位是读/写标志位读的时候要为1,写的时候要为0。

112 */

113 reg |=0x80;

114

115 ICM20608_CSN(0);/* 使能SPI传输 */

116 spich0_readwrite_byte(ECSPI3, reg);/* 发送寄存器地址 */

117for(i =0; i < len; i++)/* 顺序读取寄存器的值 */

118{

119 buf[i]= spich0_readwrite_byte(ECSPI3,0XFF);

120}

121 ICM20608_CSN(1);/* 禁止SPI传输 */

122}

123

124/*

125 * @description : 获取陀螺仪的分辨率

126 * @param : 无

127 * @return : 获取到的分辨率

128 */

129float icm20608_gyro_scaleget(void)

130{

131unsignedchar data;

132float gyroscale;

133

134 data =(icm20608_read_reg(ICM20_GYRO_CONFIG)>>3)&0X3;

135switch(data){

136case0:

137 gyroscale =131;

138break;

139case1:

140 gyroscale =65.5;

141break;

142case2:

143 gyroscale =32.8;

144break;

145case3:

146 gyroscale =16.4;

147break;

148}

149return gyroscale;

150}

151

152/*

153 * @description : 获取加速度计的分辨率

154 * @param : 无

155 * @return : 获取到的分辨率

156 */

157unsignedshort icm20608_accel_scaleget(void)

158{

159unsignedchar data;

160unsignedshort accelscale;

161

162 data =(icm20608_read_reg(ICM20_ACCEL_CONFIG)>>3)&0X3;

163switch(data){

164case0:

165 accelscale =16384;

166break;

167case1:

168 accelscale =8192;

169break;

170case2:

171 accelscale =4096;

172break;

173case3:

174 accelscale =2048;

175break;

176}

177return accelscale;

178}

179

180/*

181 * @description : 读取ICM20608的加速度、陀螺仪和温度原始值

182 * @param : 无

183 * @return : 无

184 */

185void icm20608_getdata(void)

186{

187float gyroscale;

188unsignedshort accescale;

189unsignedchar data[14];

190

191 icm20608_read_len(ICM20_ACCEL_XOUT_H, data,14);

192

193 gyroscale = icm20608_gyro_scaleget();

194 accescale = icm20608_accel_scaleget();

195

196 icm20608_dev.accel_x_adc =(signedshort)((data[0]<<8)|

data[1]);

197 icm20608_dev.accel_y_adc =(signedshort)((data[2]<<8)|

data[3]);

198 icm20608_dev.accel_z_adc =(signedshort)((data[4]<<8)|

data[5]);

199 icm20608_dev.temp_adc =(signedshort)((data[6]<<8)|

data[7]);

200 icm20608_dev.gyro_x_adc =(signedshort)((data[8]<<8)|

data[9]);

201 icm20608_dev.gyro_y_adc =(signedshort)((data[10]<<8)|

data[11]);

202 icm20608_dev.gyro_z_adc =(signedshort)((data[12]<<8)|

data[13]);

203

204/* 计算实际值 */

205 icm20608_dev.gyro_x_act =((float)(icm20608_dev.gyro_x_adc)/

gyroscale)*100;

206 icm20608_dev.gyro_y_act =((float)(icm20608_dev.gyro_y_adc)/

gyroscale)*100;

207 icm20608_dev.gyro_z_act =((float)(icm20608_dev.gyro_z_adc)/

gyroscale)*100;

208 icm20608_dev.accel_x_act =((float)(icm20608_dev.accel_x_adc)/

accescale)*100;

209 icm20608_dev.accel_y_act =((float)(icm20608_dev.accel_y_adc)/

accescale)*100;

210 icm20608_dev.accel_z_act =((float)(icm20608_dev.accel_z_adc)/

accescale)*100;

211 icm20608_dev.temp_act =(((float)(icm20608_dev.temp_adc)-25)/

326.8+25)*100;

212}

文件bsp_imc20608.c是ICM20608的驱动文件,里面有7个函数,我们依次来看一下。第1个函数是icm20608_init,这个是ICM20608的初始化函数,此函数先初始化ICM20608所使用的SPI引脚,将其复用为ECSPI3。因为我们本章的SPI片选采用软件控制的方式,所以SPI片选引脚设置成了普通的输出模式。设置完SPI所使用的引脚以后就是调用函数spi_init来初始化SPI3,最后初始化ICM20608,就是配置ICM20608的寄存器。第2个和第3个函数分别是icm20608_write_reg和icm20608_read_reg,这两个函数分别用于写/读ICM20608的指定寄存器。第4个函数是icm20608_read_len,此函数也是读取ICM20608的寄存器值,但是此函数可以读取连续多个寄存器的值,一般用于读取ICM20608传感器数据。第5和第6个函数分别是icm20608_gyro_scaleget和icm20608_accel_scaleget,这两个函数分别用于获取陀螺仪和加速度计的分辨率,因为陀螺仪和加速度的测量范围设置的不同,其分辨率就不同,所以在计算实际值的时候要根据实际的量程范围来得到对应的分辨率。最后一个函数是icm20608_getdata,此函数就是用于获取ICM20608的加速度计、陀螺仪和温度计的数据,并且会根据设置的测量范围计算出实际的值,比如加速度的g值、陀螺仪的角速度值和温度计的温度值。

最后在main.c中输入如下内容:

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

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

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

文件名 : mian.c

作者 : 左忠凯

版本 : V1.0

描述 : I.MX6U开发板裸机实验19 SPI实验

其他 : SPI也是最常用的接口,ALPHA开发板上有一个6轴传感器ICM20608,

这个六轴传感器就是SPI接口的,本实验就来学习如何驱动I.MX6U

的SPI接口,并且通过SPI接口读取ICM20608的数据值。

论坛 : www.openedv.com

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

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

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_icm20608.h"

11 #include "bsp_spi.h"

12 #include "stdio.h"

13

14/*

15 * @description : 指定的位置显示整数数据

16 * @param - x : X轴位置

17 * @param - y : Y轴位置

18 * @param – size : 字体大小

19 * @param - num : 要显示的数据

20 * @return : 无

21 */

22void integer_display(unsignedshort x,unsignedshort y,

unsignedchar size,signedint num)

23{

24char buf[200];

25

26 lcd_fill(x, y, x +50, y + size, tftlcd_dev.backcolor);

27

28 memset(buf,0,sizeof(buf));

29if(num <0)

30 sprintf(buf,"-%d",-num);

31else

32 sprintf(buf,"%d", num);

33 lcd_show_string(x, y,50, size, size, buf);

34}

35

36/*

37 * @description : 指定的位置显示小数数据,比如5123,显示为51.23

38 * @param - x : X轴位置

39 * @param - y : Y轴位置

40 * @param – size : 字体大小

41 * @param - num : 要显示的数据,实际小数扩大100倍,

42 * @return : 无

43 */

44void decimals_display(unsignedshort x,unsignedshort y,

unsignedchar size,signedint num)

45{

46signedint integ;/* 整数部分 */

47signedint fract;/* 小数部分 */

48signedint uncomptemp = num;

49char buf[200];

50

51if(num <0)

52 uncomptemp =-uncomptemp;

53 integ = uncomptemp /100;

54 fract = uncomptemp %100;

55

56 memset(buf,0,sizeof(buf));

57if(num <0)

58 sprintf(buf,"-%d.%d", integ, fract);

59else

60 sprintf(buf,"%d.%d", integ, fract);

61 lcd_fill(x, y, x +60, y + size, tftlcd_dev.backcolor);

62 lcd_show_string(x, y,60, size, size, buf);

63}

64

65/*

66 * @description : 使能I.MX6U的硬件NEON和FPU

67 * @param : 无

68 * @return : 无

69 */

70void imx6ul_hardfpu_enable(void)

71{

72uint32_t cpacr;

73uint32_t fpexc;

74

75/* 使能NEON和FPU */

76 cpacr = __get_CPACR();

77 cpacr =(cpacr &~(CPACR_ASEDIS_Msk | CPACR_D32DIS_Msk))

78|(3UL<< CPACR_cp10_Pos)|(3UL<< CPACR_cp11_Pos);

79 __set_CPACR(cpacr);

80 fpexc = __get_FPEXC();

81 fpexc |=0x40000000UL;

82 __set_FPEXC(fpexc);

83}

84

85/*

86 * @description : main函数

87 * @param : 无

88 * @return : 无

89 */

90int main(void)

91{

92unsignedchar state = OFF;

93

94 imx6ul_hardfpu_enable(); /* 使能I.MX6U的硬件浮点 */

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

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

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

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

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

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

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

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

103

104 tftlcd_dev.forecolor = LCD_RED;

105 lcd_show_string(50,10,400,24,24,

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

106 lcd_show_string(50,40,200,16,16,(char*)"ICM20608 TEST");

107 lcd_show_string(50,60,200,16,16,(char*)"ATOM@ALIENTEK");

108 lcd_show_string(50,80,200,16,16,(char*)"2019/3/27");

109

110while(icm20608_init()) /* 初始化ICM20608 */

111{

112 lcd_show_string(50,100,200,16,16,

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

113 delayms(500);

114 lcd_show_string(50,100,200,16,16,

(char*)"Please Check! ");

115 delayms(500);

116}

117 lcd_show_string(50,100,200,16,16,(char*)"ICM20608 Ready");

118 lcd_show_string(50,130,200,16,16,(char*)"accel x:");

119 lcd_show_string(50,150,200,16,16,(char*)"accel y:");

120 lcd_show_string(50,170,200,16,16,(char*)"accel z:");

121 lcd_show_string(50,190,200,16,16,(char*)"gyro x:");

122 lcd_show_string(50,210,200,16,16,(char*)"gyro y:");

123 lcd_show_string(50,230,200,16,16,(char*)"gyro z:");

124 lcd_show_string(50,250,200,16,16,(char*)"temp :");

125 lcd_show_string(50+181,130,200,16,16,(char*)"g");

126 lcd_show_string(50+181,150,200,16,16,(char*)"g");

127 lcd_show_string(50+181,170,200,16,16,(char*)"g");

128 lcd_show_string(50+181,190,200,16,16,(char*)"o/s");

129 lcd_show_string(50+181,210,200,16,16,(char*)"o/s");

130 lcd_show_string(50+181,230,200,16,16,(char*)"o/s");

131 lcd_show_string(50+181,250,200,16,16,(char*)"C");

132

133 tftlcd_dev.forecolor = LCD_BLUE;

134

135while(1)

136{

137 icm20608_getdata();/* 获取数据值 */

138/* 在LCD上显示原始值 */

139 integer_display(50+70,130,16, icm20608_dev.accel_x_adc);

140 integer_display(50+70,150,16, icm20608_dev.accel_y_adc);

141 integer_display(50+70,170,16, icm20608_dev.accel_z_adc);

142 integer_display(50+70,190,16, icm20608_dev.gyro_x_adc);

143 integer_display(50+70,210,16, icm20608_dev.gyro_y_adc);

144 integer_display(50+70,230,16, icm20608_dev.gyro_z_adc);

145 integer_display(50+70,250,16, icm20608_dev.temp_adc);

146

147/* 在LCD上显示计算得到的原始值 */

148 decimals_display(50+70+50,130,16,

icm20608_dev.accel_x_act);

149 decimals_display(50+70+50,150,16,

icm20608_dev.accel_y_act);

150 decimals_display(50+70+50,170,16,

icm20608_dev.accel_z_act);

151 decimals_display(50+70+50,190,16,

icm20608_dev.gyro_x_act);

152 decimals_display(50+70+50,210,16,

icm20608_dev.gyro_y_act);

153 decimals_display(50+70+50,230,16,

icm20608_dev.gyro_z_act);

154 decimals_display(50+70+50,250,16,

icm20608_dev.temp_act);

155 delayms(120);

156 state =!state;

157 led_switch(LED0,state);

158}

159return0;

160}

文件main.c一开始有两个函数integer_display和decimals_display,这两个函数用于在LCD上显示获取到的ICM20608数据值,函数integer_display用于显示原始数据值,也就是整数值。函数decimals_display用于显示实际值,实际值扩大了100倍,此函数会提取出实际值的整数部分和小数部分并显示在LCD上。另一个重要的函数是imx6ul_hardfpu_enable,这个函数用于开启I.MX6U的NEON和硬件FPU(浮点运算单元),因为本章使用到了浮点运算,而I.MX6U的Cortex-A7是支持NEON和FPU(VFPV4_D32)的,但是在使用I.MX6U的硬件FPU之前是先要开启的。

第110行调用了函数icm20608_init来初始化ICM20608,如果初始化失败的话就会在LCD上闪烁提示语句。最后在main函数的while循环中不断的调用函数icm20608_getdata获取ICM20608的传感器数据,并且显示在LCD上。实验程序编写就到这里结束了,接下来就是编译、下载和验证了。

27.4编译下载验证

27.4.1 编写Makefile和链接脚本

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

示例代码27.4.1.1 Makefile文件代码

1 CROSS_COMPILE ?= arm-linux-gnueabihf-

2 TARGET ?= icm20608

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 bsp/spi

24 bsp/icm20608

25

26 SRCDIRS := project

27 stdio/lib

28 bsp/clk

29 bsp/led

30 bsp/delay

31 bsp/beep

32 bsp/gpio

33 bsp/key

34 bsp/exit

35 bsp/int

36 bsp/epittimer

37 bsp/keyfilter

38 bsp/uart

39 bsp/lcd

40 bsp/rtc

41 bsp/i2c

42 bsp/ap3216c

43 bsp/spi

44 bsp/icm20608

45

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

47

48$(COBJS): obj/%.o : %.c

49 $(CC) -Wall -march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -Wa,

-mimplicit-it=thumb -nostdlib -fno-builtin

-c -O2 $(INCLUDE) -o $@ $<

50

51 clean:

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

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

第23和24行在变量INCDIRS中添加SPI和ICM20608的驱动头文件(.h)路径。

第43和44行在变量SRCDIRS中添加SPI和ICM20608驱动文件(.c)路径。

第49行加入了“-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard”指令,这些指令用于指定编译浮点运算的时候使用硬件FPU。因为本章使用到了浮点运算,而I.MX6U是支持硬件FPU的,虽然我们在main函数中已经打开了NEON和FPU,但是在编译相应C文件的时候也要指定使用硬件FPU来编译浮点运算。

链接脚本保持不变。

27.4.2编译下载

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

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

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

烧写成功以后将SD卡插到开发板的SD卡槽中,然后复位开发板。如果ICM20608工作正常的话就会在LCD上显示获取到的传感器数据,如图27.4.2.1所示:

68300db44212ea4087f2c02977219836.png

图27.4.2.1LCD界面

在图27.4.2.1中可以看到加速度计Z轴在静止状态下是0.98g,这不正是重力加速度。温度传感器测量到的温度是31.39°C,这个是芯片内部的温度,并不是室温!芯片内部温度一般要比室温高。如果动一下开发板的话加速度计和陀螺仪的数据就会变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[JSOI2018]潜入行动

题解 一道思路不难但是写起来很麻烦的树形背包 我们发现每个节点有很多信息需要保留 所以就暴力的设\(f[u][j][0/1][0/1]\)表示点u的子树分配了j个监察器,点u有没有被控制,点u放没放监察器 然后就分四种情况暴力讨论就好了 注意背包的时候要卡常数 代码 #include<cstdio>…

css。元素样式、边框样式

1.外边距  margin 缩写形式&#xff1a; margin&#xff1a;上边距  右边距  下边距  左边距 margin&#xff1a;上下边距  左右边距 margin&#xff1a;上边距  左右边距  下边距 2.内边距  padding 缩写形式&#xff1a; padding&#xff1a;上边距  右边距…

C# 动态创建数据库三(MySQL)

前面有说明使用EF动态新建数据库与表&#xff0c;数据库使用的是SQL SERVER2008的&#xff0c;在使用MYSQL的时候还是有所不同 一、添加 EntityFramework.dll &#xff0c;System.Data.Entity.dll &#xff0c;MySql.Data, MySql.Data.Entity.EF6 注意&#xff1a;Entity Frame…

如何用计算机管理员权限,教你电脑使用代码添加管理员权限的详细教程

我们在使用电脑运行某些软件的时候&#xff0c;可能需要用到管理员权限才能运行&#xff0c;通常来说直接点击右键就会有管理员权限&#xff0c;但最近有用户向小编反馈&#xff0c;在需要管理员权限的软件上点击右键没有看到管理员取得所有权&#xff0c;那么究竟该如何才能获…

activiti 5.22的demo运行

activiti 5.22的demo运行 从github上clon下来的activiti项目,运行demo项目activiti-webapp-explorer2时&#xff0c;在使用到流程设计工作区&#xff0c;选取activiti modeler作为设计器的时候报错。 从下面的报错信息中发现&#xff0c;请求路径http://localhost:8080/activit…

内是不是半包围结构_轻钢别墅的体系结构

一、轻钢别墅介绍1、轻钢别墅的屋面系统轻钢别墅屋面系统是由屋架、结构OSB面板、防水层、轻型屋面瓦&#xff08;金属或沥青瓦&#xff09;组成的。轻钢结构的屋面&#xff0c;外观可以有多种组合。材料也有多种。在保障了防水这一技术的前提下&#xff0c;外观有了许多的选择…

hive 去重 字符串_hive函数

Hive是建立在 Hadoop 上的数据仓库基础架构,定义了简单的类 SQL 查询语言(HQL)函数分类&#xff1a;简单内置函数&#xff1a;数学函数&#xff0c;字符函数&#xff0c;日期函数&#xff0c;条件函数&#xff0c;聚合函数。高级内置函数&#xff1a;行列转换函数&#xff0c;分…

【Python3爬虫】为什么你的博客没人看呢?

我相信对于很多爱好和习惯写博客的人来说&#xff0c;如果自己的博客有很多人阅读和评论的话&#xff0c;自己会非常开心&#xff0c;但是你发现自己用心写的博客却没什么人看&#xff0c;多多少少会觉得有些伤心吧&#xff1f;我们今天就来看一下为什么你的博客没人看呢&#…

泰安高考2021成绩查询,泰安高考成绩查询入口2021

高考结束之后&#xff0c;为了方便大家进行高考成绩的查询&#xff0c;下面跟着出国留学网小编来一起看看“泰安高考成绩查询入口2021”&#xff0c;仅供参考&#xff0c;希望对大家有帮助。2021山东高考成绩查询时间及志愿填报时间根据山东2021年夏季高考须知&#xff0c;2021…

用GitHub Issue取代多说,是不是很厉害?

2019独角兽企业重金招聘Python工程师标准>>> 摘要: 别了&#xff0c;多说&#xff0c;拥抱Gitment。 2017年6月1日&#xff0c;多说正式下线&#xff0c;这多少让人感觉有些遗憾。在比较了多个博客评论系统&#xff0c;我最终选择了Gitment作为本站的博客评论系统&a…

【动态规划】Vijos P1313 金明的预算方案(NOIP2006提高组第二题)

题目链接&#xff1a; https://vijos.org/p/1313 题目大意&#xff1a; m(m<32000)金钱&#xff0c;n&#xff08;n<60&#xff09;个物品&#xff0c;花费vi&#xff0c;价值vi*ci,每个物品可能有不超过2个附件&#xff0c;附件没有附件。 题目思路&#xff1a; 【动态规…

计算机网络应用答题卡,2013-2014学年第2学期11级计算机网络技术毕业考试试卷

2013-2014学年第2学期11级《计算机网络技术》课程毕业考试试卷得分&#xff1a;一、单项选择题&#xff1a;(每题1分&#xff0c;共30分&#xff0c;答案必须写在后面的选择题答题卡内&#xff0c;否则不得分)1、计算机网络可以按网络的覆盖范围来划分&#xff0c;以下()不是按…

为什么那些每三年跳一次槽的人越跳越好? - 震撼

现在&#xff0c;人们已经放下了对跳槽的偏见。这是一件好事。之前。假设你每几年换一次工作&#xff0c;人们会认为你的简历上有 “污点”。面试官会认为你无法胜任一份工作。与同事相处不好。或者你对公司不忠诚&#xff0c;不能承担任务&#xff0c;等等。 这样的想法非常快…

矢量合成和分解的法则_专题14 运动的合成与分解

运动的合成与分解【基础回顾】 考点内容:运动的合成与分解 考纲解读: 1.掌握曲线运动的概念、特点及条件. 2.掌握运动的合成与分解法则&#xff0e; 考点一 物体做曲线运动的条件及轨迹分析 1&#xff0e;条件  (1)因为速度时刻在变&#xff0c;所以一定存在加速度&#xff1…

Java Persistence with MyBatis 小结2

MyBatis 最关键的组成部分是 SqlSessionFactory&#xff0c;我们可以从中获取 SqlSession&#xff0c;并执行映射的 SQL 语句。SqlSessionFactory 对象可以通过基于 XML 的配置信息或者 Java API 创建。 1 mybatis环境&#xff0c;environments 配置默认的数据库环境 MyBatis 支…

c#时分秒毫秒微妙_你真的清楚DateTime in C#吗?

DateTime&#xff0c;就是一个世界的大融合。日期和时间&#xff0c;在我们开发中非常重要。DateTime在C#中&#xff0c;专门用来表达和处理日期和时间。本文算是多年使用DateTime的一个总结&#xff0c;包括DateTime对象的整体应用&#xff0c;以及如何处理不同的区域、时区、…

解决Eclipse的Team菜单中没有SVN选项的问题

刚开始自己拿一个项目&#xff0c;手练一下发觉在Eclipse的Team找不到SVN仓库&#xff0c;看了一下才发觉使用SVN向SVN服务器上传代码&#xff0c;但Eclipse默认情况下却没有SVN选项&#xff0c;刚开始也是这样的 默认只有GIT&#xff0c;如下图所示 想要解决这些问题&#xff…

怎么用计算机怎么截屏,电脑怎么截图 这几个方法操作简便且实用

在日常的生活当中我们在使用电脑的时候经常会碰一些喜欢的文字、图片无法保存的情况&#xff0c;面对这样的状况&#xff0c;我们想要将这些东西保留下来那就会用到电脑截图了&#xff0c;这个方法可以很轻松的就将我们无视无法保存的情况而将这些东西给保留下来。那么电脑要怎…

python socket 多人聊天室

参考来源&#xff08;其实我从上面复制了一点&#xff09;&#xff1a;Python 的 Socket 编程教程 http://www.oschina.net/question/12_76126Python线程指南 http://www.open-open.com/lib/view/open1345476194313.htmlPython Socket文档 https://docs.python.org/3/library/…

mxm智能教育机器人无法智能对话_零代码使用腾讯TBP打造智能对话机器人

点击观看大咖分享心疼你独自一人承担生活的苦难&#xff0c;寂寞夜里陪伴你的只剩无人倾诉的压抑和无处安放的焦虑。养个宠物&#xff0c;它却不能get到你的“宠言宠语”。找个伴侣&#xff0c;还要浪费吵架的时间和精力。回到家里&#xff0c;只能浸泡在“循环唠叨式“母爱的沐…