Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1ad8e5b04f | |||
| ef034f3195 | |||
| 825ddc6961 | |||
| 604e9e603b |
+4
-2
@@ -45,8 +45,10 @@ extern "C" {
|
||||
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* USER CODE BEGIN EM */
|
||||
#define DEBUG
|
||||
#ifdef DEBUG
|
||||
#define DEBUG_ITM
|
||||
#define DEBUG_DUMMY_FRAME
|
||||
|
||||
#ifdef DEBUG_ITM
|
||||
#include <stdio.h>
|
||||
#define DEBUG_PRINT(...) printf(__VA_ARGS__)
|
||||
#else
|
||||
|
||||
+7
-8
@@ -51,9 +51,11 @@ void CAN_Logger_Init(CAN_HandleTypeDef *hcan1, CAN_HandleTypeDef *hcan2)
|
||||
|
||||
filter.FilterBank = 0;
|
||||
if (HAL_CAN_ConfigFilter(hcan1, &filter) != HAL_OK) Error_Handler();
|
||||
if (HAL_CAN_Start(hcan1) != HAL_OK) Error_Handler();
|
||||
|
||||
filter.FilterBank = 14;
|
||||
if (HAL_CAN_ConfigFilter(hcan2, &filter) != HAL_OK) Error_Handler();
|
||||
if (HAL_CAN_Start(hcan2) != HAL_OK) Error_Handler();
|
||||
}
|
||||
/* END CAN_Logger_Init */
|
||||
|
||||
@@ -75,8 +77,7 @@ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
|
||||
// TODO: manage the case of FIFO overflow
|
||||
if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rxHeader, data) != HAL_OK) return;
|
||||
|
||||
if (rxHeader.IDE == CAN_ID_EXT) message.id = rxHeader.ExtId;
|
||||
else message.id = rxHeader.StdId;
|
||||
message.id = rxHeader.ExtId;
|
||||
message.dlc = rxHeader.DLC;
|
||||
message.isExtended = (rxHeader.IDE == CAN_ID_EXT);
|
||||
message.source = (hcan->Instance == CAN1) ? 1 : 2;
|
||||
@@ -112,21 +113,19 @@ void vCANListener(void *argument)
|
||||
osMessageQueueId_t queue = (hcan->Instance == CAN1) ? xCAN1RxQueue : xCAN2RxQueue;
|
||||
CanMessage_t message;
|
||||
|
||||
if (HAL_CAN_Start(hcan) != HAL_OK) Error_Handler();
|
||||
HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
|
||||
|
||||
uint32_t irqn = (hcan->Instance == CAN1) ? CAN1_RX0_IRQn : CAN2_RX0_IRQn;
|
||||
HAL_NVIC_SetPriority(irqn, 6, 0);
|
||||
HAL_NVIC_EnableIRQ(irqn);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (osMessageQueueGet(queue, &message, NULL, osWaitForever) == osOK)
|
||||
if (osMessageQueueGet(queue, &message, NULL, 1000) == osOK)
|
||||
{
|
||||
// J1939 decoding
|
||||
|
||||
// RELAY: Push to the UART queue
|
||||
osMessageQueuePut(xUARTQueue, &message, 0U, 0U);
|
||||
}
|
||||
else DEBUG_PRINT("No CAN yet!\r\n");
|
||||
|
||||
}
|
||||
}
|
||||
/* END vCANListener */
|
||||
|
||||
+22
-9
@@ -104,23 +104,36 @@ void vUARTLogger(void *argument)
|
||||
CanMessage_t message;
|
||||
char tx_buffer[45];
|
||||
|
||||
#ifdef DEBUG_DUMMY_FRAME
|
||||
CanMessage_t dummy_frame = {
|
||||
.id = 0x0CF00400, // J1939 EEC1 ID
|
||||
.dlc = 8, // 8 bytes of data
|
||||
.isExtended = 1, // 29-bit Extended ID
|
||||
.source = 1, // CAN1
|
||||
.payload = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x11, 0x22}
|
||||
};
|
||||
#endif
|
||||
|
||||
for (;;)
|
||||
{
|
||||
DEBUG_PRINT("Waiting for CAN traffic...\r\n");
|
||||
|
||||
#ifdef DEBUG_DUMMY_FRAME
|
||||
osMessageQueuePut(xUARTQueue, &dummy_frame, 0U, 0U);
|
||||
osDelay(1000);
|
||||
#endif
|
||||
|
||||
if (osMessageQueueGet(xUARTQueue, &message, NULL, osWaitForever) == osOK)
|
||||
{
|
||||
DEBUG_PRINT("Waiting for CAN traffic...\r\n");
|
||||
if (osMessageQueueGet(xUARTQueue, &message, NULL, osWaitForever) == osOK)
|
||||
{
|
||||
osSemaphoreAcquire(xUARTDMASemaphore, osWaitForever);
|
||||
DEBUG_PRINT("CAN frame detected\r\n");
|
||||
int len = format_can_message(tx_buffer, message.source, &message);
|
||||
|
||||
if (HAL_UART_Transmit_DMA(&huart1, (uint8_t*)tx_buffer, len) == HAL_OK)
|
||||
{
|
||||
HAL_UART_Transmit_DMA(&huart1, (uint8_t*)tx_buffer, len);
|
||||
osSemaphoreAcquire(xUARTDMASemaphore, osWaitForever);
|
||||
DEBUG_PRINT("CAN frame sent via UART\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
osSemaphoreRelease(xUARTDMASemaphore);
|
||||
DEBUG_PRINT("HAL error, CAN frame NOT sent!\r\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+7
-8
@@ -77,7 +77,10 @@ static void MX_SDIO_SD_Init(void);
|
||||
static void MX_USART1_UART_Init(void);
|
||||
|
||||
/* USER CODE BEGIN PFP */
|
||||
int _write(int file, char *ptr, int len) for (int i = 0; i < len; i++) ITM_SendChar((*ptr++));
|
||||
int _write(int file, char *ptr, int len) {
|
||||
for (int i = 0; i < len; i++) {
|
||||
ITM_SendChar((*ptr++));
|
||||
}
|
||||
return len;
|
||||
}
|
||||
/* USER CODE END PFP */
|
||||
@@ -95,14 +98,10 @@ int main(void)
|
||||
{
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk)
|
||||
{
|
||||
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
|
||||
ITM->LAR = 0xC5ACCE55;
|
||||
ITM->TER = 1 << 0;
|
||||
ITM->TCR = ITM_TCR_ITMENA_Msk | ITM_TCR_SYNCENA_Msk | ITM_TCR_SWOENA_Msk;
|
||||
}
|
||||
|
||||
DEBUG_PRINT("Booting system\r\n");
|
||||
/* USER CODE END 1 */
|
||||
|
||||
@@ -172,7 +171,7 @@ int main(void)
|
||||
/* USER CODE END RTOS_MUTEX */
|
||||
|
||||
/* USER CODE BEGIN RTOS_SEMAPHORES */
|
||||
xUARTDMASemaphore = osSemaphoreNew(1, 1, NULL);
|
||||
xUARTDMASemaphore = osSemaphoreNew(1, 0, NULL);
|
||||
if (xUARTDMASemaphore == NULL) Error_Handler();
|
||||
/* USER CODE END RTOS_SEMAPHORES */
|
||||
|
||||
@@ -278,7 +277,7 @@ static void MX_CAN1_Init(void)
|
||||
|
||||
/* USER CODE END CAN1_Init 1 */
|
||||
hcan1.Instance = CAN1;
|
||||
hcan1.Init.Prescaler = 8;
|
||||
hcan1.Init.Prescaler = 4;
|
||||
hcan1.Init.Mode = CAN_MODE_SILENT;
|
||||
hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
|
||||
hcan1.Init.TimeSeg1 = CAN_BS1_16TQ;
|
||||
@@ -315,7 +314,7 @@ static void MX_CAN2_Init(void)
|
||||
|
||||
/* USER CODE END CAN2_Init 1 */
|
||||
hcan2.Instance = CAN2;
|
||||
hcan2.Init.Prescaler = 16;
|
||||
hcan2.Init.Prescaler = 8;
|
||||
hcan2.Init.Mode = CAN_MODE_SILENT;
|
||||
hcan2.Init.SyncJumpWidth = CAN_SJW_1TQ;
|
||||
hcan2.Init.TimeSeg1 = CAN_BS1_16TQ;
|
||||
|
||||
Reference in New Issue
Block a user