找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 8507|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

ICM42605六軸驅(qū)動(dòng)源碼 通過FIFO閾值中斷采集

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
CM 六軸傳感器驅(qū)動(dòng)代碼,通過FIFO閾值中斷采集三軸加速度數(shù)據(jù)和三軸陀螺儀數(shù)據(jù)



單片機(jī)源程序如下:
  1. #include <stdbool.h>
  2. #include <stdint.h>
  3. #include <string.h>
  4. #include "nrf_drv_spi.h"
  5. #include "icm42605.h"
  6. #include "nrf_drv_gpiote.h"
  7. #include "nrf_delay.h"
  8. /***********************************************************************/
  9. void icm42605_cs_high()
  10. {
  11.    nrf_gpio_pin_set(ICM42605_SPI_SS_PIN);
  12. }

  13. void icm42605_cs_low()
  14. {
  15.    nrf_gpio_pin_clear(ICM42605_SPI_SS_PIN);
  16. }

  17. uint8_t icm42605_spi_rw(uint8_t reg)
  18. {
  19.    uint8_t rx_data = 0;
  20.    nrf_gpio_pin_set(ICM42605_SPI_SCK_PIN);
  21.    for(uint8_t i =0;i<8;i++)
  22.          {
  23.        if(reg & 0x80)
  24.           nrf_gpio_pin_set(ICM42605_SPI_MOSI_PIN);
  25.        else
  26.           nrf_gpio_pin_clear(ICM42605_SPI_MOSI_PIN);
  27.        nrf_gpio_pin_clear(ICM42605_SPI_SCK_PIN);
  28.        reg <<= 1;
  29.        rx_data <<= 1;
  30.        if(nrf_gpio_pin_read(ICM42605_SPI_MISO_PIN))
  31.           rx_data |= 0x01;
  32.        nrf_gpio_pin_set(ICM42605_SPI_SCK_PIN);   
  33.    }
  34.    return rx_data;   
  35. }

  36. uint8_t icm42605_read_reg(uint8_t reg)
  37. {
  38.    uint8_t temp;
  39.    icm42605_cs_low();
  40.    icm42605_spi_rw((reg | 0x80));
  41.    temp = icm42605_spi_rw(0);
  42.    icm42605_cs_high();
  43.    return temp;
  44. }

  45. uint8_t icm42605_write_reg(uint8_t reg,uint8_t value)
  46. {
  47.    icm42605_cs_low();
  48.    icm42605_spi_rw((reg & 0x7f));
  49.    icm42605_spi_rw(value);
  50.    icm42605_cs_high();
  51.    return 0;
  52. }

  53. uint8_t icm42605_read_regs(uint8_t reg,uint8_t *buf,uint16_t len)
  54. {
  55.    uint16_t i = 0;
  56.    icm42605_cs_low();
  57.    icm42605_spi_rw((reg | 0x80));
  58.    while(i < len){
  59.         buf[i] = icm42605_spi_rw(0);
  60.         i++;
  61.    }
  62.    icm42605_cs_high();
  63.    return 0;
  64. }

  65. uint8_t icm42605_init(void)
  66. {   
  67.          uint8_t reg_val;
  68.          icm42605_write_reg(reg_bank_sel,0x00);//Set to bank 0
  69.          icm42605_write_reg(device_config_reg,bit_soft_reset_chip_config);//chip soft reset
  70.          nrf_delay_ms(100);
  71.                         
  72.          icm42605_write_reg(reg_bank_sel,0x00);//Set to bank 0
  73.          reg_val = icm42605_read_reg(who_am_i);//who_am_i
  74.          if(reg_val==0x42)
  75.          {
  76.                     icm42605_write_reg(reg_bank_sel,0x01);//Change to bank 1
  77.                     icm42605_write_reg(intf_config4,0x02);//4 wire spi mode
  78.                         
  79.         icm42605_write_reg(reg_bank_sel,0x00);        
  80.         icm42605_write_reg(fifo_config_reg,0x40);//Stream-to-FIFO Mode

  81.         reg_val = icm42605_read_reg(int_source0_reg);      
  82.         icm42605_write_reg(int_source0_reg,0x00);   
  83.               icm42605_write_reg(fifo_config2_reg,0x00);// watermark
  84.               icm42605_write_reg(fifo_config3_reg,0x02);// watermark
  85.         icm42605_write_reg(int_source0_reg, reg_val);
  86.               icm42605_write_reg(fifo_config1_reg,0x63);// Enable the accel and gyro to the FIFO
  87.                         
  88.                           icm42605_write_reg(reg_bank_sel,0x00);
  89.         icm42605_write_reg(int_config_reg,0x36);   
  90.                         
  91.                           icm42605_write_reg(reg_bank_sel, 0x00);
  92.         reg_val = (icm42605_read_reg(int_source0_reg)|bit_int_fifo_ths_int1_en);      
  93.         icm42605_write_reg(int_source0_reg, reg_val);
  94.                         
  95.                           icm42605_write_reg(reg_bank_sel, 0x00);
  96.         reg_val = ((icm42605_read_reg(accel_config0_reg)&0x1F)|(bit_accel_ui_fs_sel_8g));//8g
  97.         icm42605_write_reg(accel_config0_reg, reg_val);
  98.                                 
  99.                                 icm42605_write_reg(reg_bank_sel, 0x00);
  100.         reg_val = ((icm42605_read_reg(accel_config0_reg)&0xF0)|bit_accel_odr_50hz);
  101.         icm42605_write_reg(accel_config0_reg, reg_val);
  102.                                 
  103.                                 icm42605_write_reg(reg_bank_sel, 0x00);
  104.         reg_val = ((icm42605_read_reg(gyro_config0_reg)&0x1F)|(bit_gyro_ui_fs_sel_1000dps));
  105.         icm42605_write_reg(gyro_config0_reg,reg_val);
  106.                                 
  107.                                 icm42605_write_reg(reg_bank_sel, 0x00);      
  108.         reg_val = ((icm42605_read_reg(gyro_config0_reg)&0xF0)|bit_gyro_odr_50hz);
  109.         icm42605_write_reg(gyro_config0_reg, reg_val);
  110.                                 
  111.                           icm42605_write_reg(reg_bank_sel, 0x00);
  112.         reg_val = icm42605_read_reg(pwr_mgmt0_reg)|(bit_accel_mode_ln); // Accel on in LNM
  113.         icm42605_write_reg(pwr_mgmt0_reg, reg_val);  
  114.         nrf_delay_us(400);  
  115.                                 
  116.                                 icm42605_write_reg(reg_bank_sel, 0x00);
  117.                                 reg_val = icm42605_read_reg(pwr_mgmt0_reg)|(bit_gyro_mode_ln); // Gyro on in LNM
  118.                                 icm42605_write_reg(pwr_mgmt0_reg, reg_val);  
  119.                                 nrf_delay_us(400);
  120.                                 printf("ok");
  121.                                 return 1;
  122.          }else return 0;
  123. }
  124. uint8_t  fifocount_l, fifocount_h;
  125. uint16_t fifocount;
  126. void icm42605_read_fifo(Sample_data_type_t *data,uint16_t len)
  127. {
  128.          uint8_t reg_val;
  129.    uint8_t tempbuff[512]={0};
  130.          reg_val = icm42605_read_reg(int_source0_reg);      
  131.    icm42605_write_reg(int_source0_reg,0x00);
  132.          
  133.          fifocount_h = icm42605_read_reg(fifo_byte_count_h_res); // Read the FIFO size
  134.    fifocount_l = icm42605_read_reg(fifo_byte_count_l_res);
  135.    fifocount = (fifocount_h<<8)|fifocount_l;
  136.          
  137.    icm42605_read_regs(fifo_data_port,tempbuff,len);
  138.          if(fifocount>=fifo_packet_size) // If we have a complete packet in the FIFO
  139.    {
  140.                  for(uint8_t i=0;i<32;i++)
  141.                  {
  142.                                 if((tempbuff[i*16]&fifo_accel_en)&&(tempbuff[i*16]&fifo_gyro_en))
  143.                                 {
  144.                                                         data->Sample_accdata[0+i*3] = ((int16_t)((tempbuff[1+i*16] << 8) | tempbuff[2+i*16]))*acc_ssl;
  145.                                                         data->Sample_accdata[1+i*3] = ((int16_t)((tempbuff[3+i*16] << 8) | tempbuff[4+i*16]))*acc_ssl;
  146.                                                         data->Sample_accdata[2+i*3] = ((int16_t)((tempbuff[5+i*16] << 8) | tempbuff[6+i*16]))*acc_ssl;
  147.                                                         data->Sample_gyrdata[0+i*3] = ((int16_t)((tempbuff[7+i*16] << 8) | tempbuff[8+i*16]))/gyr_ssl;
  148.                                                         data->Sample_gyrdata[1+i*3] = ((int16_t)((tempbuff[9+i*16] << 8) | tempbuff[10+i*16]))/gyr_ssl;
  149.                                                         data->Sample_gyrdata[2+i*3] = ((int16_t)((tempbuff[11+i*16]<< 8) | tempbuff[12+i*16]))/gyr_ssl;
  150. ……………………

  151. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
ICM42605_DRIVER.zip (3.13 KB, 下載次數(shù): 166)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:263867 發(fā)表于 2019-11-27 17:37 | 只看該作者
挺好的,學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

板凳
ID:249600 發(fā)表于 2020-9-6 21:28 | 只看該作者
多謝樓主分享,很不錯(cuò)的學(xué)習(xí)資料
回復(fù)

使用道具 舉報(bào)

地板
ID:600127 發(fā)表于 2021-1-15 00:20 | 只看該作者
需要學(xué)習(xí)一下,自己調(diào)了半天也沒有調(diào)通
回復(fù)

使用道具 舉報(bào)

5#
ID:943289 發(fā)表于 2021-6-23 16:19 | 只看該作者
學(xué)習(xí)學(xué)習(xí),fifo看不懂
回復(fù)

使用道具 舉報(bào)

6#
ID:1009479 發(fā)表于 2022-3-10 17:14 | 只看該作者
很好的資料,找了半天,還是51靠譜
回復(fù)

使用道具 舉報(bào)

7#
ID:1002285 發(fā)表于 2022-9-24 10:59 | 只看該作者

很好的資料,找了半天,還是51靠譜
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表