mirror of
https://gitee.com/dlmu-cone/bf_original_balance_chassis
synced 2026-07-24 19:47:44 +08:00
Correct spi chip selection
This commit is contained in:
@@ -137,7 +137,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
|
|||||||
hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||||
hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||||
hdma_spi1_rx.Init.Mode = DMA_NORMAL;
|
hdma_spi1_rx.Init.Mode = DMA_NORMAL;
|
||||||
hdma_spi1_rx.Init.Priority = DMA_PRIORITY_HIGH;
|
hdma_spi1_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
|
||||||
hdma_spi1_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
|
hdma_spi1_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
|
||||||
hdma_spi1_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
|
hdma_spi1_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
|
||||||
hdma_spi1_rx.Init.MemBurst = DMA_MBURST_SINGLE;
|
hdma_spi1_rx.Init.MemBurst = DMA_MBURST_SINGLE;
|
||||||
@@ -158,7 +158,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
|
|||||||
hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||||
hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||||
hdma_spi1_tx.Init.Mode = DMA_NORMAL;
|
hdma_spi1_tx.Init.Mode = DMA_NORMAL;
|
||||||
hdma_spi1_tx.Init.Priority = DMA_PRIORITY_HIGH;
|
hdma_spi1_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
|
||||||
hdma_spi1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
|
hdma_spi1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
|
||||||
if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
|
if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -50,47 +50,47 @@ BMI088Instance *bmi088_test; // 云台IMU
|
|||||||
BMI088_Data_t bmi088_data;
|
BMI088_Data_t bmi088_data;
|
||||||
void RobotCMDInit()
|
void RobotCMDInit()
|
||||||
{
|
{
|
||||||
BMI088_Init_Config_s bmi088_config = {
|
// BMI088_Init_Config_s bmi088_config = {
|
||||||
.cali_mode = BMI088_CALIBRATE_ONLINE_MODE,
|
// .cali_mode = BMI088_CALIBRATE_ONLINE_MODE,
|
||||||
.work_mode = BMI088_BLOCK_TRIGGER_MODE,
|
// .work_mode = BMI088_BLOCK_TRIGGER_MODE,
|
||||||
.spi_acc_config = {
|
// .spi_acc_config = {
|
||||||
.spi_handle = &hspi1,
|
// .spi_handle = &hspi1,
|
||||||
.GPIOx = GPIOA,
|
// .GPIOx = GPIOA,
|
||||||
.cs_pin = GPIO_PIN_4,
|
// .cs_pin = GPIO_PIN_4,
|
||||||
.spi_work_mode = SPI_DMA_MODE,
|
// .spi_work_mode = SPI_DMA_MODE,
|
||||||
},
|
// },
|
||||||
.acc_int_config = {
|
// .acc_int_config = {
|
||||||
.GPIOx = GPIOC,
|
// .GPIOx = GPIOC,
|
||||||
.GPIO_Pin = GPIO_PIN_4,
|
// .GPIO_Pin = GPIO_PIN_4,
|
||||||
.exti_mode = GPIO_EXTI_MODE_RISING,
|
// .exti_mode = GPIO_EXTI_MODE_RISING,
|
||||||
},
|
// },
|
||||||
.spi_gyro_config = {
|
// .spi_gyro_config = {
|
||||||
.spi_handle = &hspi1,
|
// .spi_handle = &hspi1,
|
||||||
.GPIOx = GPIOB,
|
// .GPIOx = GPIOB,
|
||||||
.cs_pin = GPIO_PIN_0,
|
// .cs_pin = GPIO_PIN_0,
|
||||||
.spi_work_mode = SPI_DMA_MODE,
|
// .spi_work_mode = SPI_DMA_MODE,
|
||||||
},
|
// },
|
||||||
.gyro_int_config = {
|
// .gyro_int_config = {
|
||||||
.GPIO_Pin = GPIO_PIN_5,
|
// .GPIO_Pin = GPIO_PIN_5,
|
||||||
.GPIOx = GPIOC,
|
// .GPIOx = GPIOC,
|
||||||
.exti_mode = GPIO_EXTI_MODE_RISING,
|
// .exti_mode = GPIO_EXTI_MODE_RISING,
|
||||||
},
|
// },
|
||||||
.heat_pwm_config = {
|
// .heat_pwm_config = {
|
||||||
.htim = &htim10,
|
// .htim = &htim10,
|
||||||
.channel = TIM_CHANNEL_1,
|
// .channel = TIM_CHANNEL_1,
|
||||||
.period = 1,
|
// .period = 1,
|
||||||
},
|
// },
|
||||||
.heat_pid_config = {
|
// .heat_pid_config = {
|
||||||
.Kp = 0.5,
|
// .Kp = 0.5,
|
||||||
.Ki = 0,
|
// .Ki = 0,
|
||||||
.Kd = 0,
|
// .Kd = 0,
|
||||||
.DeadBand = 0.1,
|
// .DeadBand = 0.1,
|
||||||
.Improve = PID_Trapezoid_Intergral | PID_Integral_Limit | PID_Derivative_On_Measurement,
|
// .Improve = PID_Trapezoid_Intergral | PID_Integral_Limit | PID_Derivative_On_Measurement,
|
||||||
.IntegralLimit = 100,
|
// .IntegralLimit = 100,
|
||||||
.MaxOut = 100,
|
// .MaxOut = 100,
|
||||||
},
|
// },
|
||||||
};
|
// };
|
||||||
bmi088_test = BMI088Register(&bmi088_config);
|
//bmi088_test = BMI088Register(&bmi088_config);
|
||||||
rc_data = RemoteControlInit(&huart3); // 修改为对应串口,注意如果是自研板dbus协议串口需选用添加了反相器的那个
|
rc_data = RemoteControlInit(&huart3); // 修改为对应串口,注意如果是自研板dbus协议串口需选用添加了反相器的那个
|
||||||
vision_recv_data = VisionInit(&huart1); // 视觉通信串口
|
vision_recv_data = VisionInit(&huart1); // 视觉通信串口
|
||||||
|
|
||||||
@@ -319,7 +319,7 @@ static void EmergencyHandler()
|
|||||||
/* 机器人核心控制任务,200Hz频率运行(必须高于视觉发送频率) */
|
/* 机器人核心控制任务,200Hz频率运行(必须高于视觉发送频率) */
|
||||||
void RobotCMDTask()
|
void RobotCMDTask()
|
||||||
{
|
{
|
||||||
BMI088Acquire(bmi088_test,&bmi088_data) ;
|
// BMI088Acquire(bmi088_test,&bmi088_data) ;
|
||||||
// 从其他应用获取回传数据
|
// 从其他应用获取回传数据
|
||||||
#ifdef ONE_BOARD
|
#ifdef ONE_BOARD
|
||||||
SubGetMessage(chassis_feed_sub, (void *)&chassis_fetch_data);
|
SubGetMessage(chassis_feed_sub, (void *)&chassis_fetch_data);
|
||||||
|
|||||||
@@ -17,29 +17,7 @@ static Gimbal_Ctrl_Cmd_s gimbal_cmd_recv; // 来自cmd的控制信息
|
|||||||
static BMI088Instance *bmi088; // 云台IMU
|
static BMI088Instance *bmi088; // 云台IMU
|
||||||
void GimbalInit()
|
void GimbalInit()
|
||||||
{
|
{
|
||||||
//gimba_IMU_data = INS_Init(); // IMU先初始化,获取姿态数据指针赋给yaw电机的其他数据来源
|
gimba_IMU_data = INS_Init(); // IMU先初始化,获取姿态数据指针赋给yaw电机的其他数据来源
|
||||||
BMI088_Init_Config_s imu_config = {
|
|
||||||
.work_mode = BMI088_BLOCK_PERIODIC_MODE,
|
|
||||||
.spi_acc_config = {
|
|
||||||
.spi_handle = &hspi1,
|
|
||||||
.GPIOx = GPIOA,
|
|
||||||
.cs_pin = GPIO_PIN_4,
|
|
||||||
.spi_work_mode = SPI_BLOCK_MODE,
|
|
||||||
},
|
|
||||||
.spi_gyro_config = {
|
|
||||||
.spi_handle = &hspi1,
|
|
||||||
.GPIOx = GPIOA,
|
|
||||||
.cs_pin = GPIO_PIN_4,
|
|
||||||
.spi_work_mode = SPI_BLOCK_MODE,
|
|
||||||
},
|
|
||||||
.heat_pwm_config = {
|
|
||||||
.htim = &htim10,
|
|
||||||
.channel = TIM_CHANNEL_1,
|
|
||||||
.period = 1,
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
bmi088=BMI088Register(&imu_config);
|
|
||||||
// YAW
|
// YAW
|
||||||
Motor_Init_Config_s yaw_config = {
|
Motor_Init_Config_s yaw_config = {
|
||||||
.can_init_config = {
|
.can_init_config = {
|
||||||
|
|||||||
@@ -31,12 +31,12 @@ void RobotInit()
|
|||||||
|
|
||||||
#if defined(ONE_BOARD) || defined(GIMBAL_BOARD)
|
#if defined(ONE_BOARD) || defined(GIMBAL_BOARD)
|
||||||
RobotCMDInit();
|
RobotCMDInit();
|
||||||
//GimbalInit();
|
GimbalInit();
|
||||||
//ShootInit();
|
ShootInit();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ONE_BOARD) || defined(CHASSIS_BOARD)
|
#if defined(ONE_BOARD) || defined(CHASSIS_BOARD)
|
||||||
//ChassisInit();
|
ChassisInit();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
OSTaskInit(); // 创建基础任务
|
OSTaskInit(); // 创建基础任务
|
||||||
@@ -49,12 +49,12 @@ void RobotTask()
|
|||||||
{
|
{
|
||||||
#if defined(ONE_BOARD) || defined(GIMBAL_BOARD)
|
#if defined(ONE_BOARD) || defined(GIMBAL_BOARD)
|
||||||
RobotCMDTask();
|
RobotCMDTask();
|
||||||
//GimbalTask();
|
GimbalTask();
|
||||||
//ShootTask();
|
ShootTask();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ONE_BOARD) || defined(CHASSIS_BOARD)
|
#if defined(ONE_BOARD) || defined(CHASSIS_BOARD)
|
||||||
//ChassisTask();
|
ChassisTask();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -17,13 +17,13 @@
|
|||||||
|
|
||||||
#include "bsp_log.h"
|
#include "bsp_log.h"
|
||||||
|
|
||||||
// osThreadId insTaskHandle;
|
osThreadId insTaskHandle;
|
||||||
osThreadId robotTaskHandle;
|
osThreadId robotTaskHandle;
|
||||||
osThreadId motorTaskHandle;
|
osThreadId motorTaskHandle;
|
||||||
osThreadId daemonTaskHandle;
|
osThreadId daemonTaskHandle;
|
||||||
osThreadId uiTaskHandle;
|
osThreadId uiTaskHandle;
|
||||||
|
|
||||||
// void StartINSTASK(void const *argument);
|
void StartINSTASK(void const *argument);
|
||||||
void StartMOTORTASK(void const *argument);
|
void StartMOTORTASK(void const *argument);
|
||||||
void StartDAEMONTASK(void const *argument);
|
void StartDAEMONTASK(void const *argument);
|
||||||
void StartROBOTTASK(void const *argument);
|
void StartROBOTTASK(void const *argument);
|
||||||
@@ -35,8 +35,8 @@ void StartUITASK(void const *argument);
|
|||||||
*/
|
*/
|
||||||
void OSTaskInit()
|
void OSTaskInit()
|
||||||
{
|
{
|
||||||
// osThreadDef(instask, StartINSTASK, osPriorityAboveNormal, 0, 1024);
|
osThreadDef(instask, StartINSTASK, osPriorityAboveNormal, 0, 1024);
|
||||||
// insTaskHandle = osThreadCreate(osThread(instask), NULL); // 由于是阻塞读取传感器,为姿态解算设置较高优先级,确保以1khz的频率执行
|
insTaskHandle = osThreadCreate(osThread(instask), NULL); // 由于是阻塞读取传感器,为姿态解算设置较高优先级,确保以1khz的频率执行
|
||||||
// // 后续修改为读取传感器数据准备好的中断处理,
|
// // 后续修改为读取传感器数据准备好的中断处理,
|
||||||
|
|
||||||
osThreadDef(motortask, StartMOTORTASK, osPriorityNormal, 0, 256);
|
osThreadDef(motortask, StartMOTORTASK, osPriorityNormal, 0, 256);
|
||||||
@@ -54,24 +54,24 @@ void OSTaskInit()
|
|||||||
HTMotorControlInit(); // 没有注册HT电机则不会执行
|
HTMotorControlInit(); // 没有注册HT电机则不会执行
|
||||||
}
|
}
|
||||||
|
|
||||||
// __attribute__((noreturn)) void StartINSTASK(void const *argument)
|
__attribute__((noreturn)) void StartINSTASK(void const *argument)
|
||||||
// {
|
{
|
||||||
// static float ins_start;
|
static float ins_start;
|
||||||
// static float ins_dt;
|
static float ins_dt;
|
||||||
// INS_Init(); // 确保BMI088被正确初始化.
|
INS_Init(); // 确保BMI088被正确初始化.
|
||||||
// LOGINFO("[freeRTOS] INS Task Start");
|
LOGINFO("[freeRTOS] INS Task Start");
|
||||||
// for (;;)
|
for (;;)
|
||||||
// {
|
{
|
||||||
// // 1kHz
|
// 1kHz
|
||||||
// ins_start = DWT_GetTimeline_ms();
|
ins_start = DWT_GetTimeline_ms();
|
||||||
// //INS_Task();
|
INS_Task();
|
||||||
// ins_dt = DWT_GetTimeline_ms() - ins_start;
|
ins_dt = DWT_GetTimeline_ms() - ins_start;
|
||||||
// if (ins_dt > 1)
|
if (ins_dt > 1)
|
||||||
// LOGERROR("[freeRTOS] INS Task is being DELAY! dt = [%f]", &ins_dt);
|
LOGERROR("[freeRTOS] INS Task is being DELAY! dt = [%f]", &ins_dt);
|
||||||
// VisionSend(); // 解算完成后发送视觉数据,但是当前的实现不太优雅,后续若添加硬件触发需要重新考虑结构的组织
|
VisionSend(); // 解算完成后发送视觉数据,但是当前的实现不太优雅,后续若添加硬件触发需要重新考虑结构的组织
|
||||||
// osDelay(1);
|
osDelay(1);
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
__attribute__((noreturn)) void StartMOTORTASK(void const *argument)
|
__attribute__((noreturn)) void StartMOTORTASK(void const *argument)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
/* 所有的spi instance保存于此,用于callback时判断中断来源*/
|
/* 所有的spi instance保存于此,用于callback时判断中断来源*/
|
||||||
static SPIInstance *spi_instance[SPI_DEVICE_CNT] = {NULL};
|
static SPIInstance *spi_instance[SPI_DEVICE_CNT] = {NULL};
|
||||||
static uint8_t idx = 0; // 配合中断以及初始化
|
static uint8_t idx = 0; // 配合中断以及初始化
|
||||||
|
uint8_t SPIDeviceOnGoing[SPI_DEVICE_CNT] = {1}; // 用于判断当前spi是否正在传输,防止多个模块同时使用一个spi总线 (0: 正在传输, 1: 未传输)
|
||||||
|
|
||||||
SPIInstance *SPIRegister(SPI_Init_Config_s *conf)
|
SPIInstance *SPIRegister(SPI_Init_Config_s *conf)
|
||||||
{
|
{
|
||||||
@@ -20,7 +21,19 @@ SPIInstance *SPIRegister(SPI_Init_Config_s *conf)
|
|||||||
instance->spi_work_mode = conf->spi_work_mode;
|
instance->spi_work_mode = conf->spi_work_mode;
|
||||||
instance->callback = conf->callback;
|
instance->callback = conf->callback;
|
||||||
instance->id = conf->id;
|
instance->id = conf->id;
|
||||||
|
if (instance->spi_handle->Instance == SPI1)
|
||||||
|
{
|
||||||
|
instance->cs_pin_state = &SPIDeviceOnGoing[0];
|
||||||
|
}
|
||||||
|
else if (instance->spi_handle->Instance == SPI2)
|
||||||
|
{
|
||||||
|
instance->cs_pin_state = &SPIDeviceOnGoing[1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (1)
|
||||||
|
;
|
||||||
|
}
|
||||||
spi_instance[idx++] = instance;
|
spi_instance[idx++] = instance;
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
@@ -78,11 +91,28 @@ void SPIRecv(SPIInstance *spi_ins, uint8_t *ptr_data, uint8_t len)
|
|||||||
|
|
||||||
void SPITransRecv(SPIInstance *spi_ins, uint8_t *ptr_data_rx, uint8_t *ptr_data_tx, uint8_t len)
|
void SPITransRecv(SPIInstance *spi_ins, uint8_t *ptr_data_rx, uint8_t *ptr_data_tx, uint8_t len)
|
||||||
{
|
{
|
||||||
|
|
||||||
// 用于稍后回调使用,请保证ptr_data_rx在回调函数被调用之前仍然在作用域内,否则析构之后的行为是未定义的!!!
|
// 用于稍后回调使用,请保证ptr_data_rx在回调函数被调用之前仍然在作用域内,否则析构之后的行为是未定义的!!!
|
||||||
spi_ins->rx_size = len;
|
spi_ins->rx_size = len;
|
||||||
spi_ins->rx_buffer = ptr_data_rx;
|
spi_ins->rx_buffer = ptr_data_rx;
|
||||||
|
// 等待上一次传输完成
|
||||||
|
if (spi_ins->spi_handle->Instance == SPI1)
|
||||||
|
{
|
||||||
|
while (!SPIDeviceOnGoing[0])
|
||||||
|
{
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else if (spi_ins->spi_handle->Instance == SPI2)
|
||||||
|
{
|
||||||
|
while (!SPIDeviceOnGoing[1])
|
||||||
|
{
|
||||||
|
};
|
||||||
|
}
|
||||||
// 拉低片选,开始传输
|
// 拉低片选,开始传输
|
||||||
HAL_GPIO_WritePin(spi_ins->GPIOx, spi_ins->cs_pin, GPIO_PIN_RESET);
|
HAL_GPIO_WritePin(spi_ins->GPIOx, spi_ins->cs_pin, GPIO_PIN_RESET);
|
||||||
|
*spi_ins->cs_pin_state =
|
||||||
|
spi_ins->CS_State =
|
||||||
|
HAL_GPIO_ReadPin(spi_ins->GPIOx, spi_ins->cs_pin);
|
||||||
switch (spi_ins->spi_work_mode)
|
switch (spi_ins->spi_work_mode)
|
||||||
{
|
{
|
||||||
case SPI_DMA_MODE:
|
case SPI_DMA_MODE:
|
||||||
@@ -95,6 +125,9 @@ void SPITransRecv(SPIInstance *spi_ins, uint8_t *ptr_data_rx, uint8_t *ptr_data_
|
|||||||
HAL_SPI_TransmitReceive(spi_ins->spi_handle, ptr_data_tx, ptr_data_rx, len, 1000); // 默认50ms超时
|
HAL_SPI_TransmitReceive(spi_ins->spi_handle, ptr_data_tx, ptr_data_rx, len, 1000); // 默认50ms超时
|
||||||
// 阻塞模式不会调用回调函数,传输完成后直接拉高片选结束
|
// 阻塞模式不会调用回调函数,传输完成后直接拉高片选结束
|
||||||
HAL_GPIO_WritePin(spi_ins->GPIOx, spi_ins->cs_pin, GPIO_PIN_SET);
|
HAL_GPIO_WritePin(spi_ins->GPIOx, spi_ins->cs_pin, GPIO_PIN_SET);
|
||||||
|
*spi_ins->cs_pin_state =
|
||||||
|
spi_ins->CS_State =
|
||||||
|
HAL_GPIO_ReadPin(spi_ins->GPIOx, spi_ins->cs_pin);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
while (1)
|
while (1)
|
||||||
@@ -130,6 +163,9 @@ void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
|
|||||||
{
|
{
|
||||||
// 先拉高片选,结束传输,在判断是否有回调函数,如果有则调用回调函数
|
// 先拉高片选,结束传输,在判断是否有回调函数,如果有则调用回调函数
|
||||||
HAL_GPIO_WritePin(spi_instance[i]->GPIOx, spi_instance[i]->cs_pin, GPIO_PIN_SET);
|
HAL_GPIO_WritePin(spi_instance[i]->GPIOx, spi_instance[i]->cs_pin, GPIO_PIN_SET);
|
||||||
|
*spi_instance[i]->cs_pin_state =
|
||||||
|
spi_instance[i]->CS_State =
|
||||||
|
HAL_GPIO_ReadPin(spi_instance[i]->GPIOx, spi_instance[i]->cs_pin);
|
||||||
// @todo 后续添加holdon模式,由用户自行决定何时释放片选,允许进行连续传输
|
// @todo 后续添加holdon模式,由用户自行决定何时释放片选,允许进行连续传输
|
||||||
if (spi_instance[i]->callback != NULL) // 回调函数不为空, 则调用回调函数
|
if (spi_instance[i]->callback != NULL) // 回调函数不为空, 则调用回调函数
|
||||||
spi_instance[i]->callback(spi_instance[i]);
|
spi_instance[i]->callback(spi_instance[i]);
|
||||||
|
|||||||
@@ -24,7 +24,8 @@ typedef struct spi_ins_temp
|
|||||||
SPI_TXRX_MODE_e spi_work_mode; // 传输工作模式
|
SPI_TXRX_MODE_e spi_work_mode; // 传输工作模式
|
||||||
uint8_t rx_size; // 本次接收的数据长度
|
uint8_t rx_size; // 本次接收的数据长度
|
||||||
uint8_t *rx_buffer; // 本次接收的数据缓冲区
|
uint8_t *rx_buffer; // 本次接收的数据缓冲区
|
||||||
|
uint8_t CS_State; // 片选信号状态,用于中断模式下的片选控制
|
||||||
|
uint8_t * cs_pin_state; // 片选信号状态,用于中断模式下的片选控制
|
||||||
void (*callback)(struct spi_ins_temp *); // 接收回调函数
|
void (*callback)(struct spi_ins_temp *); // 接收回调函数
|
||||||
void *id; // 模块指针
|
void *id; // 模块指针
|
||||||
} SPIInstance;
|
} SPIInstance;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "daemon.h"
|
#include "daemon.h"
|
||||||
|
|
||||||
static DaemonInstance *bmi088_daemon_instance;
|
static DaemonInstance *bmi088_daemon_instance;
|
||||||
|
|
||||||
// ---------------------------以下私有函数,用于读写BMI088寄存器封装,blocking--------------------------------//
|
// ---------------------------以下私有函数,用于读写BMI088寄存器封装,blocking--------------------------------//
|
||||||
/**
|
/**
|
||||||
* @brief 读取BMI088寄存器Accel. BMI088要求在不释放CS的情况下连续读取
|
* @brief 读取BMI088寄存器Accel. BMI088要求在不释放CS的情况下连续读取
|
||||||
@@ -42,12 +43,9 @@ static void BMI088GyroRead(BMI088Instance *bmi088, uint8_t reg, uint8_t *dataptr
|
|||||||
// 一次读取最多6个字节,加上一个dummy data ,第一个字节的第一个位是读写位,1为读,0为写,1-7bit是寄存器地址
|
// 一次读取最多6个字节,加上一个dummy data ,第一个字节的第一个位是读写位,1为读,0为写,1-7bit是寄存器地址
|
||||||
static uint8_t tx[7] = {0x80}; // 读取,第一个字节为0x80 | reg ,之后是dummy data
|
static uint8_t tx[7] = {0x80}; // 读取,第一个字节为0x80 | reg ,之后是dummy data
|
||||||
static uint8_t rx[7]; // 第一个是dummy data,第三个开始是真正的数据
|
static uint8_t rx[7]; // 第一个是dummy data,第三个开始是真正的数据
|
||||||
|
|
||||||
tx[0] = 0x80 | reg;
|
tx[0] = 0x80 | reg;
|
||||||
//SPITransRecv(bmi088->spi_gyro, rx, tx, len + 1);
|
|
||||||
do
|
|
||||||
{
|
|
||||||
SPITransRecv(bmi088->spi_gyro, rx, tx, len + 1);
|
SPITransRecv(bmi088->spi_gyro, rx, tx, len + 1);
|
||||||
}while (rx[1] == 0 && rx[2] == 128 && rx[6] == 129); //@todo我也不知道哪来的错误帧 先这样吧。。。。。
|
|
||||||
memcpy(dataptr, rx + 1, len); // @todo : memcpy有额外开销,后续可以考虑优化,在SPI中加入接口或模式,使得在一次传输结束后不释放CS,直接接着传输
|
memcpy(dataptr, rx + 1, len); // @todo : memcpy有额外开销,后续可以考虑优化,在SPI中加入接口或模式,使得在一次传输结束后不释放CS,直接接着传输
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,7 +95,7 @@ static uint8_t BMI088_Accel_Init_Table[BMI088_WRITE_ACCEL_REG_NUM][3] =
|
|||||||
static uint8_t BMI088_Gyro_Init_Table[BMI088_WRITE_GYRO_REG_NUM][3] =
|
static uint8_t BMI088_Gyro_Init_Table[BMI088_WRITE_GYRO_REG_NUM][3] =
|
||||||
{
|
{
|
||||||
{BMI088_GYRO_RANGE, BMI088_GYRO_2000, BMI088_GYRO_RANGE_ERROR},
|
{BMI088_GYRO_RANGE, BMI088_GYRO_2000, BMI088_GYRO_RANGE_ERROR},
|
||||||
{BMI088_GYRO_BANDWIDTH, BMI088_GYRO_2000_230_HZ | BMI088_GYRO_BANDWIDTH_MUST_Set, BMI088_GYRO_BANDWIDTH_ERROR},
|
{BMI088_GYRO_BANDWIDTH, BMI088_GYRO_1000_116_HZ | BMI088_GYRO_BANDWIDTH_MUST_Set, BMI088_GYRO_BANDWIDTH_ERROR},
|
||||||
{BMI088_GYRO_LPM1, BMI088_GYRO_NORMAL_MODE, BMI088_GYRO_LPM1_ERROR},
|
{BMI088_GYRO_LPM1, BMI088_GYRO_NORMAL_MODE, BMI088_GYRO_LPM1_ERROR},
|
||||||
{BMI088_GYRO_CTRL, BMI088_DRDY_ON, BMI088_GYRO_CTRL_ERROR},
|
{BMI088_GYRO_CTRL, BMI088_DRDY_ON, BMI088_GYRO_CTRL_ERROR},
|
||||||
{BMI088_GYRO_INT3_INT4_IO_CONF, BMI088_GYRO_INT3_GPIO_PP | BMI088_GYRO_INT3_GPIO_LOW, BMI088_GYRO_INT3_INT4_IO_CONF_ERROR},
|
{BMI088_GYRO_INT3_INT4_IO_CONF, BMI088_GYRO_INT3_GPIO_PP | BMI088_GYRO_INT3_GPIO_LOW, BMI088_GYRO_INT3_INT4_IO_CONF_ERROR},
|
||||||
@@ -224,18 +222,18 @@ static void BMI088AccINTCallback(GPIOInstance *gpio)
|
|||||||
|
|
||||||
static void BMI088GyroINTCallback(GPIOInstance *gpio)
|
static void BMI088GyroINTCallback(GPIOInstance *gpio)
|
||||||
{
|
{
|
||||||
|
|
||||||
static BMI088Instance *bmi088;
|
static BMI088Instance *bmi088;
|
||||||
static uint8_t buf[6] = {0}; // 最多读取6个byte(gyro/acc,temp是2)
|
static uint8_t buf[6] = {0}; // 最多读取6个byte(gyro/acc,temp是2)
|
||||||
bmi088 = (BMI088Instance *)(gpio->id);
|
bmi088 = (BMI088Instance *)(gpio->id);
|
||||||
bmi088->update_flag.imu_ready = 1;
|
bmi088->update_flag.imu_ready = 1;
|
||||||
bmi088->update_flag.gyro = 1;
|
bmi088->update_flag.gyro = 1;
|
||||||
|
uint8_t whoami_check = 0;
|
||||||
|
//do{BMI088GyroRead(bmi088, BMI088_GYRO_CHIP_ID, &whoami_check, 1);}while(whoami_check != BMI088_GYRO_CHIP_ID_VALUE);
|
||||||
|
|
||||||
BMI088GyroRead(bmi088, BMI088_GYRO_X_L, buf, 6);
|
BMI088GyroRead(bmi088, BMI088_GYRO_X_L, buf, 6);
|
||||||
for (uint8_t i = 0; i < 3; i++)
|
for (uint8_t i = 0; i < 3; i++)
|
||||||
bmi088->gyro[i] = bmi088->BMI088_GYRO_SEN * (float)(int16_t)(((buf[2 * i + 1]) << 8) | buf[2 * i]);
|
bmi088->gyro[i] = bmi088->BMI088_GYRO_SEN * (float)(int16_t)(((buf[2 * i + 1]) << 8) | buf[2 * i]);
|
||||||
if(bmi088->gyro[0] < -20)
|
|
||||||
{
|
|
||||||
bmi088->update_flag.temp = 1;
|
|
||||||
}
|
|
||||||
// 启动陀螺仪数据读取,并转换为实际值
|
// 启动陀螺仪数据读取,并转换为实际值
|
||||||
// 读取完毕会调用BMI088GyroSPIFinishCallback
|
// 读取完毕会调用BMI088GyroSPIFinishCallback
|
||||||
}
|
}
|
||||||
@@ -277,13 +275,15 @@ uint8_t BMI088Acquire(BMI088Instance *bmi088, BMI088_Data_t *data_store)
|
|||||||
{
|
{
|
||||||
memcpy(data_store->acc,bmi088->acc,3*sizeof(float));
|
memcpy(data_store->acc,bmi088->acc,3*sizeof(float));
|
||||||
bmi088->update_flag.acc = 0;
|
bmi088->update_flag.acc = 0;
|
||||||
|
bmi088->update_flag.imu_ready = 0;
|
||||||
}
|
}
|
||||||
if(bmi088->update_flag.gyro == 1)
|
if(bmi088->update_flag.gyro == 1)
|
||||||
{
|
{
|
||||||
memcpy(data_store->gyro,bmi088->gyro,3*sizeof(float));
|
memcpy(data_store->gyro,bmi088->gyro,3*sizeof(float));
|
||||||
bmi088->update_flag.gyro = 0;
|
bmi088->update_flag.gyro = 0;
|
||||||
}
|
|
||||||
bmi088->update_flag.imu_ready = 0;
|
bmi088->update_flag.imu_ready = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user