Код
uint8_t CAN1_Put( CanTxMsg* TxMess )
{
uint8_t xReturn;
if( xQueueSend( CAN1_TX_xQueue, &TxMess, 10 ) == pdPASS )
{
xReturn = pdPASS;
CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);
}
else
{
xReturn = pdFAIL;
}
return xReturn;
}
{
uint8_t xReturn;
if( xQueueSend( CAN1_TX_xQueue, &TxMess, 10 ) == pdPASS )
{
xReturn = pdPASS;
CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);
}
else
{
xReturn = pdFAIL;
}
return xReturn;
}
Обработчик прерывания на передачу:
Код
void CAN1_TX_IRQHandler (void)
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
if (CAN_GetITStatus(CAN1,CAN_IT_TME)==SET)
{
CAN_ClearITPendingBit(CAN1,CAN_IT_TME);
if( xQueueReceiveFromISR( CAN1_TX_xQueue, &TxMessage, &xHigherPriorityTaskWoken ) == pdTRUE )
{
CAN_Transmit(CAN1, &TxMessage);
}
else
{
CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);
}
}
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
}
{
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
if (CAN_GetITStatus(CAN1,CAN_IT_TME)==SET)
{
CAN_ClearITPendingBit(CAN1,CAN_IT_TME);
if( xQueueReceiveFromISR( CAN1_TX_xQueue, &TxMessage, &xHigherPriorityTaskWoken ) == pdTRUE )
{
CAN_Transmit(CAN1, &TxMessage);
}
else
{
CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);
}
}
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
}
Собственно, вопрос, что я делаю не так? НЕ заходит в обработчик прерывания по передаче.
UPD. Физика КАНа работоспособная, на шине два устройства, если без прерыаний, то сообщения отправляются и получатель получает (прерывание на приём срабатывает).