From 0f635376a5666a52f94af961fdb83765c255159b Mon Sep 17 00:00:00 2001 From: "TEK-ZHANGSY\\Administrator" <246827309@qq.com> Date: Fri, 27 May 2022 10:49:12 +0800 Subject: [PATCH] =?UTF-8?q?V1.2.10=20=20=20=20=20=20=20=20=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0IMU963RA=E4=B9=9D=E8=BD=B4=E6=A8=A1=E5=9D=97=E9=A9=B1?= =?UTF-8?q?=E5=8A=A8=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Example/ADC_Demo/Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ .../Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ .../Dual_Core_Demo/Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ Example/EEPROM_Demo/Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ .../Encoder_Demo/Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ Example/FFT_Demo/Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ .../Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ .../Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ .../LED_Blink_Demo/Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ Example/PIT_Demo/Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ Example/PWM_Demo/Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ Example/Printf_Demo/Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ .../Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ .../Systick_Demo/Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ Example/UART_Demo/Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ .../Libraries/doc/version.txt | 2 + .../Libraries/seekfree_libraries/headfile.h | 1 + .../seekfree_peripheral/SEEKFREE_IMU963RA.c | 364 ++++++++++++++++++ .../seekfree_peripheral/SEEKFREE_IMU963RA.h | 209 ++++++++++ 64 files changed, 9216 insertions(+) create mode 100644 Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h create mode 100644 Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c create mode 100644 Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h diff --git a/Example/ADC_Demo/Libraries/doc/version.txt b/Example/ADC_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/ADC_Demo/Libraries/doc/version.txt +++ b/Example/ADC_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/ADC_Demo/Libraries/seekfree_libraries/headfile.h b/Example/ADC_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/ADC_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/ADC_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/doc/version.txt b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/doc/version.txt +++ b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_libraries/headfile.h b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Example/Dual_Core_Demo/Libraries/doc/version.txt b/Example/Dual_Core_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/Dual_Core_Demo/Libraries/doc/version.txt +++ b/Example/Dual_Core_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/Dual_Core_Demo/Libraries/seekfree_libraries/headfile.h b/Example/Dual_Core_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/Dual_Core_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/Dual_Core_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Example/EEPROM_Demo/Libraries/doc/version.txt b/Example/EEPROM_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/EEPROM_Demo/Libraries/doc/version.txt +++ b/Example/EEPROM_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/EEPROM_Demo/Libraries/seekfree_libraries/headfile.h b/Example/EEPROM_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/EEPROM_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/EEPROM_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Example/Encoder_Demo/Libraries/doc/version.txt b/Example/Encoder_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/Encoder_Demo/Libraries/doc/version.txt +++ b/Example/Encoder_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/Encoder_Demo/Libraries/seekfree_libraries/headfile.h b/Example/Encoder_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/Encoder_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/Encoder_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Example/FFT_Demo/Libraries/doc/version.txt b/Example/FFT_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/FFT_Demo/Libraries/doc/version.txt +++ b/Example/FFT_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/FFT_Demo/Libraries/seekfree_libraries/headfile.h b/Example/FFT_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/FFT_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/FFT_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Example/GPIO_Interrupt_Demo/Libraries/doc/version.txt b/Example/GPIO_Interrupt_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/GPIO_Interrupt_Demo/Libraries/doc/version.txt +++ b/Example/GPIO_Interrupt_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_libraries/headfile.h b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/doc/version.txt b/Example/Interrupt_Priority_Set_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/Interrupt_Priority_Set_Demo/Libraries/doc/version.txt +++ b/Example/Interrupt_Priority_Set_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/headfile.h b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Example/LED_Blink_Demo/Libraries/doc/version.txt b/Example/LED_Blink_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/LED_Blink_Demo/Libraries/doc/version.txt +++ b/Example/LED_Blink_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/LED_Blink_Demo/Libraries/seekfree_libraries/headfile.h b/Example/LED_Blink_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/LED_Blink_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/LED_Blink_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Example/PIT_Demo/Libraries/doc/version.txt b/Example/PIT_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/PIT_Demo/Libraries/doc/version.txt +++ b/Example/PIT_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/PIT_Demo/Libraries/seekfree_libraries/headfile.h b/Example/PIT_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/PIT_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/PIT_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Example/PWM_Demo/Libraries/doc/version.txt b/Example/PWM_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/PWM_Demo/Libraries/doc/version.txt +++ b/Example/PWM_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/PWM_Demo/Libraries/seekfree_libraries/headfile.h b/Example/PWM_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/PWM_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/PWM_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Example/Printf_Demo/Libraries/doc/version.txt b/Example/Printf_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/Printf_Demo/Libraries/doc/version.txt +++ b/Example/Printf_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/Printf_Demo/Libraries/seekfree_libraries/headfile.h b/Example/Printf_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/Printf_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/Printf_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/doc/version.txt b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/doc/version.txt +++ b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_libraries/headfile.h b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Example/Systick_Demo/Libraries/doc/version.txt b/Example/Systick_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/Systick_Demo/Libraries/doc/version.txt +++ b/Example/Systick_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/Systick_Demo/Libraries/seekfree_libraries/headfile.h b/Example/Systick_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/Systick_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/Systick_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Example/UART_Demo/Libraries/doc/version.txt b/Example/UART_Demo/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Example/UART_Demo/Libraries/doc/version.txt +++ b/Example/UART_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Example/UART_Demo/Libraries/seekfree_libraries/headfile.h b/Example/UART_Demo/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Example/UART_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/UART_Demo/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif diff --git a/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt b/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt index fd9a3a0..500d04e 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt +++ b/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.10 + 增加IMU963RA九轴模块驱动文件 V1.2.9 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 修改spi底层驱动,退出时判断cs引脚状态,确保spi发送完成后退出。 diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/headfile.h b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/headfile.h index 574155a..398d6fc 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/headfile.h +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/headfile.h @@ -58,6 +58,7 @@ #include "SEEKFREE_MT9V03X.h" #include "SEEKFREE_ICM20602.h" #include "SEEKFREE_MPU6050.h" +#include "SEEKFREE_IMU963RA.h" #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c new file mode 100644 index 0000000..ee8f7de --- /dev/null +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.c @@ -0,0 +1,364 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_spi.h" +#include "SEEKFREE_IIC.h" +#include "SEEKFREE_IMU963RA.h" + +int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +#if IMU963RA_USE_SOFT_IIC +#define imu963ra_write_acc_gyro_register(reg,data) simiic_write_reg(IMU963RA_DEV_ADDR, reg, data) +#define imu963ra_read_acc_gyro_register(reg) simiic_read_reg (IMU963RA_DEV_ADDR, reg, SIMIIC) +#define imu963ra_read_acc_gyro_registers(reg,data,len) simiic_read_regs(IMU963RA_DEV_ADDR, reg, data, len, SIMIIC) +#else + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 写寄存器 内部调用 +// @param reg 寄存器地址 +// @param data 数据 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_write_acc_gyro_register(uint8 reg, uint8 data) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_W; + dat[1] = data; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读寄存器 内部调用 +// @param reg 寄存器地址 +// @return uint8 数据 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_read_acc_gyro_register(uint8 reg) +{ + uint8 dat[2]; + + dat[0] = reg | IMU963RA_SPI_R; + dat[1] = 0; + + spi_mosi(IMU963RA_SPI,IMU963RA_CS_PIN,dat,dat,2,1); + + return dat[1]; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 读数据 内部调用 +// @param reg 寄存器地址 +// @param data 数据缓冲区 +// @param len 数据长度 +// @return void +//------------------------------------------------------------------------------------------------------------------- +static void imu963ra_read_acc_gyro_registers(uint8 *data, uint32 len) +{ + spi_mosi(IMU963RA_SPI, IMU963RA_CS_PIN, data, data, len, 1); +} +#endif + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_write_mag_register(uint8 addr, uint8 reg, uint8 data) +{ + addr = addr << 1; + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x00); // 从机0配置清除 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 0); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要写入的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_DATAWRITE_SLV0, data); // 需要写入的数据 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x80 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计读数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_read_mag_register(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x01); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x4C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 + + //等待通讯成功 + while(0 == (0x01 & imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER))) + { + systick_delay_ms(STM0, 2); + } + + return (imu963ra_read_acc_gyro_register(IMU963RA_SENSOR_HUB_1)); // 返回读取到的数据 +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA作为IIC主机向磁力计自动写数据,内部调用 +// @param void +// @return void +// Sample usage: 内部调用,用户无需关心 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_connect_mag(uint8 addr, uint8 reg) +{ + addr = addr << 1; + + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_ADD, addr | 1); // 设置地磁计地址(注意这里需要设置8位的I2C地址) 0x2C + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_SUBADD, reg); // 需要读取的寄存器地址 + imu963ra_write_acc_gyro_register(IMU963RA_SLV0_CONFIG, 0x06); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x6C); // 仅在第一个周期启用通讯 开启上拉 I2C主机使能 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 六轴自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_acc_gyro_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0x6B != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_acc_gyro_register(IMU963RA_WHO_AM_I); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief IMU963RA 磁力计自检 内部调用 +// @param void +// @return uint8 1-自检失败 0-自检成功 +//------------------------------------------------------------------------------------------------------------------- +static uint8 imu963ra_mag_self_check (void) +{ + uint8 dat = 0; +// uint16 timeout_count = 0; + + while(0xff != dat) // 判断 ID 是否正确 + { +// if(timeout_count++ > IMU963RA_TIMEOUT_COUNT) +// return 1; + dat = imu963ra_read_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CHIP_ID); + systick_delay_ms(STM0, 1); + } + return 0; +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 加速度计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_acc (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_A, &buf.dat[0], 7); +#else + buf.reg = IMU963RA_OUTX_L_A | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_acc_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_acc_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_acc_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取IMU963RA陀螺仪数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_gyro (void) +{ + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + +#if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_OUTX_L_G, &buf.dat[0], 6); +#else + buf.reg = IMU963RA_OUTX_L_G | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); +#endif + + imu963ra_gyro_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_gyro_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_gyro_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 获取 IMU963RA 磁力计数据 +// @param void +// @return void +// Sample usage: 执行该函数后,直接查看对应的变量即可 +//------------------------------------------------------------------------------------------------------------------- +void imu963ra_get_mag (void) +{ + uint8 temp_status; + struct + { + uint8 reg; + uint8 dat[6]; + }buf; + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); + temp_status = imu963ra_read_acc_gyro_register(IMU963RA_STATUS_MASTER); + if(0x01 & temp_status) + { + + #if IMU963RA_USE_SOFT_IIC + imu963ra_read_acc_gyro_registers(IMU963RA_SENSOR_HUB_1, &buf.dat[0], 6); + #else + buf.reg = IMU963RA_SENSOR_HUB_1 | IMU963RA_SPI_R; + imu963ra_read_acc_gyro_registers(&buf.reg, 7); + #endif + + imu963ra_mag_x = (int16)(((uint16)buf.dat[1]<<8 | buf.dat[0])); + imu963ra_mag_y = (int16)(((uint16)buf.dat[3]<<8 | buf.dat[2])); + imu963ra_mag_z = (int16)(((uint16)buf.dat[5]<<8 | buf.dat[4])); + } + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); +} + +//------------------------------------------------------------------------------------------------------------------- +// @brief 初始化 IMU963RA +// @param void +// @return uint8 1-初始化失败 0-初始化成功 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +uint8 imu963ra_init (void) +{ + + systick_delay_ms(STM0, 10); // 上电延时 + +#if IMU963RA_USE_SOFT_IIC + simiic_delay_set(IMU963RA_SOFT_IIC_DELAY); + simiic_init(); +#else + spi_init(IMU963RA_SPI, IMU963RA_SPC_PIN, IMU963RA_SDI_PIN, IMU963RA_SDO_PIN, IMU963RA_CS_PIN, 0, 10*1000*1000);//硬件SPI初始化 + +#endif + + imu963ra_write_acc_gyro_register(IMU963RA_INT1_CTRL, 0x03); // 开启陀螺仪 加速度数据就绪中断 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL1_XL, 0x4C); // 设置加速度计量程±8G以及数据输出速率104hz 以及加速度信息从第一级滤波器输出 + //IMU963RA_CTRL1_XL寄存器 + //设置为:0x40 加速度量程为:±2G 获取到的加速度计数据 除以16393,可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x48 加速度量程为:±4G 获取到的加速度计数据 除以8197, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x4C 加速度量程为:±8G 获取到的加速度计数据 除以4098, 可以转化为带物理单位的数据,单位:g(m/s^2) + //设置为:0x44 加速度量程为:±16G 获取到的加速度计数据 除以2049, 可以转化为带物理单位的数据,单位:g(m/s^2) + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL2_G, 0x6C); // 设置陀螺仪计量程±2000dps以及数据输出速率416hz + //ICM20602_GYRO_CONFIG寄存器 + //设置为:0x62 陀螺仪量程为:±125dps 获取到的陀螺仪数据除以228.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x60 陀螺仪量程为:±250dps 获取到的陀螺仪数据除以114.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x64 陀螺仪量程为:±500dps 获取到的陀螺仪数据除以57.1, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x68 陀螺仪量程为:±1000dps 获取到的陀螺仪数据除以28.6, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x6C 陀螺仪量程为:±2000dps 获取到的陀螺仪数据除以14.3, 可以转化为带物理单位的数据,单位为:°/s + //设置为:0x61 陀螺仪量程为:±4000dps 获取到的陀螺仪数据除以7.1, 可以转化为带物理单位的数据,单位为:°/s + + imu963ra_write_acc_gyro_register(IMU963RA_CTRL3_C, 0x44); // 使能陀螺仪数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL4_C, 0x02); // 使能数字低通滤波器 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL5_C, 0x00); // 加速度计与陀螺仪四舍五入 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL6_C, 0x00); // 开启加速度计高性能模式 陀螺仪低通滤波 133hz + imu963ra_write_acc_gyro_register(IMU963RA_CTRL7_G, 0x00); // 开启陀螺仪高性能模式 关闭高通滤波 + imu963ra_write_acc_gyro_register(IMU963RA_CTRL9_XL, 0x01); // 关闭I3C接口 + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x40); // 开启HUB寄存器访问 用于配置地磁计 + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x80); // 复位I2C主机 + systick_delay_ms(STM0, 2); + imu963ra_write_acc_gyro_register(IMU963RA_MASTER_CONFIG, 0x00); // 清除复位标志 + systick_delay_ms(STM0, 2); + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x80); // 复位连接的外设 + systick_delay_ms(STM0, 2); + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL2, 0x00); + systick_delay_ms(STM0, 2); + + if(imu963ra_mag_self_check()) + { + //zf_log(0, "IMU963RA mag self check error."); + return 1; + } + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_CONTROL1, 0x19); // 输出速率100hz 连续模式 + //IMU963RA_MAG_ADDR寄存器 + //设置为:0x19 磁力计量程为:8G 获取到的加速度计数据 除以3000, 可以转化为带物理单位的数据,单位:G(高斯) + //设置为:0x09 磁力计量程为:2G 获取到的加速度计数据 除以12000,可以转化为带物理单位的数据,单位:G(高斯) + + imu963ra_write_mag_register(IMU963RA_MAG_ADDR, IMU963RA_MAG_FBR, 0x01); + imu963ra_connect_mag(IMU963RA_MAG_ADDR, IMU963RA_MAG_OUTX_L); + + imu963ra_write_acc_gyro_register(IMU963RA_FUNC_CFG_ACCESS, 0x00); // 关闭HUB寄存器访问 + + systick_delay_ms(STM0, 20); // 等待磁力计获取数据 + + return 0; +} diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h new file mode 100644 index 0000000..7a7572b --- /dev/null +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IMU963RA.h @@ -0,0 +1,209 @@ +/********************************************************************************************************************* +* COPYRIGHT NOTICE +* Copyright (c) 2022,逐飞科技 +* All rights reserved. +* +* 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, +* 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 +* +* @file zf_device_imu963ra +* @company 成都逐飞科技有限公司 +* @author 逐飞科技(QQ3184284598) +* @version 查看doc内version文件 版本说明 +* @Software ADS v1.5.2 +* @Target core TC264 +* @Taobao https://seekfree.taobao.com/ +* @date 2022-05-04 +* @note 接线定义: +* ------------------------------------ +* 模块管脚 单片机管脚 +* // 硬件 SPI 引脚 +* SCL/SPC 查看 zf_device_imu963ra.h 中 IMU963RA_SPC_PIN 宏定义 +* SDA/DSI 查看 zf_device_imu963ra.h 中 IMU963RA_SDI_PIN 宏定义 +* SA0/SDO 查看 zf_device_imu963ra.h 中 IMU963RA_SDO_PIN 宏定义 +* CS 查看 zf_device_imu963ra.h 中 IMU963RA_CS_PIN 宏定义 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* +* // 软件 IIC 引脚 +* SCL/SPC 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +* SDA/DSI 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 其余引脚悬空 +* ------------------------------------ +********************************************************************************************************************/ + +#ifndef _SEEKFREE_IMU963RA_h +#define _SEEKFREE_IMU963RA_h + + +#include "common.h" + +#define IMU963RA_USE_SOFT_IIC (0) // 默认使用硬件 SPI 方式驱动 + +#if IMU963RA_USE_SOFT_IIC // 这两段 颜色正常的才是正确的 颜色灰的就是没有用的 +//====================================================软件 IIC 驱动==================================================== +#define IMU963RA_SOFT_IIC_DELAY (20) // 软件 IIC 的时钟延时周期 数值越小 IIC 通信速率越快 +//#define IMU963RA_SCL_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SCL 宏定义 +//#define IMU963RA_SDA_PIN 查看 SEEKFREE_IIC.h 中 SEEKFREE_SDA 宏定义 +//====================================================软件 IIC 驱动==================================================== +#else +//====================================================硬件 SPI 驱动==================================================== +#define IMU963RA_SPI_SPEED (10*1000*1000) // 硬件 SPI 速率 +#define IMU963RA_SPI (SPI_0 ) // 硬件 SPI 号 +#define IMU963RA_SPC_PIN (SPI0_SCLK_P20_11) // 硬件 SPI SCK 引脚 +#define IMU963RA_SDI_PIN (SPI0_MOSI_P20_14) // 硬件 SPI MOSI 引脚 +#define IMU963RA_SDO_PIN (SPI0_MISO_P20_12) // 硬件 SPI MISO 引脚 +#define IMU963RA_CS_PIN (SPI0_CS2_P20_13 ) // 硬件 CS 片选引脚 +//====================================================硬件 SPI 驱动==================================================== +#endif + +//#define IMU963RA_TIMEOUT_COUNT 0x00FF // IMU963RA 超时计数 + +//================================================定义 IMU963RA 内部地址================================================ +#define IMU963RA_DEV_ADDR 0x6B // SA0接地:0x6A SA0上拉:0x6B 模块默认上拉 +#define IMU963RA_SPI_W 0x00 +#define IMU963RA_SPI_R 0x80 + +#define IMU963RA_FUNC_CFG_ACCESS 0x01 +#define IMU963RA_PIN_CTRL 0x02 +#define IMU963RA_S4S_TPH_L 0x04 +#define IMU963RA_S4S_TPH_H 0x05 +#define IMU963RA_S4S_RR 0x06 +#define IMU963RA_FIFO_CTRL1 0x07 +#define IMU963RA_FIFO_CTRL2 0x08 +#define IMU963RA_FIFO_CTRL3 0x09 +#define IMU963RA_FIFO_CTRL4 0x0A +#define IMU963RA_COUNTER_BDR_REG1 0x0B +#define IMU963RA_COUNTER_BDR_REG2 0x0C +#define IMU963RA_INT1_CTRL 0x0D +#define IMU963RA_INT2_CTRL 0x0E +#define IMU963RA_WHO_AM_I 0x0F +#define IMU963RA_CTRL1_XL 0x10 +#define IMU963RA_CTRL2_G 0x11 +#define IMU963RA_CTRL3_C 0x12 +#define IMU963RA_CTRL4_C 0x13 +#define IMU963RA_CTRL5_C 0x14 +#define IMU963RA_CTRL6_C 0x15 +#define IMU963RA_CTRL7_G 0x16 +#define IMU963RA_CTRL8_XL 0x17 +#define IMU963RA_CTRL9_XL 0x18 +#define IMU963RA_CTRL10_C 0x19 +#define IMU963RA_ALL_INT_SRC 0x1A +#define IMU963RA_WAKE_UP_SRC 0x1B +#define IMU963RA_TAP_SRC 0x1C +#define IMU963RA_D6D_SRC 0x1D +#define IMU963RA_STATUS_REG 0x1E +#define IMU963RA_OUT_TEMP_L 0x20 +#define IMU963RA_OUT_TEMP_H 0x21 +#define IMU963RA_OUTX_L_G 0x22 +#define IMU963RA_OUTX_H_G 0x23 +#define IMU963RA_OUTY_L_G 0x24 +#define IMU963RA_OUTY_H_G 0x25 +#define IMU963RA_OUTZ_L_G 0x26 +#define IMU963RA_OUTZ_H_G 0x27 +#define IMU963RA_OUTX_L_A 0x28 +#define IMU963RA_OUTX_H_A 0x29 +#define IMU963RA_OUTY_L_A 0x2A +#define IMU963RA_OUTY_H_A 0x2B +#define IMU963RA_OUTZ_L_A 0x2C +#define IMU963RA_OUTZ_H_A 0x2D +#define IMU963RA_EMB_FUNC_STATUS_MAINPAGE 0x35 +#define IMU963RA_FSM_STATUS_A_MAINPAGE 0x36 +#define IMU963RA_FSM_STATUS_B_MAINPAGE 0x37 +#define IMU963RA_STATUS_MASTER_MAINPAGE 0x39 +#define IMU963RA_FIFO_STATUS1 0x3A +#define IMU963RA_FIFO_STATUS2 0x3B +#define IMU963RA_TIMESTAMP0 0x40 +#define IMU963RA_TIMESTAMP1 0x41 +#define IMU963RA_TIMESTAMP2 0x42 +#define IMU963RA_TIMESTAMP3 0x43 +#define IMU963RA_TAP_CFG0 0x56 +#define IMU963RA_TAP_CFG1 0x57 +#define IMU963RA_TAP_CFG2 0x58 +#define IMU963RA_TAP_THS_6D 0x59 +#define IMU963RA_INT_DUR2 0x5A +#define IMU963RA_WAKE_UP_THS 0x5B +#define IMU963RA_WAKE_UP_DUR 0x5C +#define IMU963RA_FREE_FALL 0x5D +#define IMU963RA_MD1_CFG 0x5E +#define IMU963RA_MD2_CFG 0x5F +#define IMU963RA_S4S_ST_CMD_CODE 0x60 +#define IMU963RA_S4S_DT_REG 0x61 +#define IMU963RA_I3C_BUS_AVB 0x62 +#define IMU963RA_INTERNAL_FREQ_FINE 0x63 +#define IMU963RA_INT_OIS 0x6F +#define IMU963RA_CTRL1_OIS 0x70 +#define IMU963RA_CTRL2_OIS 0x71 +#define IMU963RA_CTRL3_OIS 0x72 +#define IMU963RA_X_OFS_USR 0x73 +#define IMU963RA_Y_OFS_USR 0x74 +#define IMU963RA_Z_OFS_USR 0x75 +#define IMU963RA_FIFO_DATA_OUT_TAG 0x78 +#define IMU963RA_FIFO_DATA_OUT_X_L 0x79 +#define IMU963RA_FIFO_DATA_OUT_X_H 0x7A +#define IMU963RA_FIFO_DATA_OUT_Y_L 0x7B +#define IMU963RA_FIFO_DATA_OUT_Y_H 0x7C +#define IMU963RA_FIFO_DATA_OUT_Z_L 0x7D +#define IMU963RA_FIFO_DATA_OUT_Z_H 0x7E + +//集线器功能相关寄存器 需要将FUNC_CFG_ACCESS的SHUB_REG_ACCESS位设置为1才能正确访问 +#define IMU963RA_SENSOR_HUB_1 0x02 +#define IMU963RA_SENSOR_HUB_2 0x03 +#define IMU963RA_SENSOR_HUB_3 0x04 +#define IMU963RA_SENSOR_HUB_4 0x05 +#define IMU963RA_SENSOR_HUB_5 0x06 +#define IMU963RA_SENSOR_HUB_6 0x07 +#define IMU963RA_SENSOR_HUB_7 0x08 +#define IMU963RA_SENSOR_HUB_8 0x09 +#define IMU963RA_SENSOR_HUB_9 0x0A +#define IMU963RA_SENSOR_HUB_10 0x0B +#define IMU963RA_SENSOR_HUB_11 0x0C +#define IMU963RA_SENSOR_HUB_12 0x0D +#define IMU963RA_SENSOR_HUB_13 0x0E +#define IMU963RA_SENSOR_HUB_14 0x0F +#define IMU963RA_SENSOR_HUB_15 0x10 +#define IMU963RA_SENSOR_HUB_16 0x11 +#define IMU963RA_SENSOR_HUB_17 0x12 +#define IMU963RA_SENSOR_HUB_18 0x13 +#define IMU963RA_MASTER_CONFIG 0x14 +#define IMU963RA_SLV0_ADD 0x15 +#define IMU963RA_SLV0_SUBADD 0x16 +#define IMU963RA_SLV0_CONFIG 0x17 +#define IMU963RA_SLV1_ADD 0x18 +#define IMU963RA_SLV1_SUBADD 0x19 +#define IMU963RA_SLV1_CONFIG 0x1A +#define IMU963RA_SLV2_ADD 0x1B +#define IMU963RA_SLV2_SUBADD 0x1C +#define IMU963RA_SLV2_CONFIG 0x1D +#define IMU963RA_SLV3_ADD 0x1E +#define IMU963RA_SLV3_SUBADD 0x1F +#define IMU963RA_SLV3_CONFIG 0x20 +#define IMU963RA_DATAWRITE_SLV0 0x21 +#define IMU963RA_STATUS_MASTER 0x22 + +#define IMU963RA_MAG_ADDR 0x0D //7位IIC地址 +#define IMU963RA_MAG_OUTX_L 0x00 +#define IMU963RA_MAG_CONTROL1 0x09 +#define IMU963RA_MAG_CONTROL2 0x0A +#define IMU963RA_MAG_FBR 0x0B +#define IMU963RA_MAG_CHIP_ID 0x0D + + +extern int16 imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z; +extern int16 imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z; +extern int16 imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z; + +void imu963ra_get_acc (void); +void imu963ra_get_gyro (void); +void imu963ra_get_mag (void); + +uint8 imu963ra_init (void); + + + + +#endif