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.pswp.cn/news/395360.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395360.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395360.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue腳手架vue數據交互_學習Vue:3分鐘的交互式Vue JS教程

vue腳手架vue數據交互Vue.js is a JavaScript library for building user interfaces. Last year, it started to become quite popular among web developers. It’s lightweight, relatively easy to learn, and powerful.Vue.js是用于構建用戶界面JavaScript庫。 去年&#…

[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;上邊距  右邊距…

html文本對齊6,HTML對齊文本

我要像以下列方式顯示頁面上的文本&#xff1a;HTML對齊文本My Text: Text HereMy Text: More Text Here.........................................................Text from line above continued here.我有以下的標記只是為了測試&#xff1a;body {font-family: arial;}fo…

vue底部跳轉_詳解Vue底部導航欄組件

不多說直接上代碼 BottomNav.vue&#xff1a;{{item.name}}export default{props:[idx],data(){return {items:[{cls:"home",name:"首頁",push:"/home",icon:"../static/home.png",iconSelect:"../static/home_select.png"}…

Android Studio環境搭建

Android Studio環境搭建 個人博客 歡迎大家多多關注該獨立博客。 ###[csdn博客]&#xff08;http://blog.csdn.net/peace1213&#xff09; 一直想把自己的經驗分享出來&#xff0c;記得上次寫博客還是ok6410的筆記。感覺時代久遠啊。記得那個時候我還一心想搞硬件了。如今又一次…

hacktoberfest_Hacktoberfest和其他有趣的事情將在本周末在freeCodeCamp

hacktoberfestby Quincy Larson昆西拉爾森(Quincy Larson) Hacktoberfest和其他有趣的事情將在本周末在freeCodeCamp (Hacktoberfest and other fun things going on this weekend at freeCodeCamp) Earlier this month, the freeCodeCamp community turned 3 years old. And …

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…

iOS開發Swift篇—(七)函數(1)

一、函數的定義 &#xff08;1&#xff09;函數的定義格式 1 func 函數名(形參列表) -> 返回值類型 { 2 // 函數體... 3 4 } &#xff08;2&#xff09;形參列表的格式 形參名1: 形參類型1, 形參名2: 形參類型2, … &#xff08;3&#xff09;舉例&#xff1a;計算2個…

如何用計算機管理員權限,教你電腦使用代碼添加管理員權限的詳細教程

我們在使用電腦運行某些軟件的時候&#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…

宣布JavaScript 2017狀況調查

by Sacha Greif由Sacha Greif 宣布JavaScript 2017狀況調查 (Announcing the State of JavaScript 2017 Survey) 讓我們找出去年以來發生的變化&#xff01; (Let’s find out what’s changed since last year!) In a hurry? You can take the survey here.匆忙&#xff1f;…

內是不是半包圍結構_輕鋼別墅的體系結構

一、輕鋼別墅介紹1、輕鋼別墅的屋面系統輕鋼別墅屋面系統是由屋架、結構OSB面板、防水層、輕型屋面瓦&#xff08;金屬或瀝青瓦&#xff09;組成的。輕鋼結構的屋面&#xff0c;外觀可以有多種組合。材料也有多種。在保障了防水這一技術的前提下&#xff0c;外觀有了許多的選擇…

JavaScript call()函數的應用

call([thisObj[,arg1[, arg2[, [,.argN]]]]]) call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數的對象上下文從初始的上下文改變為由 thisObj 指定的新對象。 thisObj 可選項。將被用作當前對象的對象。 arg1, arg2, , argN 可選項。將被傳遞方法參數序…

hive 去重 字符串_hive函數

Hive是建立在 Hadoop 上的數據倉庫基礎架構,定義了簡單的類 SQL 查詢語言(HQL)函數分類&#xff1a;簡單內置函數&#xff1a;數學函數&#xff0c;字符函數&#xff0c;日期函數&#xff0c;條件函數&#xff0c;聚合函數。高級內置函數&#xff1a;行列轉換函數&#xff0c;分…

python word

代碼&#xff1a; 1 #codingutf-82 __author__ zhm3 from win32com import client as wc4 import os5 import time6 import random7 import MySQLdb8 import re9 def wordsToHtml(dir):10 #批量把文件夾的word文檔轉換成html文件11 #金山WPS調用&#xff0c;搶先版的用KWPS&a…

aws lambda_如何為AWS Lambda實施日志聚合

aws lambdaby Yan Cui崔燕 如何為AWS Lambda實施日志聚合 (How to implement log aggregation for AWS Lambda) During the execution of a Lambda function, whatever you write to stdout (for example, using console.log in Node.js) will be captured by Lambda and sent…

【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…