Compare commits

...

3 Commits

Author SHA1 Message Date
JKS
556f85922a 修改660RX定义错误 2026-03-09 18:11:21 +08:00
JKS
51f5ebb6ac 修改660rc默认为硬件SPI 2026-03-09 13:13:29 +08:00
JKS
34217f7f48 V3.4.5 增加660RC驱动 增加660RC例程· 2026-03-09 12:08:43 +08:00
19 changed files with 1559 additions and 4 deletions

View File

@@ -1,3 +1,5 @@
V3.4.5
<09><><EFBFBD><EFBFBD>660RC<52><43><EFBFBD><EFBFBD>
V3.4.4 V3.4.4
<09>޸<EFBFBD>printf<74>ض<EFBFBD><D8B6><EFBFBD><EFBFBD>еĺ궨<C4BA><EAB6A8> <09>޸<EFBFBD>printf<74>ض<EFBFBD><D8B6><EFBFBD><EFBFBD>еĺ궨<C4BA><EAB6A8>
<09><><EFBFBD><EFBFBD>WIFI_SPI<50><49><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD>WIFI_SPI<50><49><EFBFBD><EFBFBD>

View File

@@ -90,6 +90,7 @@
#include "zf_device_icm20602.h" #include "zf_device_icm20602.h"
#include "zf_device_imu660ra.h" #include "zf_device_imu660ra.h"
#include "zf_device_imu660rb.h" #include "zf_device_imu660rb.h"
#include "zf_device_imu660rc.h"
#include "zf_device_imu660rx.h" #include "zf_device_imu660rx.h"
#include "zf_device_imu963ra.h" #include "zf_device_imu963ra.h"
#include "zf_device_ips114.h" #include "zf_device_ips114.h"

View File

