Files
Infantry_new/Core/Src/CAN_receive.c

137 lines
4.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
****************************(C) COPYRIGHT 2019 DJI****************************
* @file can_receive.c/h
* @brief there is CAN interrupt function to receive motor data,
* and CAN send function to send motor current to control motor.
* @note
* @history
* Version Date Author Modification
* V1.0.0 Dec-26-2018 RM 1. done
*
@verbatim
==============================================================================
==============================================================================
@endverbatim
****************************(C) COPYRIGHT 2019 DJI****************************
*/
#include "CAN_receive.h"
#include "main.h"
extern CAN_HandleTypeDef hcan1;
//motor data read读取电机数据更新电机状态结构体
#define get_motor_measure(ptr, data) \
{ \
(ptr)->last_ecd = (ptr)->ecd; \
(ptr)->ecd = (uint16_t)((data)[0] << 8 | (data)[1]); \
(ptr)->speed_rpm = (uint16_t)((data)[2] << 8 | (data)[3]); \
(ptr)->given_current = (uint16_t)((data)[4] << 8 | (data)[5]); \
(ptr)->temperate = (data)[6]; \
}
/*
motor data, 0:chassis motor1 3508;1:chassis motor2 3508;2:chassis motor3 3508;3:chassis motor4 3508;
*/
static motor_measure_t motor_chassis[4];
static CAN_TxHeaderTypeDef chassis_tx_message;
static uint8_t chassis_can_send_data[8];
/**
* @brief hal CAN fifo call back, receive motor data
* @param[in] hcan, the point to CAN handle
* @retval none
*/
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
CAN_RxHeaderTypeDef rx_header;
uint8_t rx_data[8];
HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rx_header, rx_data);
switch (rx_header.StdId)
{
case CAN_3508_M1_ID:
case CAN_3508_M2_ID:
case CAN_3508_M3_ID:
case CAN_3508_M4_ID:
{
static uint8_t i = 0;
//get motor id
i = rx_header.StdId - CAN_3508_M1_ID;
get_motor_measure(&motor_chassis[i], rx_data);
break;
}
default:
{
break;
}
}
}
/**
* @brief send CAN packet of ID 0x700, it will set chassis motor 3508 to quick ID setting
* @param[in] none
* @retval none
*/
void CAN_cmd_chassis_reset_ID(void)
{
uint32_t send_mail_box;
chassis_tx_message.StdId = 0x700;
chassis_tx_message.IDE = CAN_ID_STD;
chassis_tx_message.RTR = CAN_RTR_DATA;
chassis_tx_message.DLC = 0x08;
chassis_can_send_data[0] = 0;
chassis_can_send_data[1] = 0;
chassis_can_send_data[2] = 0;
chassis_can_send_data[3] = 0;
chassis_can_send_data[4] = 0;
chassis_can_send_data[5] = 0;
chassis_can_send_data[6] = 0;
chassis_can_send_data[7] = 0;
HAL_CAN_AddTxMessage(&CHASSIS_CAN, &chassis_tx_message, chassis_can_send_data, &send_mail_box);
}
/**
* @brief send control current of motor (0x201, 0x202, 0x203, 0x204)
* @param[in] motor1: (0x201) 3508 motor control current, range [-16384,16384]
* @param[in] motor2: (0x202) 3508 motor control current, range [-16384,16384]
* @param[in] motor3: (0x203) 3508 motor control current, range [-16384,16384]
* @param[in] motor4: (0x204) 3508 motor control current, range [-16384,16384]
* @retval none
*/
void CAN_cmd_chassis(int16_t motor1, int16_t motor2, int16_t motor3, int16_t motor4)
{
uint32_t send_mail_box;
chassis_tx_message.StdId = CAN_CHASSIS_ALL_ID;
chassis_tx_message.IDE = CAN_ID_STD;
chassis_tx_message.RTR = CAN_RTR_DATA;
chassis_tx_message.DLC = 0x08;
chassis_can_send_data[0] = motor1 >> 8;
chassis_can_send_data[1] = motor1;
chassis_can_send_data[2] = motor2 >> 8;
chassis_can_send_data[3] = motor2;
chassis_can_send_data[4] = motor3 >> 8;
chassis_can_send_data[5] = motor3;
chassis_can_send_data[6] = motor4 >> 8;
chassis_can_send_data[7] = motor4;
HAL_CAN_AddTxMessage(&CHASSIS_CAN, &chassis_tx_message, chassis_can_send_data, &send_mail_box);
}
/**
* @brief return the chassis 3508 motor data point
* @param[in] i: motor number,range [0,3]
* @retval motor data point
*/
const motor_measure_t *get_chassis_motor_measure_point(uint8_t i)
{
return &motor_chassis[(i & 0x03)];
}