#include "MyCAN.h"
#include "can.h"
#include "FreeRTOS.h"
#include "cmsis_os.h"
void CAN_Config(CAN_HandleTypeDef *phcan, uint8_t FIFO_Num)
{
CAN_FilterTypeDef CAN_FilterType;
CAN_FilterType.FilterBank = 0;
CAN_FilterType.SlaveStartFilterBank = 14;
CAN_FilterType.FilterIdHigh = 0x0000;
CAN_FilterType.FilterIdLow = 0x0000;
CAN_FilterType.FilterMaskIdHigh = 0x0000;
CAN_FilterType.FilterMaskIdLow = 0x0000;
CAN_FilterType.FilterFIFOAssignment = FIFO_Num;
CAN_FilterType.FilterMode = CAN_FILTERMODE_IDMASK;
CAN_FilterType.FilterScale = CAN_FILTERSCALE_32BIT;
CAN_FilterType.FilterActivation = ENABLE;
if(HAL_CAN_ConfigFilter(phcan, &CAN_FilterType) != HAL_OK)
{
Error_Handler();
}
if(FIFO_Num == 0)
{
if(HAL_CAN_ActivateNotification(phcan, CAN_IT_RX_FIFO0_MSG_PENDING ) != HAL_OK)
{
Error_Handler();
}
}
else
{
if(HAL_CAN_ActivateNotification(phcan, CAN_IT_RX_FIFO1_MSG_PENDING ) != HAL_OK)
{
Error_Handler();
}
}
if(HAL_CAN_Start(phcan) != HAL_OK)
{
Error_Handler();
}
}
uint8_t Can_TxMessage(CAN_HandleTypeDef *phcan, uint8_t ide, uint32_t id, uint8_t len, uint8_t *pdata)
{
uint32_t TxMailbox;
CAN_TxHeaderTypeDef TxHeader;
HAL_StatusTypeDef HAL_RetVal;
uint16_t i = 0;
if(ide == 0)
{
TxHeader.IDE = CAN_ID_STD;
TxHeader.StdId = id;
}
else
{
TxHeader.IDE = CAN_ID_EXT;
TxHeader.ExtId = id;
}
TxHeader.RTR = CAN_RTR_DATA,
TxHeader.DLC = len,
TxHeader.TransmitGlobalTime = DISABLE;
while(HAL_CAN_GetTxMailboxesFreeLevel(phcan) == 0)
{
i++;
if(i > 0xfffe)
return 1;
}
osDelay(1);
HAL_RetVal = HAL_CAN_AddTxMessage(phcan, &TxHeader, pdata, &TxMailbox);
if(HAL_RetVal != HAL_OK)
return 1;
return 0;
}
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
uint8_t Rxbuff[8] = "";
CAN_RxHeaderTypeDef RxHeader;
HAL_StatusTypeDef HAL_RetVal;
if(hcan->Instance == CAN1)
{
HAL_RetVal = HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, Rxbuff);
if(HAL_RetVal == HAL_OK)
{
if(RxHeader.IDE == 0)
{
printf("FIFO0,ID:%d -- Rxbuff:%s\r\n", RxHeader.StdId, Rxbuff);
}
else
{
printf("FIFO0,ID:%d -- Rxbuff:%s\r\n", RxHeader.ExtId, Rxbuff);
}
}
}
}
void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
uint8_t Rxbuff[8] = "";
CAN_RxHeaderTypeDef RxHeader;
HAL_StatusTypeDef HAL_RetVal;
if(hcan->Instance == CAN1)
{
HAL_RetVal = HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO1, &RxHeader, Rxbuff);
if(HAL_RetVal == HAL_OK)
{
if(RxHeader.IDE == 0)
{
printf("FIFO1,ID:%d -- Rxbuff:%s\r\n", RxHeader.StdId, Rxbuff);
}
else
{
printf("FIFO1,ID:%d -- Rxbuff:%s\r\n", RxHeader.ExtId, Rxbuff);
}
}
}
}
void Can_Dome(CAN_HandleTypeDef *hcan1)
{
uint8_t sta;
sta = Can_TxMessage(hcan1, 0, 8, 8, "789456");
if(sta != 0)
{
printf("err:%d\r\n", sta);
}
}
#ifndef _MYCAN_H
#define _MYCAN_H
#include "main.h"
void CAN_Config(CAN_HandleTypeDef *phcan, uint8_t FIFO_Num);
uint8_t Can_TxMessage(CAN_HandleTypeDef *phcan, uint8_t ide, uint32_t id, uint8_t len, uint8_t *pdata);
void Can_Dome(CAN_HandleTypeDef *hcan1);
#endif