summaryrefslogtreecommitdiff
path: root/source/can_task.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/can_task.c')
-rw-r--r--source/can_task.c60
1 files changed, 45 insertions, 15 deletions
diff --git a/source/can_task.c b/source/can_task.c
index 82b0dda..205e397 100644
--- a/source/can_task.c
+++ b/source/can_task.c
@@ -60,13 +60,31 @@ static uint8_t data_buffer[2][APALIS_TK1_CAN_RX_BUF_SIZE][CAN_TRANSFER_BUF_LEN];
static struct can_registers can_regs[2];
uint8_t resume_can;
-void generate_can_irq(uint8_t id) {
+void generate_can_irq(uint8_t id)
+{
if (id == 0)
GPIO_TogglePinsOutput(GPIOB, 1u << 8u);
else
GPIO_TogglePinsOutput(GPIOE, 1u << 26u);
}
+void can_tx_notify_task(void *pvParameters)
+{
+ uint32_t ulInterruptStatus;
+
+ while(1){
+ xTaskNotifyWait( 0x00, 0xFFFFFFFF, &ulInterruptStatus, portMAX_DELAY);
+ if (ulInterruptStatus & 0x01) {
+ registers[APALIS_TK1_K20_CANREG + APALIS_TK1_K20_CAN_DEV_OFFSET(0)] |= CANINTF_TX;
+ generate_can_irq(0);
+ }
+ if (ulInterruptStatus & 0x02) {
+ registers[APALIS_TK1_K20_CANREG + APALIS_TK1_K20_CAN_DEV_OFFSET(1)] |= CANINTF_TX;
+ generate_can_irq(1);
+ }
+ }
+}
+
static void flexcan_callback0(CAN_Type *base, flexcan_handle_t *handle, status_t status, uint32_t result, void *userData)
{
callback_message_t * cb = (callback_message_t*) userData;
@@ -82,9 +100,7 @@ static void flexcan_callback0(CAN_Type *base, flexcan_handle_t *handle, status_t
case kStatus_FLEXCAN_TxIdle:
if (TX_MESSAGE_BUFFER_NUM0 == result)
{
- /* write status and gen irq */
- registers[APALIS_TK1_K20_CANREG] |= CANINTF_TX;
- generate_can_irq(0);
+ xTaskNotifyFromISR(can_tx_notify_task_handle, 0x01, eSetBits, &reschedule);
}
break;
@@ -109,9 +125,7 @@ static void flexcan_callback1(CAN_Type *base, flexcan_handle_t *handle, status_t
case kStatus_FLEXCAN_TxIdle:
if (TX_MESSAGE_BUFFER_NUM0 == result)
{
- /* write status and gen irq */
- registers[APALIS_TK1_K20_CANREG + APALIS_TK1_K20_CAN_OFFSET] |= CANINTF_TX;
- generate_can_irq(1);
+ xTaskNotifyFromISR(can_tx_notify_task_handle, 0x02, eSetBits, &reschedule);
}
break;
@@ -142,15 +156,19 @@ static void CAN0_Init()
FLEXCAN_SetRxMbGlobalMask(CAN0, FLEXCAN_RX_MB_EXT_MASK(0x00, 0, 0));
FLEXCAN_SetRxFifoGlobalMask(CAN0, FLEXCAN_RX_MB_EXT_MASK(0x00, 0, 0));
- /* Setup Tx Message Buffer. */
- FLEXCAN_SetTxMbConfig(CAN0, TX_MESSAGE_BUFFER_NUM0, true);
-
- fifoConfig.idFilterNum = 1;
+ fifoConfig.idFilterNum = 0;
fifoConfig.idFilterTable = &fifoFilter;
fifoConfig.idFilterType = kFLEXCAN_RxFifoFilterTypeC;
fifoConfig.priority = kFLEXCAN_RxFifoPrioHigh;
FLEXCAN_SetRxFifoConfig(CAN0, &fifoConfig, true);
+ /* errata #5641 */
+ FLEXCAN_SetTxMbConfig(CAN0, TX_MESSAGE_BUFFER_NUM0 - 1, true);
+
+ /* Setup Tx Message Buffer. */
+ FLEXCAN_SetTxMbConfig(CAN0, TX_MESSAGE_BUFFER_NUM0, true);
+ memset(&can_regs[0], 0x00u,sizeof(struct can_registers));
+
PRINTF("CAN0 init done \r\n");
}
@@ -175,15 +193,19 @@ static void CAN1_Init()
FLEXCAN_SetRxMbGlobalMask(CAN1, FLEXCAN_RX_MB_EXT_MASK(0x00, 0, 0));
FLEXCAN_SetRxFifoGlobalMask(CAN1, FLEXCAN_RX_MB_EXT_MASK(0x00, 0, 0));
- /* Setup Tx Message Buffer. */
- FLEXCAN_SetTxMbConfig(CAN1, TX_MESSAGE_BUFFER_NUM0, true);
-
- fifoConfig.idFilterNum = 1;
+ fifoConfig.idFilterNum = 0;
fifoConfig.idFilterTable = &fifoFilter;
fifoConfig.idFilterType = kFLEXCAN_RxFifoFilterTypeC;
fifoConfig.priority = kFLEXCAN_RxFifoPrioHigh;
FLEXCAN_SetRxFifoConfig(CAN1, &fifoConfig, true);
+ /* errata #5641 */
+ FLEXCAN_SetTxMbConfig(CAN1, TX_MESSAGE_BUFFER_NUM0 - 1, true);
+
+ /* Setup Tx Message Buffer. */
+ FLEXCAN_SetTxMbConfig(CAN1, TX_MESSAGE_BUFFER_NUM0, true);
+ memset(&can_regs[0], 0x00u,sizeof(struct can_registers));
+
PRINTF("CAN1 init done \r\n");
}
uint8_t available_data[2];
@@ -244,7 +266,9 @@ void can0_task(void *pvParameters) {
while(1)
{
+ taskENTER_CRITICAL();
FLEXCAN_TransferReceiveFifoNonBlocking(CAN0, &flexcanHandle[0], &rxXfer);
+ taskEXIT_CRITICAL();
if (xSemaphoreTake(cb_msg.sem, portMAX_DELAY) == pdTRUE) {
if (cb_msg.async_status == pdTRUE) {
cb_msg.async_status = pdFALSE;
@@ -274,7 +298,9 @@ void can1_task(void *pvParameters) {
while(1)
{
+ taskENTER_CRITICAL();
FLEXCAN_TransferReceiveFifoNonBlocking(CAN1, &flexcanHandle[1], &rxXfer);
+ taskEXIT_CRITICAL();
if (xSemaphoreTake(cb_msg.sem, portMAX_DELAY) == pdTRUE) {
if (cb_msg.async_status == pdTRUE) {
cb_msg.async_status = pdFALSE;
@@ -363,7 +389,9 @@ uint8_t can0_transmit(){
txXfer.frame = &tx_frame[0];
txXfer.mbIdx = TX_MESSAGE_BUFFER_NUM0;
+ taskENTER_CRITICAL();
FLEXCAN_TransferSendNonBlocking(CAN0, &flexcanHandle[0], &txXfer);
+ taskEXIT_CRITICAL();
return 0;
}
@@ -373,7 +401,9 @@ uint8_t can1_transmit(){
txXfer.frame = &tx_frame[1];
txXfer.mbIdx = TX_MESSAGE_BUFFER_NUM0;
+ taskENTER_CRITICAL();
FLEXCAN_TransferSendNonBlocking(CAN1, &flexcanHandle[1], &txXfer);
+ taskEXIT_CRITICAL();
return 0;
}