为啥我只发送一次,却一再进入错误中断里面呢
#include "stm32f7xx.h"
#include "Drv_Can.h"
#include "stdlib.h"
#define CAN1_CLK_ENABLE() __HAL_RCC_CAN1_CLK_ENABLE()
#define CAN1_GPIOB_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define CAN1_TX_PORT GPIOB
#define CAN1_RX_PORT GPIOB
#define CAN1_TX_PIN GPIO_PIN_9
#define CAN1_RX_PIN GPIO_PIN_8
extern UART_HandleTypeDef UartHandle;
void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan)
{
HAL_UART_Transmit_IT(&UartHandle, "2\r\n", 3);
}
void CAN1_TX_IRQHandler(void)
{
CAN_HandleTypeDef hcan;
/* enter interrupt */
HAL_CAN_IRQHandler(&hcan);
/* leave interrupt */
}
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
{
HAL_UART_Transmit_IT(&UartHandle, "1\r\n", 3);
}
void CAN1_RX0_IRQHandler(void)
{
CAN_HandleTypeDef hcan;
/* enter interrupt */
HAL_CAN_IRQHandler(&hcan);
/* leave interrupt */
}
void CAN1_RX1_IRQHandler(void)
{
CAN_HandleTypeDef hcan;
/* enter interrupt */
HAL_CAN_IRQHandler(&hcan);
/* leave interrupt */
}
void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
{
if((hcan->ErrorCode & HAL_CAN_ERROR_EWG) == HAL_CAN_ERROR_EWG)
HAL_UART_Transmit_IT(&UartHandle, "3\r\n", 3);
if ((hcan->ErrorCode & HAL_CAN_ERROR_EPV) == HAL_CAN_ERROR_EPV)
HAL_UART_Transmit_IT(&UartHandle, "4\r\n", 3);
if ((hcan->ErrorCode & HAL_CAN_ERROR_BOF) == HAL_CAN_ERROR_BOF)
HAL_UART_Transmit_IT(&UartHandle, "5\r\n", 3);
if ((hcan->ErrorCode & HAL_CAN_ERROR_STF) == HAL_CAN_ERROR_STF)
HAL_UART_Transmit_IT(&UartHandle, "6\r\n", 3);
if ((hcan->ErrorCode & HAL_CAN_ERROR_FOR) == HAL_CAN_ERROR_FOR)
HAL_UART_Transmit_IT(&UartHandle, "7\r\n", 3);
if ((hcan->ErrorCode & HAL_CAN_ERROR_ACK) == HAL_CAN_ERROR_ACK)
HAL_UART_Transmit_IT(&UartHandle, "8\r\n", 3);
if ((hcan->ErrorCode & HAL_CAN_ERROR_BR) == HAL_CAN_ERROR_BR)
HAL_UART_Transmit_IT(&UartHandle, "9\r\n",3);
if ((hcan->ErrorCode & HAL_CAN_ERROR_BD) == HAL_CAN_ERROR_BD)
HAL_UART_Transmit_IT(&UartHandle, "10\r\n", 4);
if ((hcan->ErrorCode & HAL_CAN_ERROR_CRC) == HAL_CAN_ERROR_CRC)
HAL_UART_Transmit_IT(&UartHandle, "11\r\n", 3);
HAL_NVIC_DisableIRQ(CAN1_SCE_IRQn);
}
void CAN1_SCE_IRQHandler(void)
{
CAN_HandleTypeDef hcan;
/* enter interrupt */
HAL_CAN_IRQHandler(&hcan);
/* leave interrupt */
}
void CANtx(void)
{
CAN_HandleTypeDef hcan;
char i;
static CanTxMsgTypeDef TxMessage;
static CanRxMsgTypeDef RxMessage;
hcan.Instance = CAN1;
hcan.pTxMsg = &TxMessage;
hcan.pRxMsg = &RxMessage;
if((hcan.pTxMsg != NULL) && (hcan.pRxMsg != NULL))
{
HAL_UART_Transmit_IT(&UartHandle, "malloc\r\n", 8);
hcan.pTxMsg->ExtId = 0x1234;
//hcan.pTxMsg->StdId = 0x11;
hcan.pTxMsg->IDE = CAN_ID_EXT;
hcan.pTxMsg->RTR = CAN_RTR_DATA;
hcan.pTxMsg->DLC = 2;
for(i=0;i<hcan.pTxMsg->DLC;i++)
{
hcan.pTxMsg->Data[i] = 0x55;
}
if (HAL_CAN_Transmit_IT(&hcan) == HAL_OK)
{
//rt_kprintf("CAN tx success!\r\n");
HAL_UART_Transmit_IT(&UartHandle, "ITsuc\r\n", 7);
}
else
{
HAL_UART_Transmit_IT(&UartHandle, "ITfail\r\n", 8);
}
}
}
void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
{
GPIO_InitTypeDef GPIO_InitStruct;
CAN1_CLK_ENABLE();
CAN1_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Alternate = GPIO_AF9_CAN1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pin = CAN1_TX_PIN;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(CAN1_TX_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = CAN1_RX_PIN;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(CAN1_RX_PORT, &GPIO_InitStruct);
HAL_NVIC_SetPriority(CAN1_TX_IRQn,5,0);
HAL_NVIC_EnableIRQ(CAN1_TX_IRQn);
HAL_NVIC_SetPriority(CAN1_RX0_IRQn,5,0);
HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn);
HAL_NVIC_SetPriority(CAN1_RX1_IRQn,5,0);
HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);
HAL_NVIC_SetPriority(CAN1_SCE_IRQn,5,0);
HAL_NVIC_EnableIRQ(CAN1_SCE_IRQn);
}
int Can_hw_init(void)
{
CAN_HandleTypeDef hcan;
hcan.Instance = CAN1;
if(HAL_CAN_DeInit(&hcan)!= HAL_OK)
{
return 0;
}
hcan.Init.ABOM = DISABLE;
hcan.Init.AWUM = DISABLE;
hcan.Init.BS1 = CAN_BS1_13TQ;
hcan.Init.BS2 = CAN_BS2_2TQ;
hcan.Init.Mode = CAN_MODE_LOOPBACK;
hcan.Init.NART = DISABLE;
hcan.Init.Prescaler = 12;
hcan.Init.RFLM = ENABLE;
hcan.Init.SJW = CAN_SJW_2TQ;
hcan.Init.TTCM = DISABLE;
hcan.Init.TXFP = DISABLE;
if(HAL_CAN_Init(&hcan)!= HAL_OK)
{
return 0;
}
CAN_FilterConfTypeDef sFilterConfig;
sFilterConfig.BankNumber = 14;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
sFilterConfig.FilterIdHigh = 0x0000;
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000;
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterNumber = 0;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
HAL_CAN_ConfigFilter(&hcan,&sFilterConfig);
}
|