一、使用simulink对can信号进行拆包解析
/*__weak */void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
// CAN数据接收
uint8_t ind;
if (hcan->Instance == hcan1.Instance)
{
if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &hcan1_rx_temp.can_rx_temp, hcan1_rx_temp.can_rx_arry) == HAL_OK) // 获得接收到的数据头和数据
{
if(hcan1_rx_temp.can_rx_temp.StdId == 0x2A2)
{
CAN_s_Siganal_2A2.ID = 0x2A2;
CAN_s_Siganal_2A2.Length = hcan1_rx_temp.can_rx_temp.DLC;
for(ind = 0; ind < CAN_s_Siganal_2A2.Length; ind++)
{
CAN_s_Siganal_2A2.Data[ind] = hcan1_rx_temp.can_rx_arry[ind];
}
}
HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING); // 再次使能FIFO0接收中断
}
}
}
在CAN接收中断回调函数中对ID为0x2A2的报文进行处理,将数据传递给应用层全局变量CAN_s_Siganal_2A2。
void Task_For_100ms(void)
{
APP_Can_step();
APP_Mannual_Tx_Deal();
APP_Mannual_Rx_Deal();
}
void APP_Mannual_Rx_Deal(void)
{
if(CAN_MMI_Gclean_Key > 0)
{
HAL_GPIO_WritePin(GPIOB, LED_DS0_Pin, GPIO_PIN_RESET);
}
else
{
if(CAN_MMI_SceneModeReq ==1 || CAN_MMI_SceneModeReq == 3 || CAN_MMI_SceneModeReq == 5)
{
HAL_GPIO_WritePin(GPIOB, LED_DS0_Pin, GPIO_PIN_RESET);
}
else
{
HAL_GPIO_WritePin(GPIOB, LED_DS0_Pin, GPIO_PIN_SET);
}
}
}
应用层变量CAN_s_Siganal_2A2会被应用层进行解析拆包,CAN_MMI_Gclean_Key 与CAN_MMI_SceneModeReq 即为拆包后的两个变量。LED0会根据CAN_MMI_Gclean_Key 与CAN_MMI_SceneModeReq 进行响应。
二、使用simulink对信号进行打包发现can
while (1)
{
/* USER CODE END WHILE */
#if 1
if(KEY_Scan(0) > 0)
{
LIN_FCP_FrDefScan_Value = 1;
}
#endif
/* USER CODE BEGIN 3 */
}
void APP_Mannual_Tx_Deal(void)
{
static uint8_t index = 0;
hcan1_tx_temp.can_tx_temp.StdId = CAN_s_Siganal_2A5.ID;
for(uint8_t i = 0; i < CAN_s_Siganal_2A5.Length; i++)
{
hcan1_tx_temp.can_tx_arry[i] = CAN_s_Siganal_2A5.Data[i];
}
CAN1_Send_Msg(&hcan1_tx_temp);
if((LIN_FCP_FrDefScan_Value>0)&& (index < 3))
{
index++;
if(index > 3 - 1)
{
LIN_FCP_FrDefScan_Value = 0;
index = 0;
}
}
}
按键按下后,LIN_FCP_FrDefScan_Value变量置1,LIN_FCP_FrDefScan_Value经过应用层打包后传递给CAN_s_Siganal_2A5。在100ms task中,CAN_s_Siganal_2A5传递给hcan1_tx_temp,然后进行发送。LIN_FCP_FrDefScan_Value的positive信号只发送3帧,3帧后清零。
APP_Can_step()即为应用层代码。
代码记录:
STM32_Deal_A004
以上,仅为本人自用。