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.

AWR1642BOOST: MCAN至DCAN程序改动:

Part Number: AWR1642BOOST

项目需要把MCAN转为DCAN,我在改动编译成功后,程序运行不起来,我想可能是传输函数这块问题,以下是我修改的部分:

原本部分MCAN程序为:

int32_t Can_Transmit_Schedule(uint32_t msg_id,
                              uint8_t *txmsg,
                              uint32_t len)
{

    volatile uint32_t index   = 0;
    int32_t           retVal  = 0;
    int32_t           errCode = 0;

    // System_printf ("MEssage %x  len %d\n", msg_id, len);
    if (frameType == CANFD_MCANFrameType_FD)
    {
        Task_sleep(1);

        while (len > 64U)
        {
            retVal = CANFD_transmitData(txMsgObjHandle, msg_id, CANFD_MCANFrameType_FD, 64U, &txmsg[index], &errCode);
            index  = index + 64U;
            len    = len - 64U;

            Task_sleep(1);
        }
        retVal = CANFD_transmitData(txMsgObjHandle, msg_id, CANFD_MCANFrameType_FD, len, &txmsg[index], &errCode);
    }
    else
    {
        while (len > 8U)
        {
            retVal = CANFD_transmitData(txMsgObjHandle, msg_id, CANFD_MCANFrameType_CLASSIC, 8U, &txmsg[index], &errCode);
            if (retVal < 0)
            {

                continue;
            }
            index = index + 8U;
            len   = len - 8U;
        }

        retVal = CANFD_transmitData(txMsgObjHandle, msg_id, CANFD_MCANFrameType_CLASSIC, len, &txmsg[index], &errCode);

        while (retVal < 0)
        {
            // System_printf("Debug: Error transmitting CAN data %x , Errcode %x\n", retVal, errCode);
            retVal = CANFD_transmitData(txMsgObjHandle, msg_id, CANFD_MCANFrameType_CLASSIC, len, &txmsg[index], &errCode);
        }
    }


    return retVal;
}

static void MmwDemo_mboxReadTask(UArg arg0, UArg arg1)
{
    MmwDemo_message message;
    int32_t         retVal = 0;
    uint32_t        totalPacketLen;
    uint32_t        numPaddingBytes;
    uint32_t        itemIdx;

    /* wait for new message and process all the messages received from the peer */
    while (1)
    {
        Semaphore_pend(gMmwMssMCB.mboxSemHandle, BIOS_WAIT_FOREVER);

        /* Read the message from the peer mailbox: We are not trying to protect the read
         * from the peer mailbox because this is only being invoked from a single thread */
        retVal = Mailbox_read(gMmwMssMCB.peerMailbox, (uint8_t *)&message, sizeof(MmwDemo_message));
        if (retVal < 0)
        {
            /* Error: Unable to read the message. Setup the error code and return values */
            System_printf("Error: Mailbox read failed [Error code %d]\n", retVal);
        }
        else if (retVal == 0)
        {
            /* We are done: There are no messages available from the peer execution domain. */
            continue;
        }
        else
        {
            /* Flush out the contents of the mailbox to indicate that we are done with the message. This will
             * allow us to receive another message in the mailbox while we process the received message. */
            Mailbox_readFlush(gMmwMssMCB.peerMailbox);

            /* Process the received message: */
            switch (message.type)
            {
                case MMWDEMO_DSS2MSS_DETOBJ_READY:
                    /* Got detetced objectes , shipped out through UART */
                    /* Send header */
                    totalPacketLen                  = sizeof(MmwDemo_output_message_header);
                    txMsgObjectParams.msgIdentifier = Get_CanMessageIdentifier((MmwDemo_output_message_type)MMWDEMO_HEADER);

                    Can_Transmit_Schedule(txMsgObjectParams.msgIdentifier,
                                          (uint8_t *)&message.body.detObj.header,
                                          sizeof(MmwDemo_output_message_header));
                    /* Send TLVs */
                    for (itemIdx = 0; itemIdx < message.body.detObj.header.numTLVs; itemIdx++)
                    {

                        txMsgObjectParams.msgIdentifier = Get_CanMessageIdentifier((MmwDemo_output_message_type)message.body.detObj.tlv[itemIdx].type);

                        Can_Transmit_Schedule(txMsgObjectParams.msgIdentifier,
                                              (uint8_t *)&message.body.detObj.tlv[itemIdx],
                                              sizeof(MmwDemo_output_message_tl));


                        txMsgObjectParams.msgIdentifier = Get_CanMessageIdentifier((MmwDemo_output_message_type)message.body.detObj.tlv[itemIdx].type);

                        Can_Transmit_Schedule(txMsgObjectParams.msgIdentifier,
                                              (uint8_t *)SOC_translateAddress(message.body.detObj.tlv[itemIdx].address, SOC_TranslateAddr_Dir_FROM_OTHER_CPU, NULL),
                                              message.body.detObj.tlv[itemIdx].length);
                        totalPacketLen += sizeof(MmwDemo_output_message_tl) + message.body.detObj.tlv[itemIdx].length;
                    }

                    /* Send padding to make total packet length multiple of MMWDEMO_OUTPUT_MSG_SEGMENT_LEN */
                    numPaddingBytes = MMWDEMO_OUTPUT_MSG_SEGMENT_LEN - (totalPacketLen & (MMWDEMO_OUTPUT_MSG_SEGMENT_LEN - 1));
                    if (numPaddingBytes < MMWDEMO_OUTPUT_MSG_SEGMENT_LEN)
                    {
                        uint8_t padding[MMWDEMO_OUTPUT_MSG_SEGMENT_LEN];
                        /*DEBUG:*/ memset(&padding, 0xf, MMWDEMO_OUTPUT_MSG_SEGMENT_LEN);

                        txMsgObjectParams.msgIdentifier = Get_CanMessageIdentifier((MmwDemo_output_message_type)MMWDEMO_PADDING);

                        Can_Transmit_Schedule(txMsgObjectParams.msgIdentifier,
                                              padding,
                                              numPaddingBytes);
                    }

现在我仅将Can_Transmit_Schedule改为:(MmwDemo_mboxReadTask不变)

int32_t Can_Transmit_Schedule(uint32_t msg_id,
                              uint8_t *txmsg,
                              uint32_t len)
{
    volatile uint32_t index   = 0;
    int32_t           retVal  = 0;
    int32_t           errCode = 0;
    CAN_DCANData      appDcanTxData;

    // System_printf ("MEssage %x  len %d\n", msg_id, len);

    while (len > 8U)
    {
        appDcanTxData.dataLength = 8U;
        memcpy(appDcanTxData.msgData, &txmsg[index], 8U);

        retVal = CAN_transmitData(txMsgObjHandle, &appDcanTxData, &errCode);
        if (retVal < 0)
        {
            continue;
        }
        index = index + 8U;
        len   = len - 8U;
    }

    if (len > 0)
    {
        appDcanTxData.dataLength = len;
        memcpy(appDcanTxData.msgData, &txmsg[index], len);

        retVal = CAN_transmitData(txMsgObjHandle, &appDcanTxData, &errCode);

        while (retVal < 0)
        {
            // System_printf("Debug: Error transmitting CAN data %x , Errcode %x\n", retVal, errCode);
            retVal = CAN_transmitData(txMsgObjHandle, &appDcanTxData, &errCode);
        }
    }

    return retVal;
}

请问我的改动正确吗?应该怎么改动?