This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MCU-PLUS-SDK AM263X:以更高的频率发送 CAN 消息

Guru**** 1456440 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1357529/mcu-plus-sdk-am263x-sending-can-messages-at-a-higher-frequency

器件型号:MCU-PLUS-SDK AM263X

CAN 消息之后立即发送多个 CAN 消息。 但仅当发送消息之间没有延迟时、代码才会发送第一条消息。

void TorqueCalculationTask(void *pvParameters) {
    uint64_t throttlePosition = 10;
    uint64_t steeringPosition = 0;
    CANMessage rrMessage;
    CANMessage rlMessage;
    CANMessage frMessage;
    CANMessage flMessage;


    while (1) {
//        if (xSemaphoreTake(torqueValuesMutex, portMAX_DELAY)) {
//            readThrottle(); // Read the throttle value at each cycle
            throttlePosition = throttle_post_transfer;
            steeringPosition = steering_post_transfer;

            if (currentState == STATE_READY_TO_DRIVE && !brakePressed) {
                calculateTorque(throttlePosition, torqueValues, steeringPosition);
                createAMKCanMessage(0x1234, 1500, torqueValues[frontLeftInv], torqueValues[frontLeftInv+1], flMessage.message);
                flMessage.id = 0x105; // Set the appropriate CAN ID
                flMessage.message_length = 8;


                createAMKCanMessage(0x1234, 1500, torqueValues[frontRightInv], torqueValues[frontRightInv+1], frMessage.message);
                frMessage.id = 0x106; // Set the appropriate CAN ID
                frMessage.message_length = 8;

                createAMKCanMessage(0x1234, 1500, torqueValues[rearRightInv], torqueValues[rearRightInv+1], rrMessage.message);
                rrMessage.id = 0x107; // Set the appropriate CAN ID
                rrMessage.message_length = 8;

                createAMKCanMessage(0x1234, 1500, torqueValues[rearLeftInv], torqueValues[rearLeftInv+1], rlMessage.message);
                rlMessage.id = 0x108; // Set the appropriate CAN ID
                rlMessage.message_length = 8;


//                App_mcanSendCustomMsg(newMsg.id, MESSAGE_TYPE_STANDARD, MCAN_DATA_SIZE_8BYTES, newMsg.message);
//                if (xSemaphoreTake(canQueueMutex, portMAX_DELAY) == pdTRUE) {
                    xQueueSendToBack(canQueue, &rrMessage, portMAX_DELAY);
                    xQueueSendToBack(canQueue, &frMessage, portMAX_DELAY);
                    xQueueSendToBack(canQueue, &rlMessage, portMAX_DELAY);
                    xQueueSendToBack(canQueue, &flMessage, portMAX_DELAY);
                    xSemaphoreGive(canQueueMutex);

//                }

//            }
//            xSemaphoreGive(torqueValuesMutex);
        }
        vTaskDelay(pdMS_TO_TICKS(5)); // Adjust task delay as needed
    }
}

void CanMessageSendTask(void *pvParameters) {
    CANMessage msg;
    TickType_t lastWakeTime;
    const TickType_t frequency = pdMS_TO_TICKS(1);

    while(1){
        while (xQueueReceive(canQueue, &msg, portMAX_DELAY)) {
           vTaskSuspendAll();
           App_mcanSendCustomMsg(msg.id, MESSAGE_TYPE_STANDARD, MCAN_DATA_SIZE_8BYTES, msg.message);
           xTaskResumeAll();
        }



    }
}

int32_t App_mcanSendCustomMsg(uint32_t msgId, uint8_t msgType, uint8_t dlc,
                           const uint8_t *data) {
    MCAN_TxBufElement txMsg;
    uint32_t bufNum = 0U;  // Using first buffer for simplicity
    int32_t status;

    /* Initialize message to transmit */
    MCAN_initTxBufElement(&txMsg);

    /* Configure message ID based on type */
    if (msgType == MESSAGE_TYPE_STANDARD) {
        txMsg.id = (msgId & MCAN_STD_ID_MASK)
                   << MCAN_STD_ID_SHIFT;  // Standard ID
        txMsg.xtd = FALSE;                // Indicating standard identifier
    } else {
        txMsg.id = msgId & MCAN_EXT_ID_MASK;  // Extended ID
        txMsg.xtd = TRUE;                     // Indicating extended identifier
    }

    /* Configure DLC */
    txMsg.dlc = dlc;

    /* CAN FD frame format and BRS can be configured based on application needs */
    txMsg.fdf = FALSE;  // Not a CAN FD frame
    txMsg.brs = FALSE;  // Baud rate switching not used

    /* Copy data to the message buffer */
    for (uint32_t i = 0U; i < gMcanDataSize[dlc] && i < sizeof(txMsg.data); i++) {
        txMsg.data[i] = data[i];
    }

    /* Write message to Message RAM */
//    MCAN_writeMsgRam(gMcanBaseAddr, MCAN_MEM_TYPE_BUF, bufNum, &txMsg);
    MCAN_writeMsgRam(gMcanBaseAddr, MCAN_MEM_TYPE_FIFO, bufNum, &txMsg);


    /* Add request for transmission */
    status = MCAN_txBufAddReq(gMcanBaseAddr, bufNum);
    return status;
}

除非我在每次传输后添加"vTaskDelay (pdms_to_ticks (1);"、否则仅发送 ID 为0x107 (第一个添加到队列中的消息)的消息。 是否有在一个 Tx 完成后发送消息而不是必须添加手动延时时间的方法?

预期消息频率约为1500Hz、因此1毫秒延迟对我来说是不可行的

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是的、您应该检查传输完成情况、而不是添加延迟。  请  在重新传输之前浏览 MCAN_INTR_SRC_TX_FIFO_EMPTY。

     

    #define MCAN_INTR_SRC_TX_FIFO_EMPTY             (MCAN_IR_TFE_MASK)
    /**< Tx FIFO Empty interrupt */

    此致、
    贡詹