找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7091|回复: 6
打印 上一主题 下一主题
收起左侧

ICM42605六轴驱动源码 通过FIFO阈值中断采集

  [复制链接]
跳转到指定楼层
楼主
CM 六轴传感器驱动代码,通过FIFO阈值中断采集三轴加速度数据和三轴陀螺仪数据



单片机源程序如下:
  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. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
ICM42605_DRIVER.zip (3.13 KB, 下载次数: 165)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:263867 发表于 2019-11-27 17:37 | 只看该作者
挺好的,学习学习
回复

使用道具 举报

板凳
ID:249600 发表于 2020-9-6 21:28 | 只看该作者
多谢楼主分享,很不错的学习资料
回复

使用道具 举报

地板
ID:600127 发表于 2021-1-15 00:20 | 只看该作者
需要学习一下,自己调了半天也没有调通
回复

使用道具 举报

5#
ID:943289 发表于 2021-6-23 16:19 | 只看该作者
学习学习,fifo看不懂
回复

使用道具 举报

6#
ID:1009479 发表于 2022-3-10 17:14 | 只看该作者
很好的资料,找了半天,还是51靠谱
回复

使用道具 举报

7#
ID:1002285 发表于 2022-9-24 10:59 | 只看该作者

很好的资料,找了半天,还是51靠谱
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表