標(biāo)題:
ICM42605六軸驅(qū)動源碼 通過FIFO閾值中斷采集
[打印本頁]
作者:
yi2018
時間:
2018-11-1 10:50
標(biāo)題:
ICM42605六軸驅(qū)動源碼 通過FIFO閾值中斷采集
CM 六軸傳感器驅(qū)動代碼,通過FIFO閾值中斷采集三軸加速度數(shù)據(jù)和三軸陀螺儀數(shù)據(jù)
0.png
(5.63 KB, 下載次數(shù): 109)
下載附件
2018-11-1 12:47 上傳
單片機源程序如下:
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include "nrf_drv_spi.h"
#include "icm42605.h"
#include "nrf_drv_gpiote.h"
#include "nrf_delay.h"
/***********************************************************************/
void icm42605_cs_high()
{
nrf_gpio_pin_set(ICM42605_SPI_SS_PIN);
}
void icm42605_cs_low()
{
nrf_gpio_pin_clear(ICM42605_SPI_SS_PIN);
}
uint8_t icm42605_spi_rw(uint8_t reg)
{
uint8_t rx_data = 0;
nrf_gpio_pin_set(ICM42605_SPI_SCK_PIN);
for(uint8_t i =0;i<8;i++)
{
if(reg & 0x80)
nrf_gpio_pin_set(ICM42605_SPI_MOSI_PIN);
else
nrf_gpio_pin_clear(ICM42605_SPI_MOSI_PIN);
nrf_gpio_pin_clear(ICM42605_SPI_SCK_PIN);
reg <<= 1;
rx_data <<= 1;
if(nrf_gpio_pin_read(ICM42605_SPI_MISO_PIN))
rx_data |= 0x01;
nrf_gpio_pin_set(ICM42605_SPI_SCK_PIN);
}
return rx_data;
}
uint8_t icm42605_read_reg(uint8_t reg)
{
uint8_t temp;
icm42605_cs_low();
icm42605_spi_rw((reg | 0x80));
temp = icm42605_spi_rw(0);
icm42605_cs_high();
return temp;
}
uint8_t icm42605_write_reg(uint8_t reg,uint8_t value)
{
icm42605_cs_low();
icm42605_spi_rw((reg & 0x7f));
icm42605_spi_rw(value);
icm42605_cs_high();
return 0;
}
uint8_t icm42605_read_regs(uint8_t reg,uint8_t *buf,uint16_t len)
{
uint16_t i = 0;
icm42605_cs_low();
icm42605_spi_rw((reg | 0x80));
while(i < len){
buf[i] = icm42605_spi_rw(0);
i++;
}
icm42605_cs_high();
return 0;
}
uint8_t icm42605_init(void)
{
uint8_t reg_val;
icm42605_write_reg(reg_bank_sel,0x00);//Set to bank 0
icm42605_write_reg(device_config_reg,bit_soft_reset_chip_config);//chip soft reset
nrf_delay_ms(100);
icm42605_write_reg(reg_bank_sel,0x00);//Set to bank 0
reg_val = icm42605_read_reg(who_am_i);//who_am_i
if(reg_val==0x42)
{
icm42605_write_reg(reg_bank_sel,0x01);//Change to bank 1
icm42605_write_reg(intf_config4,0x02);//4 wire spi mode
icm42605_write_reg(reg_bank_sel,0x00);
icm42605_write_reg(fifo_config_reg,0x40);//Stream-to-FIFO Mode
reg_val = icm42605_read_reg(int_source0_reg);
icm42605_write_reg(int_source0_reg,0x00);
icm42605_write_reg(fifo_config2_reg,0x00);// watermark
icm42605_write_reg(fifo_config3_reg,0x02);// watermark
icm42605_write_reg(int_source0_reg, reg_val);
icm42605_write_reg(fifo_config1_reg,0x63);// Enable the accel and gyro to the FIFO
icm42605_write_reg(reg_bank_sel,0x00);
icm42605_write_reg(int_config_reg,0x36);
icm42605_write_reg(reg_bank_sel, 0x00);
reg_val = (icm42605_read_reg(int_source0_reg)|bit_int_fifo_ths_int1_en);
icm42605_write_reg(int_source0_reg, reg_val);
icm42605_write_reg(reg_bank_sel, 0x00);
reg_val = ((icm42605_read_reg(accel_config0_reg)&0x1F)|(bit_accel_ui_fs_sel_8g));//8g
icm42605_write_reg(accel_config0_reg, reg_val);
icm42605_write_reg(reg_bank_sel, 0x00);
reg_val = ((icm42605_read_reg(accel_config0_reg)&0xF0)|bit_accel_odr_50hz);
icm42605_write_reg(accel_config0_reg, reg_val);
icm42605_write_reg(reg_bank_sel, 0x00);
reg_val = ((icm42605_read_reg(gyro_config0_reg)&0x1F)|(bit_gyro_ui_fs_sel_1000dps));
icm42605_write_reg(gyro_config0_reg,reg_val);
icm42605_write_reg(reg_bank_sel, 0x00);
reg_val = ((icm42605_read_reg(gyro_config0_reg)&0xF0)|bit_gyro_odr_50hz);
icm42605_write_reg(gyro_config0_reg, reg_val);
icm42605_write_reg(reg_bank_sel, 0x00);
reg_val = icm42605_read_reg(pwr_mgmt0_reg)|(bit_accel_mode_ln); // Accel on in LNM
icm42605_write_reg(pwr_mgmt0_reg, reg_val);
nrf_delay_us(400);
icm42605_write_reg(reg_bank_sel, 0x00);
reg_val = icm42605_read_reg(pwr_mgmt0_reg)|(bit_gyro_mode_ln); // Gyro on in LNM
icm42605_write_reg(pwr_mgmt0_reg, reg_val);
nrf_delay_us(400);
printf("ok");
return 1;
}else return 0;
}
uint8_t fifocount_l, fifocount_h;
uint16_t fifocount;
void icm42605_read_fifo(Sample_data_type_t *data,uint16_t len)
{
uint8_t reg_val;
uint8_t tempbuff[512]={0};
reg_val = icm42605_read_reg(int_source0_reg);
icm42605_write_reg(int_source0_reg,0x00);
fifocount_h = icm42605_read_reg(fifo_byte_count_h_res); // Read the FIFO size
fifocount_l = icm42605_read_reg(fifo_byte_count_l_res);
fifocount = (fifocount_h<<8)|fifocount_l;
icm42605_read_regs(fifo_data_port,tempbuff,len);
if(fifocount>=fifo_packet_size) // If we have a complete packet in the FIFO
{
for(uint8_t i=0;i<32;i++)
{
if((tempbuff[i*16]&fifo_accel_en)&&(tempbuff[i*16]&fifo_gyro_en))
{
data->Sample_accdata[0+i*3] = ((int16_t)((tempbuff[1+i*16] << 8) | tempbuff[2+i*16]))*acc_ssl;
data->Sample_accdata[1+i*3] = ((int16_t)((tempbuff[3+i*16] << 8) | tempbuff[4+i*16]))*acc_ssl;
data->Sample_accdata[2+i*3] = ((int16_t)((tempbuff[5+i*16] << 8) | tempbuff[6+i*16]))*acc_ssl;
data->Sample_gyrdata[0+i*3] = ((int16_t)((tempbuff[7+i*16] << 8) | tempbuff[8+i*16]))/gyr_ssl;
data->Sample_gyrdata[1+i*3] = ((int16_t)((tempbuff[9+i*16] << 8) | tempbuff[10+i*16]))/gyr_ssl;
data->Sample_gyrdata[2+i*3] = ((int16_t)((tempbuff[11+i*16]<< 8) | tempbuff[12+i*16]))/gyr_ssl;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
ICM42605_DRIVER.zip
(3.13 KB, 下載次數(shù): 166)
2018-11-1 10:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
yun_2106118
時間:
2019-11-27 17:37
挺好的,學(xué)習(xí)學(xué)習(xí)
作者:
andayjon
時間:
2020-9-6 21:28
多謝樓主分享,很不錯的學(xué)習(xí)資料
作者:
739374663
時間:
2021-1-15 00:20
需要學(xué)習(xí)一下,自己調(diào)了半天也沒有調(diào)通
作者:
chaoren123
時間:
2021-6-23 16:19
學(xué)習(xí)學(xué)習(xí),fifo看不懂
作者:
Tink1471988512
時間:
2022-3-10 17:14
很好的資料,找了半天,還是51靠譜
作者:
spoolish
時間:
2022-9-24 10:59
很好的資料,找了半天,還是51靠譜
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1