150 lines
4.3 KiB
C
150 lines
4.3 KiB
C
#include "main.h"
|
||
#include "can.h"
|
||
#include "gpio.h"
|
||
#include "CToC.h"
|
||
#include "RefreeSystem.h"
|
||
#include "Remote.h"
|
||
#include "M3508.h"
|
||
|
||
|
||
|
||
static CAN_TxHeaderTypeDef TxMessage;
|
||
static uint8_t DATE_CAIPAN[8];
|
||
uint8_t CToC_SlaveSendRefereeSystemData(void)
|
||
{
|
||
uint32_t send_mail_box;
|
||
TxMessage.StdId=CToC_MasterID1;
|
||
TxMessage.IDE = CAN_ID_STD;
|
||
TxMessage.RTR = CAN_RTR_DATA;
|
||
TxMessage.DLC=0x08;
|
||
DATE_CAIPAN[0]=RefereeSystem_ShooterStatus;
|
||
DATE_CAIPAN[1]=0;
|
||
DATE_CAIPAN[2]=0;
|
||
DATE_CAIPAN[3]=0;
|
||
DATE_CAIPAN[4]=0;
|
||
DATE_CAIPAN[5]=0;
|
||
DATE_CAIPAN[6]=0;
|
||
DATE_CAIPAN[7]=0;
|
||
|
||
HAL_StatusTypeDef status = HAL_CAN_AddTxMessage(&hcan2, &TxMessage,DATE_CAIPAN, &send_mail_box);
|
||
if (status != HAL_OK) {
|
||
return 0;
|
||
}
|
||
|
||
uint16_t i = 0;
|
||
while ((HAL_CAN_IsTxMessagePending(&hcan2, send_mail_box)) && (i < 0xFFF)) {
|
||
i++;
|
||
}
|
||
if (i >= 0xFFF) {
|
||
return 0;
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
|
||
|
||
void can_filter_init(void)
|
||
{
|
||
CAN_FilterTypeDef can_filter_st;
|
||
|
||
// ==================== CAN1 ?? ====================
|
||
// CAN1??ID
|
||
can_filter_st.FilterActivation = ENABLE;
|
||
can_filter_st.FilterMode = CAN_FILTERMODE_IDMASK;
|
||
can_filter_st.FilterScale = CAN_FILTERSCALE_32BIT;
|
||
can_filter_st.FilterIdHigh = 0x0000; // ??ID
|
||
can_filter_st.FilterIdLow = 0x0000;
|
||
can_filter_st.FilterMaskIdHigh = 0x0000;
|
||
can_filter_st.FilterMaskIdLow = 0x0007; // ??ID
|
||
can_filter_st.FilterBank = 0;
|
||
can_filter_st.FilterFIFOAssignment = CAN_RX_FIFO0;
|
||
can_filter_st.SlaveStartFilterBank = 14; // CAN2??14???
|
||
HAL_CAN_ConfigFilter(&hcan1, &can_filter_st);
|
||
HAL_CAN_Start(&hcan1);
|
||
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
|
||
|
||
// ==================== CAN2 ?? ====================
|
||
// CAN2??ID 0x200-0x207???
|
||
can_filter_st.FilterIdHigh = 0; // ?????ID
|
||
can_filter_st.FilterIdLow = 0; // ?????ID
|
||
can_filter_st.FilterMaskIdHigh = 0; // ???????ID
|
||
can_filter_st.FilterMaskIdLow = 0; // ???????ID
|
||
can_filter_st.FilterBank = 14; // CAN2??????14
|
||
can_filter_st.FilterFIFOAssignment = CAN_RX_FIFO0;
|
||
HAL_CAN_ConfigFilter(&hcan2, &can_filter_st);
|
||
HAL_CAN_Start(&hcan2);
|
||
HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);
|
||
}
|
||
|
||
|
||
Remote_Data Remote_RxData;
|
||
|
||
void CToC_CANDataProcess(uint32_t ID,uint8_t *Data)
|
||
{
|
||
if(ID==CToC_SlaveID1)//?????????
|
||
{
|
||
Remote_RxData.Remote_R_RL=(uint16_t)((uint16_t)Data[0]<<8 | Data[1]);//?????
|
||
Remote_RxData.Remote_R_UD=(uint16_t)((uint16_t)Data[2]<<8 | Data[3]);//?????
|
||
Remote_RxData.Remote_L_RL=(uint16_t)((uint16_t)Data[4]<<8 | Data[5]);//?????
|
||
Remote_RxData.Remote_L_UD=(uint16_t)((uint16_t)Data[6]<<8 | Data[7]);//?????
|
||
}
|
||
else if(ID==CToC_SlaveID2)//?????????
|
||
{
|
||
Remote_Status=Data[0];//???????
|
||
Remote_RxData.Remote_RS=Data[1];//?????????
|
||
Remote_RxData.Remote_KeyPush_Ctrl=Data[2];//??Ctrl??
|
||
Remote_RxData.Remote_KeyPush_Shift=Data[3];//??Shift??
|
||
Remote_StartFlag=Data[4];//????????
|
||
Remote_RxData.Remote_LS=Data[5];//?????????
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief <20><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
* @param motor_id: <20><><EFBFBD><EFBFBD>ID (0-3)
|
||
* @param measure: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
||
*/
|
||
|
||
void Update_Motor_Measure(uint8_t motor_id, motor_measure_t* measure)
|
||
{
|
||
if (motor_id < 4) {
|
||
// ֱ<>ӽṹ<D3BD>帳ֵ<E5B8B3><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ࣩ
|
||
motor_controller[motor_id].measure = *measure;
|
||
}
|
||
}
|
||
|
||
|
||
//can<61><6E><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD>ṹ<EFBFBD>嶨<EFBFBD><E5B6A8>
|
||
// CAN2<4E><32><EFBFBD>ջص<D5BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
||
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);
|
||
|
||
// <20>ж<EFBFBD><D0B6><EFBFBD>CAN1<4E><31><EFBFBD><EFBFBD>CAN2
|
||
if (hcan->Instance == CAN1) {
|
||
// CAN1<4E><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (ID 1-4)
|
||
switch (rx_header.StdId) {
|
||
case 1: case 2: case 3: case 4: {
|
||
static uint8_t i = 0;
|
||
i = rx_header.StdId - 1;
|
||
get_motor_measure(&motor_chassis[i], rx_data);
|
||
Update_Motor_Measure(i, &motor_chassis[i]);
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
else if (hcan->Instance == CAN2) {
|
||
// CAN2<4E><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
CToC_CANDataProcess(rx_header.StdId, rx_data);
|
||
}
|
||
}
|
||
//HAL<41><4C><EFBFBD><EFBFBD><EFBFBD>պ<EFBFBD><D5BA><EFBFBD>HAL_CAN_GetRxMessage
|
||
HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]);
|
||
|
||
|