@@ -0,0 +1,563 @@
/*********************************************************************************************************************
* RT1064DVL6A Opensourec Library <20><><EFBFBD><EFBFBD>RT1064DVL6A <20><>Դ<EFBFBD><EFBFBD><E2A3A9>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڹٷ<DAB9> SDK <20>ӿڵĵ<DAB5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>
* Copyright (c) 2022 SEEKFREE <20><><EFBFBD>ɿƼ<C9BF>
*
* <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD> RT1064DVL6A <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
*
* RT1064DVL6A <20><>Դ<EFBFBD><D4B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B7A2><EFBFBD><EFBFBD> GPL<50><4C>GNU General Public License<73><65><EFBFBD><EFBFBD> GNUͨ<55>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><> GPL <20>ĵ<EFBFBD>3<EFBFBD><EFBFBD><E6A3A8> GPL3.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>κκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ汾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>޸<EFBFBD><DEB8><EFBFBD>
*
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κεı<CEB5>֤
* <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB>ʺ<EFBFBD><CABA>ض<EFBFBD><D8B6><EFBFBD>;<EFBFBD>ı<EFBFBD>֤
* <20><><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> GPL
*
* <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ͬʱ<CDAC>յ<EFBFBD>һ<EFBFBD><D2BB> GPL <20>ĸ<EFBFBD><C4B8><EFBFBD>
* <20><><EFBFBD><EFBFBD>û<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><https://www.gnu.org/licenses/>
*
* <20><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>ʹ<EFBFBD><CAB9> GPL3.0 <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>֤Э<D6A4><D0AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>İ汾
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD>İ<EFBFBD><C4B0><EFBFBD> libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> GPL3_permission_statement.txt <20>ļ<EFBFBD><C4BC><EFBFBD>
* <20><><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> libraries <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> LICENSE <20>ļ<EFBFBD>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> zf_device_imu660rc
* <20><>˾<EFBFBD><CBBE><EFBFBD><EFBFBD> <20>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* <20><EFBFBD><E6B1BE>Ϣ <20>鿴 libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> version <20>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADS v1.10.2
* <20><><EFBFBD><EFBFBD>ƽ̨ TC264
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> https://seekfree.taobao.com/
*
* <20>޸ļ<DEB8>¼
* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ע
* 2025-12-12 SeekFree first version
********************************************************************************************************************/
/*********************************************************************************************************************
* <20><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <20><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* // Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SPC_PIN <20><EFBFBD><EAB6A8>
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDI_PIN <20><EFBFBD><EAB6A8>
* SA0/SDO <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDO_PIN <20><EFBFBD><EAB6A8>
* CS <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_CS_PIN <20><EFBFBD><EAB6A8>
* INT2 <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_INT2_PIN <20><EFBFBD><EAB6A8>
* VCC 3.3V<EFBFBD><EFBFBD>Դ
* GND <20><>Դ<EFBFBD><D4B4>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* // <20><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SCL_PIN <20><EFBFBD><EAB6A8>
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDA_PIN <20><EFBFBD><EAB6A8>
* VCC 3.3V<EFBFBD><EFBFBD>Դ
* GND <20><>Դ<EFBFBD><D4B4>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ------------------------------------
********************************************************************************************************************/
#include "math.h"
#include "zf_common_debug.h"
#include "zf_driver_delay.h"
#include "zf_driver_spi.h"
#include "zf_driver_gpio.h"
#include "zf_driver_soft_iic.h"
#include "zf_device_config.h"
#include "zf_driver_uart.h"
#include "zf_driver_exti.h"
#include "zf_device_imu660rc.h"
#ifndef M_PI
#define M_PI 3.1415926f
#endif
static uint8 imu660rc_quarternion_rate;
float imu660rc_transition_factor[2];
int16 imu660rc_gyro_x = 0, imu660rc_gyro_y = 0, imu660rc_gyro_z = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> gyro (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
int16 imu660rc_acc_x = 0, imu660rc_acc_y = 0, imu660rc_acc_z = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> acc (accelerometer <20><><EFBFBD>ٶȼ<D9B6>)
float imu660rc_roll = 0, imu660rc_pitch = 0, imu660rc_yaw = 0; // ŷ<><C5B7><EFBFBD><EFBFBD>
float imu660rc_quarternion[4]; // <20><>Ԫ<EFBFBD><D4AA>
#if IMU660RC_USE_SOFT_IIC
static soft_iic_info_struct imu660rc_iic_struct;
#define imu660rc_write_register(reg, data) (soft_iic_write_8bit_register (&imu660rc_iic_struct, (reg), (data)))
#define imu660rc_write_registers(reg, data, len) (soft_iic_write_8bit_registers(&imu660rc_iic_struct, (reg), (data), (len)))
#define imu660rc_read_register(reg) (soft_iic_read_8bit_register (&imu660rc_iic_struct, (reg)))
#define imu660rc_read_registers(reg, data, len) (soft_iic_read_8bit_registers (&imu660rc_iic_struct, (reg), (data), (len)))
#else
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC д<>Ĵ<EFBFBD><C4B4><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> reg <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static void imu660rc_write_register (uint8 reg, uint8 data)
{
IMU660RC_CS(0);
spi_write_8bit_register(IMU660RC_SPI, reg | IMU660RC_SPI_W, data);
IMU660RC_CS(1);
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> reg <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 <20><><EFBFBD><EFBFBD>
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_read_register(IMU660RC_CHIP_ID);
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static uint8 imu660rc_read_register (uint8 reg)
{
uint8 data;
IMU660RC_CS(0);
data = spi_read_8bit_register(IMU660RC_SPI, reg | IMU660RC_SPI_R);
IMU660RC_CS(1);
return data;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> reg <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data <20><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_read_registers(IMU660RC_ACC_ADDRESS, dat, 6);
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static void imu660rc_read_registers (uint8 reg, uint8 *data, uint32 len)
{
IMU660RC_CS(0);
spi_read_8bit_registers(IMU660RC_SPI, reg | IMU660RC_SPI_R, data, len);
IMU660RC_CS(1);
}
#endif
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC fp16ת<36><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static uint32 fp16_to_float(uint16 h)
{
uint16 h_exp = (h & 0x7c00u);
uint32 f_sgn = ((uint32)h & 0x8000u) << 16;
switch (h_exp)
{
case 0x0000u: // 0 or subnormal
{
uint16 h_sig = (h & 0x03ffu);
// Signed zero
if (h_sig == 0)
{
return f_sgn;
}
// Subnormal
h_sig <<= 1;
while ((h_sig & 0x0400u) == 0)
{
h_sig <<= 1;
h_exp++;
}
uint32 f_exp = ((uint32)(127 - 15 - h_exp)) << 23;
uint32 f_sig = ((uint32)(h_sig & 0x03ffu)) << 13;
return f_sgn + f_exp + f_sig;
}
case 0x7c00u: // inf or NaN
{
// All-ones exponent and a copy of the significand
return f_sgn + 0x7f800000u + (((uint32)(h & 0x03ffu)) << 13);
}
default: // normalized
{
// Just need to adjust the exponent and shift
return f_sgn + (((uint32)(h & 0x7fffu) + 0x1c000u) << 13);
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static void quarternion_normalize(float quat[4], uint16 *fp16)
{
float n = 0;
float temp[4];
*(uint32 *)(&temp[0]) = fp16_to_float(fp16[0]);
*(uint32 *)(&temp[1]) = fp16_to_float(fp16[1]);
*(uint32 *)(&temp[2]) = fp16_to_float(fp16[2]);
*(uint32 *)(&temp[3]) = fp16_to_float(fp16[3]);
n = temp[0] * temp[0] + temp[1] * temp[1] + temp[2] * temp[2] + temp[3] * temp[3];
n = sqrtf(n);
if(n > 0.001f) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խӽ<D4BD>0<EFBFBD><30>ֵ
{
n = temp[3] < 0.0f ? -n : n;
quat[0] = temp[1] / n;
quat[1] = temp[2] / n;
quat[2] = temp[0] / n;
quat[3] = temp[3] / n;
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><>Ԫ<EFBFBD><D4AA>תŷ<D7AA><C5B7><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static void quarternion_to_euler(float quat[4], float *roll, float *pitch, float *yaw)
{
float euler[3];
float sqx = quat[0] * quat[0];
float sqy = quat[1] * quat[1];
float sqz = quat[2] * quat[2];
euler[0] = atan2f(2.0f * (quat[1] * quat[3] + quat[0] * quat[2]), 1.0f - 2.0f * (sqy + sqx));
euler[1] = -asinf(2.0f * (quat[0] * quat[3] - quat[1] * quat[2]));
euler[2] = atan2f(2.0f * (quat[0] * quat[1] + quat[2] * quat[3]), 1.0f - 2.0f * (sqx + sqz));
// <20><><EFBFBD><EFBFBD>ת<EFBFBD>Ƕ<EFBFBD>
euler[0] = 180 * (euler[0]) / M_PI;
euler[1] = 180 * (euler[1]) / M_PI;
euler[2] = 180 * (euler[2]) / M_PI;
// <20>Ƕȵ<C7B6><C8B5><EFBFBD>
euler[2] = 0 > euler[2] ? euler[2] + 360 : euler[2];
*roll = euler[0];
*pitch = euler[1];
*yaw = euler[2];
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static void imu660rc_set_mem_bank (imu660rc_mem_bank_enum bank)
{
imu660rc_write_register(IMU660RC_FUNC_CFG_ACCESS, bank);
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20>Լ<EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 1-<2D>Լ<EFBFBD>ʧ<EFBFBD><CAA7> 0-<2D>Լ<EFBFBD><D4BC>ɹ<EFBFBD>
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_self_check();
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static uint8 imu660rc_self_check (void)
{
uint8 dat = 0, return_state = 0;
uint16 timeout_count = 0;
do
{
if(IMU660RC_TIMEOUT_COUNT < timeout_count ++)
{
return_state = 1;
break;
}
dat = imu660rc_read_register(IMU660RC_CHIP_ID);
system_delay_ms(1);
}while(0x70 != dat); // <20><>ȡ<EFBFBD>豸ID<49>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>0x70<37><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x70<37><30><EFBFBD><EFBFBD>Ϊû<CEAA><C3BB><EFBFBD><EFBFBD>
return return_state;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȡ IMU660RC <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_get_acc(); // ִ<>иú<D0B8><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӳ鿴<D3B2><E9BFB4>Ӧ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ע<EFBFBD><D7A2>Ϣ ʹ<><CAB9> SPI <20>IJɼ<C4B2>ʱ<EFBFBD><CAB1>Ϊ10us
//-------------------------------------------------------------------------------------------------------------------
void imu660rc_get_acc (void)
{
int16 dat[3];
if(IMU660RC_QUARTERNION_DISABLE == imu660rc_quarternion_rate)
{ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ر<EFBFBD>״̬<D7B4><CCAC>֧<EFBFBD>ֵ<EFBFBD><D6B5>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD> <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD>Ϣ<EFBFBD><CFA2>IMU660RC_QUARTERNION_GET_ACC<43><43><EFBFBD><EFBFBD>Ϊ1
imu660rc_read_registers(IMU660RC_OUTX_L_A, (uint8 *)dat, 6);
imu660rc_acc_x = dat[0];
imu660rc_acc_y = dat[1];
imu660rc_acc_z = dat[2];
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȡ IMU660RC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_get_gyro(); // ִ<>иú<D0B8><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӳ鿴<D3B2><E9BFB4>Ӧ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ע<EFBFBD><D7A2>Ϣ ʹ<><CAB9> SPI <20>IJɼ<C4B2>ʱ<EFBFBD><CAB1>Ϊ10us
//-------------------------------------------------------------------------------------------------------------------
void imu660rc_get_gyro (void)
{
int16 dat[3];
if(IMU660RC_QUARTERNION_DISABLE == imu660rc_quarternion_rate)
{ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ر<EFBFBD>״̬<D7B4><CCAC>֧<EFBFBD>ֵ<EFBFBD><D6B5>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD> <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD>Ϣ<EFBFBD><CFA2>IMU660RC_QUARTERNION_GET_GYRO<52><4F><EFBFBD><EFBFBD>Ϊ1
imu660rc_read_registers(IMU660RC_OUTX_L_G, (uint8 *)dat, 6);
imu660rc_gyro_x = dat[0];
imu660rc_gyro_y = dat[1];
imu660rc_gyro_z = dat[2];
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȡ IMU660RC <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD>ת<EFBFBD><D7AA>Ϊŷ<CEAA><C5B7><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_get_quarternion(); // ִ<>иú<D0B8><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӳ鿴<D3B2><E9BFB4>Ӧ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ע<EFBFBD><D7A2>Ϣ <20><>Ҫ<EFBFBD><D2AA>INT2<54><32><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϵ<D0B6><CFB5>ô˺<C3B4><CBBA><EFBFBD>
//
//-------------------------------------------------------------------------------------------------------------------
void imu660rc_get_quarternion(void)
{
uint8 i;
uint16 buff[4];
uint8 *buff1_ptr;
int16 *buff2_ptr;
if(IMU660RC_QUARTERNION_DISABLE != imu660rc_quarternion_rate)
{
buff1_ptr = (uint8 *)buff;
imu660rc_set_mem_bank(IMU660RC_EMBED_MEM_BANK);
imu660rc_write_register(IMU660RC_PAGE_RW, 0x20);
imu660rc_write_register(IMU660RC_PAGE_SEL, 0x31);
for(i = 0; 8 > i; i++)
{
imu660rc_write_register(0x08, 0x4C + i);
buff1_ptr[i] = imu660rc_read_register(0x09);
}
imu660rc_write_register(IMU660RC_PAGE_RW, 0x0);
imu660rc_set_mem_bank(IMU660RC_MAIN_MEM_BANK);
// <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
quarternion_normalize(imu660rc_quarternion, buff);
// <20><>Ԫ<EFBFBD><D4AA>תŷ<D7AA><C5B7><EFBFBD><EFBFBD>
quarternion_to_euler(imu660rc_quarternion, &imu660rc_roll, &imu660rc_pitch, &imu660rc_yaw);
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD>Ϣ
#if(1 == IMU660RC_QUARTERNION_GET_ACC)
{
buff2_ptr = (int16 *)buff;
imu660rc_read_registers(IMU660RC_OUTX_L_A, (uint8 *)buff2_ptr, 6);
imu660rc_acc_x = buff2_ptr[0];
imu660rc_acc_y = buff2_ptr[1];
imu660rc_acc_z = buff2_ptr[2];
}
#endif
#if(1 == IMU660RC_QUARTERNION_GET_GYRO)
{
buff2_ptr = (int16 *)buff;
imu660rc_read_registers(IMU660RC_OUTX_L_G, (uint8 *)buff2_ptr, 6);
imu660rc_gyro_x = buff2_ptr[0];
imu660rc_gyro_y = buff2_ptr[1];
imu660rc_gyro_z = buff2_ptr[2];
}
#endif
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC<52>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ж<EFBFBD><D0B6>ڶ<EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
// <20><>ע<EFBFBD><D7A2>Ϣ
//
//-------------------------------------------------------------------------------------------------------------------
void imu660rc_callback(void)
{
imu660rc_get_quarternion();
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʼ<EFBFBD><CABC> IMU660RC
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> quarternion_rate ѡ<><D1A1><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 1-<2D><>ʼ<EFBFBD><CABC>ʧ<EFBFBD><CAA7> 0-<2D><>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_init(IMU660RC_QUARTERNION_120HZ);
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
uint8 imu660rc_init(imu660rc_quarternion_rate_config quarternion_rate)
{
uint8 return_state = 0;
imu660rc_quarternion_rate = quarternion_rate;
#if IMU660RC_USE_SOFT_IIC
soft_iic_init(&imu660rc_iic_struct, IMU660RC_DEV_ADDR, IMU660RC_SOFT_IIC_DELAY, IMU660RC_SCL_PIN, IMU660RC_SDA_PIN); // <20><><EFBFBD><EFBFBD> IMU660RC <20><> IIC <20>˿<EFBFBD>
#else
spi_init(IMU660RC_SPI, SPI_MODE0, IMU660RC_SPI_SPEED, IMU660RC_SPC_PIN, IMU660RC_SDI_PIN, IMU660RC_SDO_PIN, SPI_CS_NULL); // <20><><EFBFBD><EFBFBD> IMU660RC <20><> SPI <20>˿<EFBFBD>
gpio_init(IMU660RC_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // <20><><EFBFBD><EFBFBD> IMU660RC <20><>CS<43>˿<EFBFBD>
#endif
system_delay_ms(10);
do
{
if(imu660rc_self_check()) // IMU660RC <20>Լ<EFBFBD>
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><CBB6><EFBFBD><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ô<EFBFBD><C3B4><EFBFBD><EFBFBD> IMU660RC <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD>
// <20><><EFBFBD><EFBFBD>һ<EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE>ǻ<EFBFBD><C7BB><EFBFBD>
zf_log(0, "imu660rc self check error.");
return_state = 1;
break;
}
// <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
imu660rc_write_register(IMU660RC_FUNC_CFG_ACCESS, 0x04);
system_delay_ms(30);
// <20><><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>¹<EFBFBD><C2B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
imu660rc_write_register(IMU660RC_CTRL3, 0x44);
switch(IMU660RC_ACC_SAMPLE_DEFAULT)
{
default:
{
zf_log(0, "IMU660RC_ACC_SAMPLE_DEFAULT set error.");
return_state = 1;
}break;
case IMU660RC_ACC_SAMPLE_SGN_2G:
{
imu660rc_write_register(IMU660RC_CTRL8, 0x00);
imu660rc_transition_factor[0] = 16393.44;
}break;
case IMU660RC_ACC_SAMPLE_SGN_4G:
{
imu660rc_write_register(IMU660RC_CTRL8, 0x01);
imu660rc_transition_factor[0] = 8196.72;
}break;
case IMU660RC_ACC_SAMPLE_SGN_8G:
{
imu660rc_write_register(IMU660RC_CTRL8, 0x02);
imu660rc_transition_factor[0] = 4098.36;
}break;
case IMU660RC_ACC_SAMPLE_SGN_16G:
{
imu660rc_write_register(IMU660RC_CTRL8, 0x03);
imu660rc_transition_factor[0] = 2049.18;
}break;
}
if(1 == return_state)
{
break;
}
switch(IMU660RC_GYRO_SAMPLE_DEFAULT)
{
default:
{
zf_log(0, "IMU660RC_GYRO_SAMPLE_DEFAULT set error.");
return_state = 1;
}break;
case IMU660RC_GYRO_SAMPLE_SGN_125DPS:
{
imu660rc_write_register(IMU660RC_CTRL6, 0x00);
imu660rc_transition_factor[1] = 228.5714;
}break;
case IMU660RC_GYRO_SAMPLE_SGN_250DPS:
{
imu660rc_write_register(IMU660RC_CTRL6, 0x01);
imu660rc_transition_factor[1] = 114.2857;
}break;
case IMU660RC_GYRO_SAMPLE_SGN_500DPS:
{
imu660rc_write_register(IMU660RC_CTRL6, 0x02);
imu660rc_transition_factor[1] = 57.1428;
}break;
case IMU660RC_GYRO_SAMPLE_SGN_1000DPS:
{
imu660rc_write_register(IMU660RC_CTRL6, 0x03);
imu660rc_transition_factor[1] = 28.5714;
}break;
case IMU660RC_GYRO_SAMPLE_SGN_2000DPS:
{
imu660rc_write_register(IMU660RC_CTRL6, 0x04);
imu660rc_transition_factor[1] = 14.2857;
}break;
case IMU660RC_GYRO_SAMPLE_SGN_4000DPS:
{
imu660rc_write_register(IMU660RC_CTRL6, 0x0C);
imu660rc_transition_factor[1] = 7.14285;
}break;
}
if(1 == return_state)
{
break;
}
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>߾<EFBFBD><DFBE><EFBFBD>ģʽ<C4A3>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
imu660rc_write_register(IMU660RC_CTRL1, 0x15);
imu660rc_write_register(IMU660RC_CTRL2, 0x18);
// <20><><EFBFBD><EFBFBD>LPF1<46>˲<EFBFBD><CBB2><EFBFBD>
imu660rc_write_register(IMU660RC_CTRL7, 0x01);
// <20><><EFBFBD><EFBFBD>LPF2<46>˲<EFBFBD><CBB2><EFBFBD>
imu660rc_write_register(IMU660RC_CTRL9, 0x08);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
if(IMU660RC_QUARTERNION_DISABLE != quarternion_rate)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD>ź<EFBFBD>
imu660rc_write_register(IMU660RC_INT2_CTRL, 0x80);
imu660rc_write_register(IMU660RC_CTRL4, 0x08);
imu660rc_write_register(IMU660RC_EMB_FUNC_CFG, 0x30);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC>ٶȡ<D9B6><C8A1><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
imu660rc_write_register(IMU660RC_CTRL1, 0x10 | (quarternion_rate + 3));
imu660rc_write_register(IMU660RC_CTRL2, 0x10 | (quarternion_rate + 3));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʲ<EFBFBD><CAB2><EFBFBD><EFBFBD><EFBFBD>
imu660rc_set_mem_bank(IMU660RC_EMBED_MEM_BANK);
imu660rc_write_register(IMU660RC_SFLP_ODR, 0x43 | (quarternion_rate << 3));
imu660rc_write_register(IMU660RC_EMB_FUNC_EN_A, 0x02);
imu660rc_write_register(IMU660RC_PAGE_RW, 0x00);
imu660rc_set_mem_bank(IMU660RC_MAIN_MEM_BANK);
// <20><><EFBFBD><EFBFBD><EFBFBD>жϼ<D0B6><CFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
exti_init(ERU_CH0_REQ0_P15_4, EXTI_TRIGGER_RISING);
}
}while(0);
return return_state;
}

View File

@@ -0,0 +1,211 @@
/*********************************************************************************************************************
* RT1064DVL6A Opensourec Library <20><><EFBFBD><EFBFBD>RT1064DVL6A <20><>Դ<EFBFBD><EFBFBD><E2A3A9>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڹٷ<DAB9> SDK <20>ӿڵĵ<DAB5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>
* Copyright (c) 2022 SEEKFREE <20><><EFBFBD>ɿƼ<C9BF>
*
* <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD> RT1064DVL6A <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
*
* RT1064DVL6A <20><>Դ<EFBFBD><D4B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B7A2><EFBFBD><EFBFBD> GPL<50><4C>GNU General Public License<73><65><EFBFBD><EFBFBD> GNUͨ<55>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><> GPL <20>ĵ<EFBFBD>3<EFBFBD><EFBFBD><E6A3A8> GPL3.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>κκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ汾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>޸<EFBFBD><DEB8><EFBFBD>
*
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κεı<CEB5>֤
* <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB>ʺ<EFBFBD><CABA>ض<EFBFBD><D8B6><EFBFBD>;<EFBFBD>ı<EFBFBD>֤
* <20><><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> GPL
*
* <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ͬʱ<CDAC>յ<EFBFBD>һ<EFBFBD><D2BB> GPL <20>ĸ<EFBFBD><C4B8><EFBFBD>
* <20><><EFBFBD><EFBFBD>û<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><https://www.gnu.org/licenses/>
*
* <20><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>ʹ<EFBFBD><CAB9> GPL3.0 <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>֤Э<D6A4><D0AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>İ汾
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD>İ<EFBFBD><C4B0><EFBFBD> libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> GPL3_permission_statement.txt <20>ļ<EFBFBD><C4BC><EFBFBD>
* <20><><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> libraries <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> LICENSE <20>ļ<EFBFBD>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> zf_device_imu660rc
* <20><>˾<EFBFBD><CBBE><EFBFBD><EFBFBD> <20>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* <20><EFBFBD><E6B1BE>Ϣ <20>鿴 libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> version <20>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADS v1.10.2
* <20><><EFBFBD><EFBFBD>ƽ̨ TC264
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> https://seekfree.taobao.com/
*
* <20>޸ļ<DEB8>¼
* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ע
* 2025-12-12 SeekFree first version
********************************************************************************************************************/
/*********************************************************************************************************************
* <20><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <20><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* // Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SPC_PIN <20><EFBFBD><EAB6A8>
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDI_PIN <20><EFBFBD><EAB6A8>
* SA0/SDO <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDO_PIN <20><EFBFBD><EAB6A8>
* CS <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_CS_PIN <20><EFBFBD><EAB6A8>
* INT2 <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_INT2_PIN <20><EFBFBD><EAB6A8>
* VCC 3.3V<EFBFBD><EFBFBD>Դ
* GND <20><>Դ<EFBFBD><D4B4>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* // <20><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SCL_PIN <20><EFBFBD><EAB6A8>
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDA_PIN <20><EFBFBD><EAB6A8>
* VCC 3.3V<EFBFBD><EFBFBD>Դ
* GND <20><>Դ<EFBFBD><D4B4>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ------------------------------------
********************************************************************************************************************/
#ifndef _zf_device_imu660rc_h_
#define _zf_device_imu660rc_h_
#include "zf_common_typedef.h"
// IMU660RC_USE_SOFT_IIC<49><43><EFBFBD><EFBFBD>Ϊ0<CEAA><30>ʾʹ<CABE><CAB9>Ӳ<EFBFBD><D3B2>SPI<50><49><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ϊ1<CEAA><31>ʾʹ<CABE><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IIC<49><43><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IMU660RC_USE_SOFT_IIC<49><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȱ<EFBFBD><C8B1><EFBFBD><EBB2A2><EFBFBD>س<EFBFBD><D8B3>򣬵<EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ҫ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨѶ
#define IMU660RC_USE_SOFT_IIC ( 0 ) // Ĭ<><C4AC>ʹ<EFBFBD><CAB9>Ӳ<EFBFBD><D3B2> SPI <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
#if IMU660RC_USE_SOFT_IIC // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7> <20><>ɫ<EFBFBD>ҵľ<D2B5><C4BE><EFBFBD>û<EFBFBD><C3BB><EFBFBD>õ<EFBFBD>
//====================================================<3D><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>====================================================
#define IMU660RC_SOFT_IIC_DELAY ( 0 ) // <20><><EFBFBD><EFBFBD> IIC <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> <20><>ֵԽС IIC ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>
#define IMU660RC_SCL_PIN ( P20_11 ) // <20><><EFBFBD><EFBFBD> IIC SCL <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IMU660RC <20><> SCL <20><><EFBFBD><EFBFBD>
#define IMU660RC_SDA_PIN ( P20_14 ) // <20><><EFBFBD><EFBFBD> IIC SDA <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IMU660RC <20><> SDA <20><><EFBFBD><EFBFBD>
//====================================================<3D><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>====================================================
#else
//====================================================Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>====================================================
#define IMU660RC_SPI_SPEED (10 * 1000 * 1000) // Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>
#define IMU660RC_SPI (SPI_0) // Ӳ<><D3B2> SPI <20><>
#define IMU660RC_SPC_PIN (SPI0_SCLK_P20_11 ) // Ӳ<><D3B2> SPI SCK <20><><EFBFBD><EFBFBD>
#define IMU660RC_SDI_PIN (SPI0_MOSI_P20_14) // Ӳ<><D3B2> SPI MOSI <20><><EFBFBD><EFBFBD>
#define IMU660RC_SDO_PIN (SPI0_MISO_P20_12) // Ӳ<><D3B2> SPI MISO <20><><EFBFBD><EFBFBD>
//====================================================Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>====================================================
#endif
#define IMU660RC_CS_PIN ( P20_13 ) // CS Ƭѡ<C6AC><D1A1><EFBFBD><EFBFBD>
#define IMU660RC_CS(x) ( (x) ? (gpio_high(IMU660RC_CS_PIN)) : (gpio_low(IMU660RC_CS_PIN)) )
#define IMU660RC_INT2_PIN ( ERU_CH0_REQ0_P15_4 ) // <20>ж<EFBFBD><D0B6>ź<EFBFBD><C5BA><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3>ڶ<EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>ʱ<EFBFBD><CAB1>Ҫʹ<D2AA><CAB9>
#define IMU660RC_QUARTERNION_GET_GYRO ( 1 ) // 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ
#define IMU660RC_QUARTERNION_GET_ACC ( 1 ) // 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ
#define IMU660RC_ACC_SAMPLE_DEFAULT ( IMU660RC_ACC_SAMPLE_SGN_8G ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵ<EFBFBD> <20><><EFBFBD>ٶȼ<D9B6> <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define IMU660RC_GYRO_SAMPLE_DEFAULT ( IMU660RC_GYRO_SAMPLE_SGN_2000DPS ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef enum
{
IMU660RC_MAIN_MEM_BANK = 0x00,
IMU660RC_HUB_MEM_BANK = 0x40,
IMU660RC_EMBED_MEM_BANK = 0x80,
}imu660rc_mem_bank_enum;
typedef enum
{
IMU660RC_ACC_SAMPLE_SGN_2G , // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>2G (ACC = Accelerometer <20><><EFBFBD>ٶȼ<D9B6>) (SGN = signum <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ) (G = g <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD> g<><67>9.80 m/s^2)
IMU660RC_ACC_SAMPLE_SGN_4G , // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>4G
IMU660RC_ACC_SAMPLE_SGN_8G , // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>8G
IMU660RC_ACC_SAMPLE_SGN_16G, // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>16G
}imu660rc_acc_sample_config;
typedef enum
{
IMU660RC_GYRO_SAMPLE_SGN_125DPS , // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>125DPS (GYRO = Gyroscope <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) (SGN = signum <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ) (DPS = Degree Per Second <20><><EFBFBD>ٶȵ<D9B6>λ <20><>/S)
IMU660RC_GYRO_SAMPLE_SGN_250DPS , // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>250DPS
IMU660RC_GYRO_SAMPLE_SGN_500DPS , // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>500DPS
IMU660RC_GYRO_SAMPLE_SGN_1000DPS, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>1000DPS
IMU660RC_GYRO_SAMPLE_SGN_2000DPS, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>2000DPS
IMU660RC_GYRO_SAMPLE_SGN_4000DPS, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>4000DPS
}imu660rc_gyro_sample_config;
typedef enum
{
IMU660RC_QUARTERNION_15HZ, // 15 Hz
IMU660RC_QUARTERNION_30HZ, // 30 Hz
IMU660RC_QUARTERNION_60HZ, // 60 Hz
IMU660RC_QUARTERNION_120HZ, // 120Hz
IMU660RC_QUARTERNION_240HZ, // 240Hz
IMU660RC_QUARTERNION_480HZ, // 480Hz
IMU660RC_QUARTERNION_DISABLE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}imu660rc_quarternion_rate_config;
//================================================<3D><><EFBFBD><EFBFBD> IMU660RC <20>ڲ<EFBFBD><DAB2><EFBFBD>ַ================================================
#define IMU660RC_DEV_ADDR ( 0x6B ) // SA0<41>ӵأ<D3B5>0x6A SA0<41><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x6B ģ<><C4A3>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define IMU660RC_SPI_W ( 0x00 )
#define IMU660RC_SPI_R ( 0x80 )
#define IMU660RC_TIMEOUT_COUNT ( 0x00FF ) // IMU660RC <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
//================================================<3D><><EFBFBD><EFBFBD> IMU660RC <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ================================================
#define IMU660RC_FUNC_CFG_ACCESS ( 0x01 )
#define IMU660RC_INT2_CTRL ( 0x0E )
#define IMU660RC_CHIP_ID ( 0x0F )
#define IMU660RC_CTRL1 ( 0x10 )
#define IMU660RC_CTRL2 ( 0x11 )
#define IMU660RC_CTRL3 ( 0x12 )
#define IMU660RC_CTRL4 ( 0x13 )
#define IMU660RC_CTRL5 ( 0x14 )
#define IMU660RC_CTRL6 ( 0x15 )
#define IMU660RC_CTRL7 ( 0x16 )
#define IMU660RC_CTRL8 ( 0x17 )
#define IMU660RC_CTRL9 ( 0x18 )
#define IMU660RC_CTRL10 ( 0x19 )
#define IMU660RC_CTRL_STATUS ( 0x1A )
#define IMU660RC_STATUS_REG ( 0x1E )
#define IMU660RC_OUT_TEMP_L ( 0x20 )
#define IMU660RC_OUT_TEMP_H ( 0x21 )
#define IMU660RC_OUTX_L_G ( 0x22 )
#define IMU660RC_OUTX_H_G ( 0x23 )
#define IMU660RC_OUTY_L_G ( 0x24 )
#define IMU660RC_OUTY_H_G ( 0x25 )
#define IMU660RC_OUTZ_L_G ( 0x26 )
#define IMU660RC_OUTZ_H_G ( 0x27 )
#define IMU660RC_OUTX_L_A ( 0x28 )
#define IMU660RC_OUTX_H_A ( 0x29 )
#define IMU660RC_OUTY_L_A ( 0x2A )
#define IMU660RC_OUTY_H_A ( 0x2B )
#define IMU660RC_OUTZ_L_A ( 0x2C )
#define IMU660RC_OUTZ_H_A ( 0x2D )
#define IMU660RC_PAGE_SEL ( 0x02 )
#define IMU660RC_EMB_FUNC_EN_A ( 0x04 )
#define IMU660RC_PAGE_RW ( 0x17 )
#define IMU660RC_SFLP_ODR ( 0x5E )
#define IMU660RC_EMB_FUNC_CFG ( 0x63 )
extern float imu660rc_transition_factor[2];
extern int16 imu660rc_gyro_x, imu660rc_gyro_y, imu660rc_gyro_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
extern int16 imu660rc_acc_x , imu660rc_acc_y , imu660rc_acc_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>
extern float imu660rc_roll , imu660rc_pitch , imu660rc_yaw; // ŷ<><C5B7><EFBFBD><EFBFBD>
extern float imu660rc_quarternion[4]; // <20><>Ԫ<EFBFBD><D4AA>
void imu660rc_get_acc (void);
void imu660rc_get_gyro (void);
void imu660rc_get_quarternion (void);
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> IMU660RC <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊʵ<CEAA><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> acc_value <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> float data = imu660rc_acc_transition(imu660rc_acc_x); // <20><>λΪ g(m/s^2)
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
#define imu660rc_acc_transition(acc_value) ((float)(acc_value) / imu660rc_transition_factor[0])
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> IMU660RC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊʵ<CEAA><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> gyro_value <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> float data = imu660rc_gyro_transition(imu660rc_gyro_x); // <20><>λΪ <20><>/s
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
#define imu660rc_gyro_transition(gyro_value) ((float)(gyro_value) / imu660rc_transition_factor[1])
void imu660rc_callback (void);
uint8 imu660rc_init (imu660rc_quarternion_rate_config quarternion_rate);
#endif

View File

@@ -97,7 +97,7 @@
//================================================<3D><><EFBFBD><EFBFBD> IMU660RX ȫ<>ֱ<EFBFBD><D6B1><EFBFBD>================================================ //================================================<3D><><EFBFBD><EFBFBD> IMU660RX ȫ<>ֱ<EFBFBD><D6B1><EFBFBD>================================================
extern int16 imu660rx_gyro_x, imu660rx_gyro_y, imu660rx_gyro_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> gyro (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) extern int16 imu660rx_gyro_x, imu660rx_gyro_y, imu660rx_gyro_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> gyro (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
extern int16 imu660rx_acc_x, imu660rx_acc_y, imu660rx_acc_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> acc (accelerometer <20><><EFBFBD>ٶȼ<D9B6>) extern int16 imu660rx_acc_x, imu660rx_acc_y, imu660rx_acc_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> acc (accelerometer <20><><EFBFBD>ٶȼ<D9B6>)
extern float imu660ra_transition_factor[2]; extern float imu660rx_transition_factor[2];
//================================================<3D><><EFBFBD><EFBFBD> IMU660RX ȫ<>ֱ<EFBFBD><D6B1><EFBFBD>================================================ //================================================<3D><><EFBFBD><EFBFBD> IMU660RX ȫ<>ֱ<EFBFBD><D6B1><EFBFBD>================================================

View File

@@ -49,7 +49,6 @@ int core0_main(void)
// <20>˴<EFBFBD><CBB4><EFBFBD>д<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // <20>˴<EFBFBD><CBB4><EFBFBD>д<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cpu_wait_event_ready(); // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>к<EFBFBD><D0BA>ij<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> cpu_wait_event_ready(); // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>к<EFBFBD><D0BA>ij<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while (TRUE) while (TRUE)

View File

@@ -90,6 +90,7 @@ IFX_INTERRUPT(exti_ch0_ch4_isr, 0, EXTI_CH0_CH4_INT_PRIO)
// ע<><D7A2>: <20><><EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ <20>벻Ҫ<EBB2BB><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // ע<><D7A2>: <20><><EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ <20>벻Ҫ<EBB2BB><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ע<><D7A2>: <20><><EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ <20>벻Ҫ<EBB2BB><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // ע<><D7A2>: <20><><EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ <20>벻Ҫ<EBB2BB><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ע<><D7A2>: <20><><EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ <20>벻Ҫ<EBB2BB><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // ע<><D7A2>: <20><><EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD> <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ <20>벻Ҫ<EBB2BB><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
imu660rc_callback(); // 660RC ģ<><C4A3> INT <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>

View File

@@ -1,3 +1,5 @@
V3.4.3
<09><><EFBFBD><EFBFBD>660RC<52><43><EFBFBD><EFBFBD>
V3.4.2 V3.4.2
<09>޸<EFBFBD>printf<74>ض<EFBFBD><D8B6><EFBFBD><EFBFBD>еĺ궨<C4BA><EAB6A8> <09>޸<EFBFBD>printf<74>ض<EFBFBD><D8B6><EFBFBD><EFBFBD>еĺ궨<C4BA><EAB6A8>
<09><><EFBFBD><EFBFBD>WIFI_SPI<50><49><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD>WIFI_SPI<50><49><EFBFBD><EFBFBD>

View File

@@ -91,6 +91,7 @@
#include "zf_device_imu660ra.h" #include "zf_device_imu660ra.h"
#include "zf_device_imu660rb.h" #include "zf_device_imu660rb.h"
#include "zf_device_imu660rx.h" #include "zf_device_imu660rx.h"
#include "zf_device_imu660rc.h"
#include "zf_device_imu963ra.h" #include "zf_device_imu963ra.h"
#include "zf_device_ips114.h" #include "zf_device_ips114.h"
#include "zf_device_ips200.h" #include "zf_device_ips200.h"

View File

@@ -0,0 +1,563 @@
/*********************************************************************************************************************
* RT1064DVL6A Opensourec Library <20><><EFBFBD><EFBFBD>RT1064DVL6A <20><>Դ<EFBFBD><EFBFBD><E2A3A9>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڹٷ<DAB9> SDK <20>ӿڵĵ<DAB5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>
* Copyright (c) 2022 SEEKFREE <20><><EFBFBD>ɿƼ<C9BF>
*
* <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD> RT1064DVL6A <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
*
* RT1064DVL6A <20><>Դ<EFBFBD><D4B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B7A2><EFBFBD><EFBFBD> GPL<50><4C>GNU General Public License<73><65><EFBFBD><EFBFBD> GNUͨ<55>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><> GPL <20>ĵ<EFBFBD>3<EFBFBD><EFBFBD><E6A3A8> GPL3.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>κκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ汾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>޸<EFBFBD><DEB8><EFBFBD>
*
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κεı<CEB5>֤
* <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB>ʺ<EFBFBD><CABA>ض<EFBFBD><D8B6><EFBFBD>;<EFBFBD>ı<EFBFBD>֤
* <20><><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> GPL
*
* <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ͬʱ<CDAC>յ<EFBFBD>һ<EFBFBD><D2BB> GPL <20>ĸ<EFBFBD><C4B8><EFBFBD>
* <20><><EFBFBD><EFBFBD>û<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><https://www.gnu.org/licenses/>
*
* <20><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>ʹ<EFBFBD><CAB9> GPL3.0 <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>֤Э<D6A4><D0AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>İ汾
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD>İ<EFBFBD><C4B0><EFBFBD> libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> GPL3_permission_statement.txt <20>ļ<EFBFBD><C4BC><EFBFBD>
* <20><><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> libraries <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> LICENSE <20>ļ<EFBFBD>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> zf_device_imu660rc
* <20><>˾<EFBFBD><CBBE><EFBFBD><EFBFBD> <20>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* <20><EFBFBD><E6B1BE>Ϣ <20>鿴 libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> version <20>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADS v1.10.2
* <20><><EFBFBD><EFBFBD>ƽ̨ TC264
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> https://seekfree.taobao.com/
*
* <20>޸ļ<DEB8>¼
* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ע
* 2025-12-12 SeekFree first version
********************************************************************************************************************/
/*********************************************************************************************************************
* <20><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <20><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* // Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SPC_PIN <20><EFBFBD><EAB6A8>
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDI_PIN <20><EFBFBD><EAB6A8>
* SA0/SDO <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDO_PIN <20><EFBFBD><EAB6A8>
* CS <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_CS_PIN <20><EFBFBD><EAB6A8>
* INT2 <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_INT2_PIN <20><EFBFBD><EAB6A8>
* VCC 3.3V<EFBFBD><EFBFBD>Դ
* GND <20><>Դ<EFBFBD><D4B4>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* // <20><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SCL_PIN <20><EFBFBD><EAB6A8>
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDA_PIN <20><EFBFBD><EAB6A8>
* VCC 3.3V<EFBFBD><EFBFBD>Դ
* GND <20><>Դ<EFBFBD><D4B4>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ------------------------------------
********************************************************************************************************************/
#include "math.h"
#include "zf_common_debug.h"
#include "zf_driver_delay.h"
#include "zf_driver_spi.h"
#include "zf_driver_gpio.h"
#include "zf_driver_soft_iic.h"
#include "zf_device_config.h"
#include "zf_driver_uart.h"
#include "zf_driver_exti.h"
#include "zf_device_imu660rc.h"
#ifndef M_PI
#define M_PI 3.1415926f
#endif
static uint8 imu660rc_quarternion_rate;
float imu660rc_transition_factor[2];
int16 imu660rc_gyro_x = 0, imu660rc_gyro_y = 0, imu660rc_gyro_z = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> gyro (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
int16 imu660rc_acc_x = 0, imu660rc_acc_y = 0, imu660rc_acc_z = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> acc (accelerometer <20><><EFBFBD>ٶȼ<D9B6>)
float imu660rc_roll = 0, imu660rc_pitch = 0, imu660rc_yaw = 0; // ŷ<><C5B7><EFBFBD><EFBFBD>
float imu660rc_quarternion[4]; // <20><>Ԫ<EFBFBD><D4AA>
#if IMU660RC_USE_SOFT_IIC
static soft_iic_info_struct imu660rc_iic_struct;
#define imu660rc_write_register(reg, data) (soft_iic_write_8bit_register (&imu660rc_iic_struct, (reg), (data)))
#define imu660rc_write_registers(reg, data, len) (soft_iic_write_8bit_registers(&imu660rc_iic_struct, (reg), (data), (len)))
#define imu660rc_read_register(reg) (soft_iic_read_8bit_register (&imu660rc_iic_struct, (reg)))
#define imu660rc_read_registers(reg, data, len) (soft_iic_read_8bit_registers (&imu660rc_iic_struct, (reg), (data), (len)))
#else
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC д<>Ĵ<EFBFBD><C4B4><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> reg <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static void imu660rc_write_register (uint8 reg, uint8 data)
{
IMU660RC_CS(0);
spi_write_8bit_register(IMU660RC_SPI, reg | IMU660RC_SPI_W, data);
IMU660RC_CS(1);
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> reg <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 <20><><EFBFBD><EFBFBD>
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_read_register(IMU660RC_CHIP_ID);
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static uint8 imu660rc_read_register (uint8 reg)
{
uint8 data;
IMU660RC_CS(0);
data = spi_read_8bit_register(IMU660RC_SPI, reg | IMU660RC_SPI_R);
IMU660RC_CS(1);
return data;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> reg <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> data <20><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> len <20><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_read_registers(IMU660RC_ACC_ADDRESS, dat, 6);
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static void imu660rc_read_registers (uint8 reg, uint8 *data, uint32 len)
{
IMU660RC_CS(0);
spi_read_8bit_registers(IMU660RC_SPI, reg | IMU660RC_SPI_R, data, len);
IMU660RC_CS(1);
}
#endif
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC fp16ת<36><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static uint32 fp16_to_float(uint16 h)
{
uint16 h_exp = (h & 0x7c00u);
uint32 f_sgn = ((uint32)h & 0x8000u) << 16;
switch (h_exp)
{
case 0x0000u: // 0 or subnormal
{
uint16 h_sig = (h & 0x03ffu);
// Signed zero
if (h_sig == 0)
{
return f_sgn;
}
// Subnormal
h_sig <<= 1;
while ((h_sig & 0x0400u) == 0)
{
h_sig <<= 1;
h_exp++;
}
uint32 f_exp = ((uint32)(127 - 15 - h_exp)) << 23;
uint32 f_sig = ((uint32)(h_sig & 0x03ffu)) << 13;
return f_sgn + f_exp + f_sig;
}
case 0x7c00u: // inf or NaN
{
// All-ones exponent and a copy of the significand
return f_sgn + 0x7f800000u + (((uint32)(h & 0x03ffu)) << 13);
}
default: // normalized
{
// Just need to adjust the exponent and shift
return f_sgn + (((uint32)(h & 0x7fffu) + 0x1c000u) << 13);
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static void quarternion_normalize(float quat[4], uint16 *fp16)
{
float n = 0;
float temp[4];
*(uint32 *)(&temp[0]) = fp16_to_float(fp16[0]);
*(uint32 *)(&temp[1]) = fp16_to_float(fp16[1]);
*(uint32 *)(&temp[2]) = fp16_to_float(fp16[2]);
*(uint32 *)(&temp[3]) = fp16_to_float(fp16[3]);
n = temp[0] * temp[0] + temp[1] * temp[1] + temp[2] * temp[2] + temp[3] * temp[3];
n = sqrtf(n);
if(n > 0.001f) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խӽ<D4BD>0<EFBFBD><30>ֵ
{
n = temp[3] < 0.0f ? -n : n;
quat[0] = temp[1] / n;
quat[1] = temp[2] / n;
quat[2] = temp[0] / n;
quat[3] = temp[3] / n;
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><>Ԫ<EFBFBD><D4AA>תŷ<D7AA><C5B7><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static void quarternion_to_euler(float quat[4], float *roll, float *pitch, float *yaw)
{
float euler[3];
float sqx = quat[0] * quat[0];
float sqy = quat[1] * quat[1];
float sqz = quat[2] * quat[2];
euler[0] = atan2f(2.0f * (quat[1] * quat[3] + quat[0] * quat[2]), 1.0f - 2.0f * (sqy + sqx));
euler[1] = -asinf(2.0f * (quat[0] * quat[3] - quat[1] * quat[2]));
euler[2] = atan2f(2.0f * (quat[0] * quat[1] + quat[2] * quat[3]), 1.0f - 2.0f * (sqx + sqz));
// <20><><EFBFBD><EFBFBD>ת<EFBFBD>Ƕ<EFBFBD>
euler[0] = 180 * (euler[0]) / M_PI;
euler[1] = 180 * (euler[1]) / M_PI;
euler[2] = 180 * (euler[2]) / M_PI;
// <20>Ƕȵ<C7B6><C8B5><EFBFBD>
euler[2] = 0 > euler[2] ? euler[2] + 360 : euler[2];
*roll = euler[0];
*pitch = euler[1];
*yaw = euler[2];
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static void imu660rc_set_mem_bank (imu660rc_mem_bank_enum bank)
{
imu660rc_write_register(IMU660RC_FUNC_CFG_ACCESS, bank);
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC <20>Լ<EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 1-<2D>Լ<EFBFBD>ʧ<EFBFBD><CAA7> 0-<2D>Լ<EFBFBD><D4BC>ɹ<EFBFBD>
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_self_check();
// <20><>ע<EFBFBD><D7A2>Ϣ <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
static uint8 imu660rc_self_check (void)
{
uint8 dat = 0, return_state = 0;
uint16 timeout_count = 0;
do
{
if(IMU660RC_TIMEOUT_COUNT < timeout_count ++)
{
return_state = 1;
break;
}
dat = imu660rc_read_register(IMU660RC_CHIP_ID);
system_delay_ms(1);
}while(0x70 != dat); // <20><>ȡ<EFBFBD>豸ID<49>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>0x70<37><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x70<37><30><EFBFBD><EFBFBD>Ϊû<CEAA><C3BB><EFBFBD><EFBFBD>
return return_state;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȡ IMU660RC <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_get_acc(); // ִ<>иú<D0B8><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӳ鿴<D3B2><E9BFB4>Ӧ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ע<EFBFBD><D7A2>Ϣ ʹ<><CAB9> SPI <20>IJɼ<C4B2>ʱ<EFBFBD><CAB1>Ϊ10us
//-------------------------------------------------------------------------------------------------------------------
void imu660rc_get_acc (void)
{
int16 dat[3];
if(IMU660RC_QUARTERNION_DISABLE == imu660rc_quarternion_rate)
{ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ر<EFBFBD>״̬<D7B4><CCAC>֧<EFBFBD>ֵ<EFBFBD><D6B5>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD> <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD>Ϣ<EFBFBD><CFA2>IMU660RC_QUARTERNION_GET_ACC<43><43><EFBFBD><EFBFBD>Ϊ1
imu660rc_read_registers(IMU660RC_OUTX_L_A, (uint8 *)dat, 6);
imu660rc_acc_x = dat[0];
imu660rc_acc_y = dat[1];
imu660rc_acc_z = dat[2];
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȡ IMU660RC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_get_gyro(); // ִ<>иú<D0B8><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӳ鿴<D3B2><E9BFB4>Ӧ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ע<EFBFBD><D7A2>Ϣ ʹ<><CAB9> SPI <20>IJɼ<C4B2>ʱ<EFBFBD><CAB1>Ϊ10us
//-------------------------------------------------------------------------------------------------------------------
void imu660rc_get_gyro (void)
{
int16 dat[3];
if(IMU660RC_QUARTERNION_DISABLE == imu660rc_quarternion_rate)
{ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ر<EFBFBD>״̬<D7B4><CCAC>֧<EFBFBD>ֵ<EFBFBD><D6B5>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD> <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD>Ϣ<EFBFBD><CFA2>IMU660RC_QUARTERNION_GET_GYRO<52><4F><EFBFBD><EFBFBD>Ϊ1
imu660rc_read_registers(IMU660RC_OUTX_L_G, (uint8 *)dat, 6);
imu660rc_gyro_x = dat[0];
imu660rc_gyro_y = dat[1];
imu660rc_gyro_z = dat[2];
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȡ IMU660RC <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD>ת<EFBFBD><D7AA>Ϊŷ<CEAA><C5B7><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_get_quarternion(); // ִ<>иú<D0B8><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӳ鿴<D3B2><E9BFB4>Ӧ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ע<EFBFBD><D7A2>Ϣ <20><>Ҫ<EFBFBD><D2AA>INT2<54><32><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϵ<D0B6><CFB5>ô˺<C3B4><CBBA><EFBFBD>
//
//-------------------------------------------------------------------------------------------------------------------
void imu660rc_get_quarternion(void)
{
uint8 i;
uint16 buff[4];
uint8 *buff1_ptr;
int16 *buff2_ptr;
if(IMU660RC_QUARTERNION_DISABLE != imu660rc_quarternion_rate)
{
buff1_ptr = (uint8 *)buff;
imu660rc_set_mem_bank(IMU660RC_EMBED_MEM_BANK);
imu660rc_write_register(IMU660RC_PAGE_RW, 0x20);
imu660rc_write_register(IMU660RC_PAGE_SEL, 0x31);
for(i = 0; 8 > i; i++)
{
imu660rc_write_register(0x08, 0x4C + i);
buff1_ptr[i] = imu660rc_read_register(0x09);
}
imu660rc_write_register(IMU660RC_PAGE_RW, 0x0);
imu660rc_set_mem_bank(IMU660RC_MAIN_MEM_BANK);
// <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
quarternion_normalize(imu660rc_quarternion, buff);
// <20><>Ԫ<EFBFBD><D4AA>תŷ<D7AA><C5B7><EFBFBD><EFBFBD>
quarternion_to_euler(imu660rc_quarternion, &imu660rc_roll, &imu660rc_pitch, &imu660rc_yaw);
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD>Ϣ
#if(1 == IMU660RC_QUARTERNION_GET_ACC)
{
buff2_ptr = (int16 *)buff;
imu660rc_read_registers(IMU660RC_OUTX_L_A, (uint8 *)buff2_ptr, 6);
imu660rc_acc_x = buff2_ptr[0];
imu660rc_acc_y = buff2_ptr[1];
imu660rc_acc_z = buff2_ptr[2];
}
#endif
#if(1 == IMU660RC_QUARTERNION_GET_GYRO)
{
buff2_ptr = (int16 *)buff;
imu660rc_read_registers(IMU660RC_OUTX_L_G, (uint8 *)buff2_ptr, 6);
imu660rc_gyro_x = buff2_ptr[0];
imu660rc_gyro_y = buff2_ptr[1];
imu660rc_gyro_z = buff2_ptr[2];
}
#endif
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IMU660RC<52>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ж<EFBFBD><D0B6>ڶ<EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> void
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE>
// <20><>ע<EFBFBD><D7A2>Ϣ
//
//-------------------------------------------------------------------------------------------------------------------
void imu660rc_callback(void)
{
imu660rc_get_quarternion();
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʼ<EFBFBD><CABC> IMU660RC
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> quarternion_rate ѡ<><D1A1><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> uint8 1-<2D><>ʼ<EFBFBD><CABC>ʧ<EFBFBD><CAA7> 0-<2D><>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
// ʹ<><CAB9>ʾ<EFBFBD><CABE> imu660rc_init(IMU660RC_QUARTERNION_120HZ);
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
uint8 imu660rc_init(imu660rc_quarternion_rate_config quarternion_rate)
{
uint8 return_state = 0;
imu660rc_quarternion_rate = quarternion_rate;
#if IMU660RC_USE_SOFT_IIC
soft_iic_init(&imu660rc_iic_struct, IMU660RC_DEV_ADDR, IMU660RC_SOFT_IIC_DELAY, IMU660RC_SCL_PIN, IMU660RC_SDA_PIN); // <20><><EFBFBD><EFBFBD> IMU660RC <20><> IIC <20>˿<EFBFBD>
#else
spi_init(IMU660RC_SPI, SPI_MODE0, IMU660RC_SPI_SPEED, IMU660RC_SPC_PIN, IMU660RC_SDI_PIN, IMU660RC_SDO_PIN, SPI_CS_NULL); // <20><><EFBFBD><EFBFBD> IMU660RC <20><> SPI <20>˿<EFBFBD>
gpio_init(IMU660RC_CS_PIN, GPO, GPIO_HIGH, GPO_PUSH_PULL); // <20><><EFBFBD><EFBFBD> IMU660RC <20><>CS<43>˿<EFBFBD>
#endif
system_delay_ms(10);
do
{
if(imu660rc_self_check()) // IMU660RC <20>Լ<EFBFBD>
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><CBB6><EFBFBD><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ô<EFBFBD><C3B4><EFBFBD><EFBFBD> IMU660RC <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD>
// <20><><EFBFBD><EFBFBD>һ<EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE>ǻ<EFBFBD><C7BB><EFBFBD>
zf_log(0, "imu660rc self check error.");
return_state = 1;
break;
}
// <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
imu660rc_write_register(IMU660RC_FUNC_CFG_ACCESS, 0x04);
system_delay_ms(30);
// <20><><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>¹<EFBFBD><C2B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
imu660rc_write_register(IMU660RC_CTRL3, 0x44);
switch(IMU660RC_ACC_SAMPLE_DEFAULT)
{
default:
{
zf_log(0, "IMU660RC_ACC_SAMPLE_DEFAULT set error.");
return_state = 1;
}break;
case IMU660RC_ACC_SAMPLE_SGN_2G:
{
imu660rc_write_register(IMU660RC_CTRL8, 0x00);
imu660rc_transition_factor[0] = 16393.44;
}break;
case IMU660RC_ACC_SAMPLE_SGN_4G:
{
imu660rc_write_register(IMU660RC_CTRL8, 0x01);
imu660rc_transition_factor[0] = 8196.72;
}break;
case IMU660RC_ACC_SAMPLE_SGN_8G:
{
imu660rc_write_register(IMU660RC_CTRL8, 0x02);
imu660rc_transition_factor[0] = 4098.36;
}break;
case IMU660RC_ACC_SAMPLE_SGN_16G:
{
imu660rc_write_register(IMU660RC_CTRL8, 0x03);
imu660rc_transition_factor[0] = 2049.18;
}break;
}
if(1 == return_state)
{
break;
}
switch(IMU660RC_GYRO_SAMPLE_DEFAULT)
{
default:
{
zf_log(0, "IMU660RC_GYRO_SAMPLE_DEFAULT set error.");
return_state = 1;
}break;
case IMU660RC_GYRO_SAMPLE_SGN_125DPS:
{
imu660rc_write_register(IMU660RC_CTRL6, 0x00);
imu660rc_transition_factor[1] = 228.5714;
}break;
case IMU660RC_GYRO_SAMPLE_SGN_250DPS:
{
imu660rc_write_register(IMU660RC_CTRL6, 0x01);
imu660rc_transition_factor[1] = 114.2857;
}break;
case IMU660RC_GYRO_SAMPLE_SGN_500DPS:
{
imu660rc_write_register(IMU660RC_CTRL6, 0x02);
imu660rc_transition_factor[1] = 57.1428;
}break;
case IMU660RC_GYRO_SAMPLE_SGN_1000DPS:
{
imu660rc_write_register(IMU660RC_CTRL6, 0x03);
imu660rc_transition_factor[1] = 28.5714;
}break;
case IMU660RC_GYRO_SAMPLE_SGN_2000DPS:
{
imu660rc_write_register(IMU660RC_CTRL6, 0x04);
imu660rc_transition_factor[1] = 14.2857;
}break;
case IMU660RC_GYRO_SAMPLE_SGN_4000DPS:
{
imu660rc_write_register(IMU660RC_CTRL6, 0x0C);
imu660rc_transition_factor[1] = 7.14285;
}break;
}
if(1 == return_state)
{
break;
}
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>߾<EFBFBD><DFBE><EFBFBD>ģʽ<C4A3>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
imu660rc_write_register(IMU660RC_CTRL1, 0x15);
imu660rc_write_register(IMU660RC_CTRL2, 0x18);
// <20><><EFBFBD><EFBFBD>LPF1<46>˲<EFBFBD><CBB2><EFBFBD>
imu660rc_write_register(IMU660RC_CTRL7, 0x01);
// <20><><EFBFBD><EFBFBD>LPF2<46>˲<EFBFBD><CBB2><EFBFBD>
imu660rc_write_register(IMU660RC_CTRL9, 0x08);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
if(IMU660RC_QUARTERNION_DISABLE != quarternion_rate)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD>ź<EFBFBD>
imu660rc_write_register(IMU660RC_INT2_CTRL, 0x80);
imu660rc_write_register(IMU660RC_CTRL4, 0x08);
imu660rc_write_register(IMU660RC_EMB_FUNC_CFG, 0x30);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC>ٶȡ<D9B6><C8A1><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
imu660rc_write_register(IMU660RC_CTRL1, 0x10 | (quarternion_rate + 3));
imu660rc_write_register(IMU660RC_CTRL2, 0x10 | (quarternion_rate + 3));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʲ<EFBFBD><CAB2><EFBFBD><EFBFBD><EFBFBD>
imu660rc_set_mem_bank(IMU660RC_EMBED_MEM_BANK);
imu660rc_write_register(IMU660RC_SFLP_ODR, 0x43 | (quarternion_rate << 3));
imu660rc_write_register(IMU660RC_EMB_FUNC_EN_A, 0x02);
imu660rc_write_register(IMU660RC_PAGE_RW, 0x00);
imu660rc_set_mem_bank(IMU660RC_MAIN_MEM_BANK);
// <20><><EFBFBD><EFBFBD><EFBFBD>жϼ<D0B6><CFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
exti_init(ERU_CH0_REQ0_P15_4, EXTI_TRIGGER_RISING);
}
}while(0);
return return_state;
}

View File

@@ -0,0 +1,211 @@
/*********************************************************************************************************************
* RT1064DVL6A Opensourec Library <20><><EFBFBD><EFBFBD>RT1064DVL6A <20><>Դ<EFBFBD><EFBFBD><E2A3A9>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ڹٷ<DAB9> SDK <20>ӿڵĵ<DAB5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>
* Copyright (c) 2022 SEEKFREE <20><><EFBFBD>ɿƼ<C9BF>
*
* <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD> RT1064DVL6A <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
*
* RT1064DVL6A <20><>Դ<EFBFBD><D4B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B7A2><EFBFBD><EFBFBD> GPL<50><4C>GNU General Public License<73><65><EFBFBD><EFBFBD> GNUͨ<55>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <20><> GPL <20>ĵ<EFBFBD>3<EFBFBD><EFBFBD><E6A3A8> GPL3.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>κκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ汾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>޸<EFBFBD><DEB8><EFBFBD>
*
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κεı<CEB5>֤
* <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB>ʺ<EFBFBD><CABA>ض<EFBFBD><D8B6><EFBFBD>;<EFBFBD>ı<EFBFBD>֤
* <20><><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> GPL
*
* <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>ͬʱ<CDAC>յ<EFBFBD>һ<EFBFBD><D2BB> GPL <20>ĸ<EFBFBD><C4B8><EFBFBD>
* <20><><EFBFBD><EFBFBD>û<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><https://www.gnu.org/licenses/>
*
* <20><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>
* <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>ʹ<EFBFBD><CAB9> GPL3.0 <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>֤Э<D6A4><D0AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>İ汾
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD>İ<EFBFBD><C4B0><EFBFBD> libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> GPL3_permission_statement.txt <20>ļ<EFBFBD><C4BC><EFBFBD>
* <20><><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> libraries <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>µ<EFBFBD> LICENSE <20>ļ<EFBFBD>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> zf_device_imu660rc
* <20><>˾<EFBFBD><CBBE><EFBFBD><EFBFBD> <20>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* <20><EFBFBD><E6B1BE>Ϣ <20>鿴 libraries/doc <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> version <20>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADS v1.10.2
* <20><><EFBFBD><EFBFBD>ƽ̨ TC264
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> https://seekfree.taobao.com/
*
* <20>޸ļ<DEB8>¼
* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ע
* 2025-12-12 SeekFree first version
********************************************************************************************************************/
/*********************************************************************************************************************
* <20><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <20><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* // Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SPC_PIN <20><EFBFBD><EAB6A8>
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDI_PIN <20><EFBFBD><EAB6A8>
* SA0/SDO <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDO_PIN <20><EFBFBD><EAB6A8>
* CS <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_CS_PIN <20><EFBFBD><EAB6A8>
* INT2 <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_INT2_PIN <20><EFBFBD><EAB6A8>
* VCC 3.3V<EFBFBD><EFBFBD>Դ
* GND <20><>Դ<EFBFBD><D4B4>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* // <20><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>
* SCL/SPC <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SCL_PIN <20><EFBFBD><EAB6A8>
* SDA/DSI <20>鿴 zf_device_imu660rc.h <20><> IMU660RC_SDA_PIN <20><EFBFBD><EAB6A8>
* VCC 3.3V<EFBFBD><EFBFBD>Դ
* GND <20><>Դ<EFBFBD><D4B4>
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ------------------------------------
********************************************************************************************************************/
#ifndef _zf_device_imu660rc_h_
#define _zf_device_imu660rc_h_
#include "zf_common_typedef.h"
// IMU660RC_USE_SOFT_IIC<49><43><EFBFBD><EFBFBD>Ϊ0<CEAA><30>ʾʹ<CABE><CAB9>Ӳ<EFBFBD><D3B2>SPI<50><49><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ϊ1<CEAA><31>ʾʹ<CABE><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IIC<49><43><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IMU660RC_USE_SOFT_IIC<49><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȱ<EFBFBD><C8B1><EFBFBD><EBB2A2><EFBFBD>س<EFBFBD><D8B3>򣬵<EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ҫ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨѶ
#define IMU660RC_USE_SOFT_IIC ( 0 ) // Ĭ<><C4AC>ʹ<EFBFBD><CAB9>Ӳ<EFBFBD><D3B2> SPI <20><>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>
#if IMU660RC_USE_SOFT_IIC // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7> <20><>ɫ<EFBFBD>ҵľ<D2B5><C4BE><EFBFBD>û<EFBFBD><C3BB><EFBFBD>õ<EFBFBD>
//====================================================<3D><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>====================================================
#define IMU660RC_SOFT_IIC_DELAY ( 0 ) // <20><><EFBFBD><EFBFBD> IIC <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> <20><>ֵԽС IIC ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>
#define IMU660RC_SCL_PIN ( P20_11 ) // <20><><EFBFBD><EFBFBD> IIC SCL <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IMU660RC <20><> SCL <20><><EFBFBD><EFBFBD>
#define IMU660RC_SDA_PIN ( P20_14 ) // <20><><EFBFBD><EFBFBD> IIC SDA <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> IMU660RC <20><> SDA <20><><EFBFBD><EFBFBD>
//====================================================<3D><><EFBFBD><EFBFBD> IIC <20><><EFBFBD><EFBFBD>====================================================
#else
//====================================================Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>====================================================
#define IMU660RC_SPI_SPEED (10 * 1000 * 1000) // Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>
#define IMU660RC_SPI (SPI_0) // Ӳ<><D3B2> SPI <20><>
#define IMU660RC_SPC_PIN (SPI0_SCLK_P20_11 ) // Ӳ<><D3B2> SPI SCK <20><><EFBFBD><EFBFBD>
#define IMU660RC_SDI_PIN (SPI0_MOSI_P20_14) // Ӳ<><D3B2> SPI MOSI <20><><EFBFBD><EFBFBD>
#define IMU660RC_SDO_PIN (SPI0_MISO_P20_12) // Ӳ<><D3B2> SPI MISO <20><><EFBFBD><EFBFBD>
//====================================================Ӳ<><D3B2> SPI <20><><EFBFBD><EFBFBD>====================================================
#endif
#define IMU660RC_CS_PIN ( P20_13 ) // CS Ƭѡ<C6AC><D1A1><EFBFBD><EFBFBD>
#define IMU660RC_CS(x) ( (x) ? (gpio_high(IMU660RC_CS_PIN)) : (gpio_low(IMU660RC_CS_PIN)) )
#define IMU660RC_INT2_PIN ( ERU_CH0_REQ0_P15_4 ) // <20>ж<EFBFBD><D0B6>ź<EFBFBD><C5BA><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3>ڶ<EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>ʱ<EFBFBD><CAB1>Ҫʹ<D2AA><CAB9>
#define IMU660RC_QUARTERNION_GET_GYRO ( 1 ) // 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ
#define IMU660RC_QUARTERNION_GET_ACC ( 1 ) // 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Ԫ<EFBFBD><D4AA>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ٶ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ȡ
#define IMU660RC_ACC_SAMPLE_DEFAULT ( IMU660RC_ACC_SAMPLE_SGN_8G ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵ<EFBFBD> <20><><EFBFBD>ٶȼ<D9B6> <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define IMU660RC_GYRO_SAMPLE_DEFAULT ( IMU660RC_GYRO_SAMPLE_SGN_2000DPS ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef enum
{
IMU660RC_MAIN_MEM_BANK = 0x00,
IMU660RC_HUB_MEM_BANK = 0x40,
IMU660RC_EMBED_MEM_BANK = 0x80,
}imu660rc_mem_bank_enum;
typedef enum
{
IMU660RC_ACC_SAMPLE_SGN_2G , // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>2G (ACC = Accelerometer <20><><EFBFBD>ٶȼ<D9B6>) (SGN = signum <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ) (G = g <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD> g<><67>9.80 m/s^2)
IMU660RC_ACC_SAMPLE_SGN_4G , // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>4G
IMU660RC_ACC_SAMPLE_SGN_8G , // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>8G
IMU660RC_ACC_SAMPLE_SGN_16G, // <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> <20><>16G
}imu660rc_acc_sample_config;
typedef enum
{
IMU660RC_GYRO_SAMPLE_SGN_125DPS , // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>125DPS (GYRO = Gyroscope <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) (SGN = signum <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ) (DPS = Degree Per Second <20><><EFBFBD>ٶȵ<D9B6>λ <20><>/S)
IMU660RC_GYRO_SAMPLE_SGN_250DPS , // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>250DPS
IMU660RC_GYRO_SAMPLE_SGN_500DPS , // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>500DPS
IMU660RC_GYRO_SAMPLE_SGN_1000DPS, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>1000DPS
IMU660RC_GYRO_SAMPLE_SGN_2000DPS, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>2000DPS
IMU660RC_GYRO_SAMPLE_SGN_4000DPS, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>4000DPS
}imu660rc_gyro_sample_config;
typedef enum
{
IMU660RC_QUARTERNION_15HZ, // 15 Hz
IMU660RC_QUARTERNION_30HZ, // 30 Hz
IMU660RC_QUARTERNION_60HZ, // 60 Hz
IMU660RC_QUARTERNION_120HZ, // 120Hz
IMU660RC_QUARTERNION_240HZ, // 240Hz
IMU660RC_QUARTERNION_480HZ, // 480Hz
IMU660RC_QUARTERNION_DISABLE, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}imu660rc_quarternion_rate_config;
//================================================<3D><><EFBFBD><EFBFBD> IMU660RC <20>ڲ<EFBFBD><DAB2><EFBFBD>ַ================================================
#define IMU660RC_DEV_ADDR ( 0x6B ) // SA0<41>ӵأ<D3B5>0x6A SA0<41><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0x6B ģ<><C4A3>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define IMU660RC_SPI_W ( 0x00 )
#define IMU660RC_SPI_R ( 0x80 )
#define IMU660RC_TIMEOUT_COUNT ( 0x00FF ) // IMU660RC <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
//================================================<3D><><EFBFBD><EFBFBD> IMU660RC <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ================================================
#define IMU660RC_FUNC_CFG_ACCESS ( 0x01 )
#define IMU660RC_INT2_CTRL ( 0x0E )
#define IMU660RC_CHIP_ID ( 0x0F )
#define IMU660RC_CTRL1 ( 0x10 )
#define IMU660RC_CTRL2 ( 0x11 )
#define IMU660RC_CTRL3 ( 0x12 )
#define IMU660RC_CTRL4 ( 0x13 )
#define IMU660RC_CTRL5 ( 0x14 )
#define IMU660RC_CTRL6 ( 0x15 )
#define IMU660RC_CTRL7 ( 0x16 )
#define IMU660RC_CTRL8 ( 0x17 )
#define IMU660RC_CTRL9 ( 0x18 )
#define IMU660RC_CTRL10 ( 0x19 )
#define IMU660RC_CTRL_STATUS ( 0x1A )
#define IMU660RC_STATUS_REG ( 0x1E )
#define IMU660RC_OUT_TEMP_L ( 0x20 )
#define IMU660RC_OUT_TEMP_H ( 0x21 )
#define IMU660RC_OUTX_L_G ( 0x22 )
#define IMU660RC_OUTX_H_G ( 0x23 )
#define IMU660RC_OUTY_L_G ( 0x24 )
#define IMU660RC_OUTY_H_G ( 0x25 )
#define IMU660RC_OUTZ_L_G ( 0x26 )
#define IMU660RC_OUTZ_H_G ( 0x27 )
#define IMU660RC_OUTX_L_A ( 0x28 )
#define IMU660RC_OUTX_H_A ( 0x29 )
#define IMU660RC_OUTY_L_A ( 0x2A )
#define IMU660RC_OUTY_H_A ( 0x2B )
#define IMU660RC_OUTZ_L_A ( 0x2C )
#define IMU660RC_OUTZ_H_A ( 0x2D )
#define IMU660RC_PAGE_SEL ( 0x02 )
#define IMU660RC_EMB_FUNC_EN_A ( 0x04 )
#define IMU660RC_PAGE_RW ( 0x17 )
#define IMU660RC_SFLP_ODR ( 0x5E )
#define IMU660RC_EMB_FUNC_CFG ( 0x63 )
extern float imu660rc_transition_factor[2];
extern int16 imu660rc_gyro_x, imu660rc_gyro_y, imu660rc_gyro_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
extern int16 imu660rc_acc_x , imu660rc_acc_y , imu660rc_acc_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>
extern float imu660rc_roll , imu660rc_pitch , imu660rc_yaw; // ŷ<><C5B7><EFBFBD><EFBFBD>
extern float imu660rc_quarternion[4]; // <20><>Ԫ<EFBFBD><D4AA>
void imu660rc_get_acc (void);
void imu660rc_get_gyro (void);
void imu660rc_get_quarternion (void);
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> IMU660RC <20><><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊʵ<CEAA><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> acc_value <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> float data = imu660rc_acc_transition(imu660rc_acc_x); // <20><>λΪ g(m/s^2)
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
#define imu660rc_acc_transition(acc_value) ((float)(acc_value) / imu660rc_transition_factor[0])
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> IMU660RC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊʵ<CEAA><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> gyro_value <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// ʹ<><CAB9>ʾ<EFBFBD><CABE> float data = imu660rc_gyro_transition(imu660rc_gyro_x); // <20><>λΪ <20><>/s
// <20><>ע<EFBFBD><D7A2>Ϣ
//-------------------------------------------------------------------------------------------------------------------
#define imu660rc_gyro_transition(gyro_value) ((float)(gyro_value) / imu660rc_transition_factor[1])
void imu660rc_callback (void);
uint8 imu660rc_init (imu660rc_quarternion_rate_config quarternion_rate);
#endif

View File

@@ -97,7 +97,7 @@
//================================================<3D><><EFBFBD><EFBFBD> IMU660RX ȫ<>ֱ<EFBFBD><D6B1><EFBFBD>================================================ //================================================<3D><><EFBFBD><EFBFBD> IMU660RX ȫ<>ֱ<EFBFBD><D6B1><EFBFBD>================================================
extern int16 imu660rx_gyro_x, imu660rx_gyro_y, imu660rx_gyro_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> gyro (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) extern int16 imu660rx_gyro_x, imu660rx_gyro_y, imu660rx_gyro_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> gyro (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
extern int16 imu660rx_acc_x, imu660rx_acc_y, imu660rx_acc_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> acc (accelerometer <20><><EFBFBD>ٶȼ<D9B6>) extern int16 imu660rx_acc_x, imu660rx_acc_y, imu660rx_acc_z; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶȼ<D9B6><C8BC><EFBFBD><EFBFBD><EFBFBD> acc (accelerometer <20><><EFBFBD>ٶȼ<D9B6>)
extern float imu660ra_transition_factor[2]; extern float imu660rx_transition_factor[2];
//================================================<3D><><EFBFBD><EFBFBD> IMU660RX ȫ<>ֱ<EFBFBD><D6B1><EFBFBD>================================================ //================================================<3D><><EFBFBD><EFBFBD> IMU660RX ȫ<>ֱ<EFBFBD><D6B1><EFBFBD>================================================

View File

@@ -90,6 +90,7 @@ IFX_INTERRUPT(exti_ch0_ch4_isr, 0, EXTI_CH0_CH4_INT_PRIO)
{ {
exti_flag_clear(ERU_CH0_REQ0_P15_4); exti_flag_clear(ERU_CH0_REQ0_P15_4);
imu660rc_callback(); // 660RC ģ<><C4A3> INT <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
} }
if(exti_flag_get(ERU_CH4_REQ13_P15_5)) // ͨ<><CDA8>4<EFBFBD>ж<EFBFBD> if(exti_flag_get(ERU_CH4_REQ13_P15_5)) // ͨ<><CDA8>4<EFBFBD>ж<EFBFBD>