почему в прерывание по приему и передаче входит только раз? Может, я какие-то флаги не сбрасываю? или фильтр не правильно настроен.
Куда копать хоть...
настройка CAN
Код
static void MX_CAN1_Init(void)
{
hcan1.Instance = CAN1;
hcan1.Init.Prescaler = 16;
hcan1.Init.Mode = CAN_MODE_SILENT_LOOPBACK;
hcan1.Init.SJW = CAN_SJW_1TQ;
hcan1.Init.BS1 = CAN_BS1_3TQ;
hcan1.Init.BS2 = CAN_BS2_3TQ;
hcan1.Init.TTCM = DISABLE;
hcan1.Init.ABOM = ENABLE;
hcan1.Init.AWUM = DISABLE;
hcan1.Init.NART = DISABLE;
hcan1.Init.RFLM = ENABLE;
hcan1.Init.TXFP = DISABLE;
if (HAL_CAN_Init(&hcan1) != HAL_OK)
{
Error_Handler();
}
}
{
hcan1.Instance = CAN1;
hcan1.Init.Prescaler = 16;
hcan1.Init.Mode = CAN_MODE_SILENT_LOOPBACK;
hcan1.Init.SJW = CAN_SJW_1TQ;
hcan1.Init.BS1 = CAN_BS1_3TQ;
hcan1.Init.BS2 = CAN_BS2_3TQ;
hcan1.Init.TTCM = DISABLE;
hcan1.Init.ABOM = ENABLE;
hcan1.Init.AWUM = DISABLE;
hcan1.Init.NART = DISABLE;
hcan1.Init.RFLM = ENABLE;
hcan1.Init.TXFP = DISABLE;
if (HAL_CAN_Init(&hcan1) != HAL_OK)
{
Error_Handler();
}
}
функция отправки
Код
void CAN_Transmit(void)
{
hcan1.pTxMsg->StdId = 0x002;
hcan1.pTxMsg->DLC = 3;
hcan1.pTxMsg->Data[0] = tx++;
hcan1.pTxMsg->Data[1] = 2;
hcan1.pTxMsg->Data[2] = 3;
HAL_CAN_Transmit(&hcan1, 10);
{
hcan1.pTxMsg->StdId = 0x002;
hcan1.pTxMsg->DLC = 3;
hcan1.pTxMsg->Data[0] = tx++;
hcan1.pTxMsg->Data[1] = 2;
hcan1.pTxMsg->Data[2] = 3;
HAL_CAN_Transmit(&hcan1, 10);
прерывания
Код
void CAN1_TX_IRQHandler(void)
{
/* USER CODE BEGIN CAN1_TX_IRQn 0 */
/* USER CODE END CAN1_TX_IRQn 0 */
HAL_CAN_IRQHandler(&hcan1);
/* USER CODE BEGIN CAN1_TX_IRQn 1 */
//HAL_CAN_Transmit_IT(&hcan1);
/* USER CODE END CAN1_TX_IRQn 1 */
}
/**
* @brief This function handles CAN1 RX0 interrupt.
*/
void CAN1_RX0_IRQHandler(void)
{
/* USER CODE BEGIN CAN1_RX0_IRQn 0 */
HAL_CAN_IRQHandler(&hcan1);
/* USER CODE END CAN1_RX0_IRQn 0 */
HAL_CAN_Receive(&hcan1,CAN_FIFO0,10);
hcan1.pRxMsg->DLC = 0x00;
hcan1.pRxMsg->StdId =0x00;
hcan1.pRxMsg->Data [0] = 0x00;
hcan1.pRxMsg->Data [1] = 0x00;
hcan1.pRxMsg->Data [2] = 0x00;
hcan1.pRxMsg->Data [3] = 0x00;
hcan1.pRxMsg->Data [4] = 0x00;
hcan1.pRxMsg->Data [5] = 0x00;
hcan1.pRxMsg->Data [6] = 0x00;
hcan1.pRxMsg->Data [7] = 0x00;
/* USER CODE BEGIN CAN1_RX0_IRQn 1 */
/* USER CODE END CAN1_RX0_IRQn 1 */
}
{
/* USER CODE BEGIN CAN1_TX_IRQn 0 */
/* USER CODE END CAN1_TX_IRQn 0 */
HAL_CAN_IRQHandler(&hcan1);
/* USER CODE BEGIN CAN1_TX_IRQn 1 */
//HAL_CAN_Transmit_IT(&hcan1);
/* USER CODE END CAN1_TX_IRQn 1 */
}
/**
* @brief This function handles CAN1 RX0 interrupt.
*/
void CAN1_RX0_IRQHandler(void)
{
/* USER CODE BEGIN CAN1_RX0_IRQn 0 */
HAL_CAN_IRQHandler(&hcan1);
/* USER CODE END CAN1_RX0_IRQn 0 */
HAL_CAN_Receive(&hcan1,CAN_FIFO0,10);
hcan1.pRxMsg->DLC = 0x00;
hcan1.pRxMsg->StdId =0x00;
hcan1.pRxMsg->Data [0] = 0x00;
hcan1.pRxMsg->Data [1] = 0x00;
hcan1.pRxMsg->Data [2] = 0x00;
hcan1.pRxMsg->Data [3] = 0x00;
hcan1.pRxMsg->Data [4] = 0x00;
hcan1.pRxMsg->Data [5] = 0x00;
hcan1.pRxMsg->Data [6] = 0x00;
hcan1.pRxMsg->Data [7] = 0x00;
/* USER CODE BEGIN CAN1_RX0_IRQn 1 */
/* USER CODE END CAN1_RX0_IRQn 1 */
}
МЭЙН
Код
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_CAN1_Init();
/* USER CODE BEGIN 2 */
hcan1.pTxMsg = &canTxMessage;
hcan1.pRxMsg = &canRxMessage;
//фильтры CAN
// настраиваем фильтр — приём всех посылок
CAN_FilterConfTypeDef canFilterConfig;
canFilterConfig.FilterNumber = 0;
canFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
canFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
canFilterConfig.FilterIdHigh = 0x0000;
canFilterConfig.FilterIdLow = 0x0000;
canFilterConfig.FilterMaskIdHigh = 0x0000 << 5;
canFilterConfig.FilterMaskIdLow = 0x0000;
canFilterConfig.FilterFIFOAssignment = 0;
canFilterConfig.FilterActivation = ENABLE;
canFilterConfig.BankNumber = 1;
HAL_CAN_ConfigFilter(&hcan1, &canFilterConfig);
HAL_CAN_Receive_IT(&hcan1, CAN_FIFO0); //разрешаем приём посылок
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
CAN_Transmit();
HAL_Delay(10);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_CAN1_Init();
/* USER CODE BEGIN 2 */
hcan1.pTxMsg = &canTxMessage;
hcan1.pRxMsg = &canRxMessage;
//фильтры CAN
// настраиваем фильтр — приём всех посылок
CAN_FilterConfTypeDef canFilterConfig;
canFilterConfig.FilterNumber = 0;
canFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
canFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
canFilterConfig.FilterIdHigh = 0x0000;
canFilterConfig.FilterIdLow = 0x0000;
canFilterConfig.FilterMaskIdHigh = 0x0000 << 5;
canFilterConfig.FilterMaskIdLow = 0x0000;
canFilterConfig.FilterFIFOAssignment = 0;
canFilterConfig.FilterActivation = ENABLE;
canFilterConfig.BankNumber = 1;
HAL_CAN_ConfigFilter(&hcan1, &canFilterConfig);
HAL_CAN_Receive_IT(&hcan1, CAN_FIFO0); //разрешаем приём посылок
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
CAN_Transmit();
HAL_Delay(10);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
Что не так???? stm32105R8Tx