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.

[参考译文] TM4C123GH6PGE:CAN 协议、基于 CAN0

Guru**** 2534260 points
Other Parts Discussed in Thread: TM4C123GH6PGE, EK-TM4C123GXL, EK-TM4C1294XL, TM4C123GH6PM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base

器件型号:TM4C123GH6PGE
主题中讨论的其他器件: EK-TM4C123GXLEK-TM4C1294XLTM4C123GH6PM

大家好

我无法通过使用 tm4c123gh6pge 设置的定制板上的 CAN0端口进行通信、但我可以使用完全相同的代码从 CAN1端口轻松进行通信。
同样、在德州开发板(tm4c1294encpdt)上、我无法通过 CAN0端口进行通信、但可以使用 CAN1使用相同的代码进行通信。
我想知道的是、我是否需要应用单独的配置来使用基于德州 MCU 的 CAN0?

谢谢、此致。

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

    您好、Ayhan、

    [引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base "]我无法通过我使用 tm4c123gh6pge 设置的定制板上的 CAN0端口进行通信,但我可以使用完全相同的代码从 CAN1端口轻松地进行通信。

     您能否详细说明 CAN0通信有什么问题? 您在 CAN0_TX 和 CAN0_RX 引脚上看到了什么。

     TM4C123GH6PGE 的 CAN0代码能否在 EK-TM4C123GXL LaunchPad 上运行?

     您能否同时显示我们的 CAN0和 CAN1代码? 有什么区别?

     下面是一个在 CAN0上运行的简单 CAN 示例。 您可以尝试一下、它是否起作用? 请在 LaunchPad 和定制板上运行。 如果它在 LaunchPad 上工作、但不在您的定制板上工作、则您可能需要检查您的定制板连接。

    e2e.ti.com/.../2021.simple_5F00_tx.c

    [引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base ]同样、在德州开发板(tm4c1294encpdt)上、我无法通过 CAN0端口进行通信、但可以使用 CAN1与相同的代码进行通信。

    对于 TM4C129 LaunchPad 开发板、您需要将 JP4和 JP5跳线更改为它们的垂直位置、以使用 CAN0。 否则、它们用于 UART0。  

      

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

    您好 Charles

    使用开发板上的 CAN0端口、当跳线为垂直时、我能够从 PA0-PA1引脚(CAN0)进行通信。 但是、这次我无法使用 UART。 我认为我无法从 CAN0端口发送消息、因为之前禁用了 UART。 在最终版本的代码中、我将 CAN1端口转换为 CAN0 (PA0-PA1)、将 UART0转换为 UART1、现在我将 PB0和 PB1作为 UART 引脚。 但是、当我运行程序时、我可以从 CAN0端口发送消息、但在 UART 上看不到它。 这样做的原因可能是什么?

    在我的定制板上、我确定 CAN0不工作、但我需要一些时间来测量引脚上的输出、因为我当前的所有 MCU 板都已修改为使用 CAN1端口。  要重试、我将修改 CAN0端口的卡、并向您详细说明这种情况。

    感谢您的关注。 此致。

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

    您好!

    [引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3821695 #3821695")但是,当我运行程序时,我可以从 CAN0端口发送消息,但在 UART 上看不到消息。 这样做的原因可能是什么?

    请参阅以下说明。 当处于垂直跳线位置时、它是 UART2、而 UART1则不会成为虚拟 COM 端口。  

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

    您好、Charles、  

    首先、很抱歉耽误您的回答。

    我将 PA6和 PA7配置为 UART2。  

    void
    InitConsole(void)
    {
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
        GPIOPinConfigure(GPIO_PA6_U2RX);
        GPIOPinConfigure(GPIO_PA7_U2TX);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
        UARTClockSourceSet(UART2_BASE, UART_CLOCK_PIOSC);
        GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7);
        //sysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);
        UARTStdioConfig(2, 115200, 16000000);
    }

    但我仍然无法在虚拟 COM 端口上看到任何内容。

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

    您好、Ayhan、

     我真的看不到您修改后的代码有什么问题。 我假设您将 JP4和 JP5更改为 EK-TM4C1294XL LaunchPad 上的垂直位置、对吧? 我假设您正在谈论  EK-TM4C1294XL LaunchPad、对吧? 请注意 、EK-TM4C1294XL LaunchPad 可以选择 UART0 或 UART2作为 COM 端口。  EK-TM4C123GXL 电路板或您自己的定制电路板上并非如此。 对于这些电路板、您将需要 UART2上的外部 FTDI 芯片。 我只是想确保我们在这里讨论的是相同的东西/板。  

     您能否创建一个仅将 UART2用作 COM 端口的小型程序? 在此程序中,只需执行简单的 UARTprintf()即可打印出内容? 向我展示整个代码、以便我查看并运行它。  

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

    您好、Charles、

    是的、我将 JP4和 JP5更改为垂直位置、电路板为 TM4C1294XL LaunchPad、我确信是这样。  (下图是谷歌搜索的、但与我的卡片相同)

    下面的代码是来自德州示例的 hello world。 当 JP4和 JP5处于水平位置时、 我将其上传至电路板并选择 UART0、我可以从 COM 端口看到消息。

    #include <stdint.h>
    #include <stdbool.h>
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/gpio.h"
    #include "drivers/pinout.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/rom.h"
    #include "driverlib/rom_map.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/uart.h"
    #include "utils/uartstdio.h"
    
    uint32_t g_ui32SysClock;
    
    void
    ConfigureUART(void)
    {
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
        GPIOPinConfigure(GPIO_PA0_U0RX);
        GPIOPinConfigure(GPIO_PA1_U0TX);
        GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
        UARTStdioConfig(0, 115200, g_ui32SysClock);
    }
    
    int
    main(void)
    {
        g_ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240), 120000000);
        PinoutSet(false, false);
        GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_1);
        ConfigureUART();
        UARTprintf("Hello, world!\n");
        
        while(1)
        {
            LEDWrite(CLP_D1, 1);
            SysCtlDelay(g_ui32SysClock / 10 / 3);
            LEDWrite(CLP_D1, 0);
            SysCtlDelay(g_ui32SysClock / 10 / 3);
        }
    }
    

    然后、我将 UART0配置 为 UART2。 我将代码上载到卡上、LED 闪烁、因此代码工作正常、但无法看到来自 COM 端口的消息。 我在水平和垂直位置使用 JP4和 JP5进行了试验。 结果不变。

    #include <stdint.h>
    #include <stdbool.h>
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/gpio.h"
    #include "drivers/pinout.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/rom.h"
    #include "driverlib/rom_map.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/uart.h"
    #include "utils/uartstdio.h"
    
    uint32_t g_ui32SysClock;
    
    void
    ConfigureUART(void)
    {
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
        GPIOPinConfigure(GPIO_PA6_U2RX);
        GPIOPinConfigure(GPIO_PA7_U2TX);
        GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7);
        UARTStdioConfig(2, 115200, g_ui32SysClock);
    }
    
    int
    main(void)
    {
        g_ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240), 120000000);
        PinoutSet(false, false);
        GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_1);
        ConfigureUART();
        UARTprintf("Hello, world!\n");
    
        while(1)
        {
            LEDWrite(CLP_D1, 1);
            SysCtlDelay(g_ui32SysClock / 10 / 3);
            LEDWrite(CLP_D1, 0);
            SysCtlDelay(g_ui32SysClock / 10 / 3);
        }
    }
    

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

    您好!

     我认为我发现了您的代码问题。 您应该改用 PD4作为 UR2RX、PD5作为 UR2TX。 请参阅以下代码。 这对我很有影响。 另请参阅 LaunchPad 原理图。

    void
    ConfigureUART(void)
    {
    	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    	SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
    	GPIOPinConfigure(GPIO_PD4_U2RX);
    	GPIOPinConfigure(GPIO_PD5_U2TX);
    	GPIOPinTypeUART(GPIO_PORTD_BASE, GPIO_PIN_4 | GPIO_PIN_5);
    	UARTStdioConfig(2, 115200, g_ui32SysClock);
    }
    

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

    您好、Charles、

    我使用 PD4和 PD5配置了 UART2、现在它正在工作。

    实际上、我根据数据表中的信息选择了 PA6和 PA7、但我没有这样做。

    感谢您提供相关信息。

    顺便说一下、如果您不关闭该主题、我将不胜感激、因为我将很快修改我的定制板、您可以帮助我使用那里的 CAN0端口。

    再次感谢、此致。

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

    您好、Ayhan、

     当然。 您只需回复此主题、它将自动重新打开该主题。  

     请记住、您的定制板将与 LaunchPad 板不同。 LP 将 UART0或 UART2路由到 COM 端口的板载 ICDI 调试探针。 您的定制板将需要使用 FTDI 芯片等某种类型的 USB 转 UART 桥接器来实现 COM 端口功能。  

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

    您好、Charles、

    提醒:我在定制板上使用的是 TM4C123GH6PGE。

    我修改了用于 CAN0通信(PF0和 PF3)的电路板。 同时、该卡设计为能够与其他收发器通信 CAN1 (PA0和 PA1)。
    CAN1通信的以下代码、它可以正常工作:

    // multi_tx.c - Peripheral example demonstrating multiple CAN message transmission.
    
    
    #include <stdint.h>
    #include <stdbool.h>
    #include <math.h>
    
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "inc/hw_can.h"
    #include "inc/hw_ints.h"
    #include "driverlib/can.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "driverlib/uart.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/debug.h"
    #include "utils/uartstdio.c"
    #include "utils/uartstdio.h"
    
    unsigned int sysClock = 16000000;
    volatile uint32_t g_ui32IntCount = 0;
    volatile uint32_t g_ui32Msg1Count = 0;
    volatile uint32_t g_ui32Msg2Count = 0;
    volatile uint32_t g_ui32Msg3Count = 0;
    volatile uint32_t g_ui32Msg4Count = 0;
    volatile uint32_t g_ui32Msg5Count = 0;
    volatile uint32_t g_ui32Msg6Count = 0;
    volatile uint32_t g_ui32Msg7Count = 0;
    volatile uint32_t g_ui32Msg8Count = 0;
    volatile uint32_t g_ui32Msg9Count = 0;
    volatile uint32_t g_ui32Msg10Count = 0;
    volatile uint32_t g_ui32Msg11Count = 0;
    volatile uint32_t g_ui32Msg12Count = 0;
    volatile bool g_bMsgObj6Sent = 0;
    volatile bool g_bErrFlag = 0;
    
    volatile bool g_bRXFlag1 = 0;
    volatile bool g_bRXFlag2 = 0;
    volatile bool g_bRXFlag3 = 0;
    volatile bool g_bRXFlag4 = 0;
    volatile bool g_bRXFlag5 = 0;
    volatile bool g_bRXFlag6 = 0;
    volatile bool g_bRXFlag7 = 0;
    volatile bool g_bRXFlag8 = 0;
    volatile bool g_bRXFlag9 = 0;
    volatile bool g_bRXFlag10 = 0;
    volatile bool g_bRXFlag11 = 0;
    volatile bool g_bRXFlag12 = 0;
    
    tCANMsgObject g_sCANMsgObject1;
    tCANMsgObject g_sCANMsgObject2;
    tCANMsgObject g_sCANMsgObject3;
    tCANMsgObject g_sCANMsgObject4;
    tCANMsgObject g_sCANMsgObject5;
    tCANMsgObject g_sCANMsgObject6;
    
    uint8_t g_pui8Msg1[8] = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    
    
    void
    PrintCANMessageInfoTx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj);
    
    void
    CANIntHandler(void)
    {
        tCANMsgObject sCANMessage;
        uint8_t pui8MsgData[8];
    
        uint32_t ui32Status;
        ui32Status = CANIntStatus(CAN1_BASE, CAN_INT_STS_CAUSE);
        if(ui32Status == CAN_INT_INTID_STATUS)
        {
    
            ui32Status = CANStatusGet(CAN1_BASE, CAN_STS_CONTROL);
            g_bErrFlag = 1;
            UARTprintf("TRANSMIT STATUS: %x\n", ui32Status);
        }
    
        else if(ui32Status == 1)
        {
            CANIntClear(CAN1_BASE, 1);
            g_ui32Msg1Count++;
            g_bRXFlag1 = 1;
            g_bErrFlag = 0;
    
        }
        else if(ui32Status == 2)
        {
            CANIntClear(CAN1_BASE, 2);
            g_ui32Msg2Count++;
            g_bRXFlag2 = 1;
            g_bErrFlag = 0;
        }
    
        else if(ui32Status == 3)
        {
    
            CANIntClear(CAN1_BASE, 3);
            g_ui32Msg3Count++;
            g_bRXFlag3 = 1;
            g_bErrFlag = 0;
        }
    
        else if(ui32Status == 4)
            {
    
                CANIntClear(CAN1_BASE, 4);
                g_ui32Msg4Count++;
                g_bRXFlag4 = 1;
                g_bErrFlag = 0;
            }
    
        else if(ui32Status == 5)
                {
    
                    CANIntClear(CAN1_BASE, 5);
                    g_ui32Msg5Count++;
                    g_bRXFlag5 = 1;
                    g_bErrFlag = 0;
                }
    
        else if(ui32Status == 6)
                {
    
                    CANIntClear(CAN1_BASE, 6);
                    g_ui32Msg6Count++;
                    g_bRXFlag6 = 1;
                    g_bMsgObj6Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 7)
                {
    
                    CANIntClear(CAN1_BASE, 7);
                    g_ui32Msg7Count++;
                    g_bRXFlag7 = 1;
                    //g_bMsgObj7Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 8)
                {
    
                    CANIntClear(CAN1_BASE, 8);
                    g_ui32Msg8Count++;
                    g_bRXFlag8 = 1;
                    //g_bMsgObj8Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 9)
                {
    
                    CANIntClear(CAN1_BASE, 9);
                    g_ui32Msg9Count++;
                    g_bRXFlag9 = 1;
                    //g_bMsgObj9Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 10)
                {
    
                    CANIntClear(CAN1_BASE, 10);
                    g_ui32Msg10Count++;
                    g_bRXFlag10 = 1;
                    //g_bMsgObj10Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 11)
                {
    
                    CANIntClear(CAN1_BASE, 11);
                    g_ui32Msg11Count++;
                    g_bRXFlag11 = 1;
                    //g_bMsgObj11Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 12)
                {
    
                    CANIntClear(CAN1_BASE, 12);
                    g_ui32Msg12Count++;
                    g_bRXFlag12 = 1;
                    //g_bMsgObj12Sent = 1;
                    g_bErrFlag = 0;
                }
    
        else
        {
    
        }
    }
    
    
    
    
    void
    InitConsole(void)
    {
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
        GPIOPinConfigure(GPIO_PB0_U1RX);
        GPIOPinConfigure(GPIO_PB1_U1TX);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
        UARTClockSourceSet(UART1_BASE, UART_CLOCK_PIOSC);
        GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
        //sysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);
        UARTStdioConfig(1, 115200, 16000000);
    }
    
    void
    PrintCANMessageInfoTx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj)
    {
        unsigned int uIdx;
    
        UARTprintf("Sending msg: obj=%d ID=0x%04X msg=0x", ui32MsgObj,
                   psCANMsg->ui32MsgID);
        for(uIdx = 0; uIdx < psCANMsg->ui32MsgLen; uIdx++)
        {
            UARTprintf("%02X ", psCANMsg->pui8MsgData[uIdx]);
        }
        UARTprintf("\n");
    }
    
    void
    PrintCANMessageInfoRx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj)
    {
        unsigned int uIdx;
    
        if(psCANMsg->ui32Flags & MSG_OBJ_DATA_LOST)
        {
            //UARTprintf("CAN message loss detected on message object %d\n",
              //         ui32MsgObj);
        }
    
        UARTprintf("Msg Obj=%u ID=0x%05X len=%u data=0x", ui32MsgObj,
                   psCANMsg->ui32MsgID, psCANMsg->ui32MsgLen);
        for(uIdx = 0; uIdx < psCANMsg->ui32MsgLen; uIdx++)
        {
            UARTprintf("%02X ", psCANMsg->pui8MsgData[uIdx]);
        }
        UARTprintf("\n");
    }
    
    
    
    int
    main(void)
    {
    
        //sysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);
        tCANMsgObject sCANMessage;
        uint8_t pui8MsgData[8];
        InitConsole();
        volatile uint32_t ui32Loop;
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
        GPIOPinConfigure(GPIO_PA0_CAN1RX);
        GPIOPinConfigure(GPIO_PA1_CAN1TX);
        GPIOPinTypeCAN(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN1);
        CANInit(CAN1_BASE);
        CANBitRateSet(CAN1_BASE, 16000000, 500000);
        CANIntRegister(CAN1_BASE, CANIntHandler); // if using dynamic vectors
        CANIntEnable(CAN1_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
        IntEnable(INT_CAN1);
        CANEnable(CAN1_BASE);
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
        GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_4);
    
    //----------------to transmit-----------------------------------
        g_sCANMsgObject1.ui32MsgID = 0x1006;
        g_sCANMsgObject1.ui32MsgIDMask = 0;
        g_sCANMsgObject1.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
        g_sCANMsgObject1.ui32MsgLen = sizeof(g_pui8Msg1);
        g_sCANMsgObject1.pui8MsgData = g_pui8Msg1;
    
    
    
    //------------------to receive-------------------------------------------
        sCANMessage.ui32MsgID = 0x1002;
        sCANMessage.ui32MsgIDMask = 0xfffff;
        sCANMessage.ui32Flags = (MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER |
                                 MSG_OBJ_EXTENDED_ID);
        sCANMessage.ui32MsgLen = 8;
    
        CANMessageSet(CAN1_BASE, 1, &sCANMessage, MSG_OBJ_TYPE_RX);
    
        for(;;)
        {
            
            SysCtlDelay(200000);
            PrintCANMessageInfoTx(&g_sCANMsgObject1, 7);
            CANMessageSet(CAN1_BASE, 7, &g_sCANMsgObject1, MSG_OBJ_TYPE_TX);
    
            
    
            if(g_bRXFlag1)
                    {
    
                        sCANMessage.pui8MsgData = pui8MsgData;
                        CANMessageGet(CAN1_BASE, 1, &sCANMessage, 0);
                        g_bRXFlag1 = 0;
                        PrintCANMessageInfoRx(&sCANMessage, 1);
                    }
           
            if(g_bErrFlag)
            {
                UARTprintf(" error - cable connected?\n");
    
            }
            else
            {
                //UARTprintf(" total count = %u\n",
                //           g_ui32Msg1Count);
            }
    
    
        }
    
        return(0);
    }
    

    下图 是 CAN1的 CANH 和 CANL 引脚的作用域:

    这是从 PCAN 视图接收到的消息:

    在此过程之后、我对 CAN0端口(PF0和 PF3)尝试了相同的过程:

    // multi_tx.c - Peripheral example demonstrating multiple CAN message transmission.
    
    
    #include <stdint.h>
    #include <stdbool.h>
    #include <math.h>
    
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "inc/hw_can.h"
    #include "inc/hw_ints.h"
    #include "driverlib/can.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "driverlib/uart.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/debug.h"
    #include "utils/uartstdio.c"
    #include "utils/uartstdio.h"
    
    unsigned int sysClock = 16000000;
    volatile uint32_t g_ui32IntCount = 0;
    volatile uint32_t g_ui32Msg1Count = 0;
    volatile uint32_t g_ui32Msg2Count = 0;
    volatile uint32_t g_ui32Msg3Count = 0;
    volatile uint32_t g_ui32Msg4Count = 0;
    volatile uint32_t g_ui32Msg5Count = 0;
    volatile uint32_t g_ui32Msg6Count = 0;
    volatile uint32_t g_ui32Msg7Count = 0;
    volatile uint32_t g_ui32Msg8Count = 0;
    volatile uint32_t g_ui32Msg9Count = 0;
    volatile uint32_t g_ui32Msg10Count = 0;
    volatile uint32_t g_ui32Msg11Count = 0;
    volatile uint32_t g_ui32Msg12Count = 0;
    volatile bool g_bMsgObj6Sent = 0;
    volatile bool g_bErrFlag = 0;
    
    volatile bool g_bRXFlag1 = 0;
    volatile bool g_bRXFlag2 = 0;
    volatile bool g_bRXFlag3 = 0;
    volatile bool g_bRXFlag4 = 0;
    volatile bool g_bRXFlag5 = 0;
    volatile bool g_bRXFlag6 = 0;
    volatile bool g_bRXFlag7 = 0;
    volatile bool g_bRXFlag8 = 0;
    volatile bool g_bRXFlag9 = 0;
    volatile bool g_bRXFlag10 = 0;
    volatile bool g_bRXFlag11 = 0;
    volatile bool g_bRXFlag12 = 0;
    
    tCANMsgObject g_sCANMsgObject1;
    tCANMsgObject g_sCANMsgObject2;
    tCANMsgObject g_sCANMsgObject3;
    tCANMsgObject g_sCANMsgObject4;
    tCANMsgObject g_sCANMsgObject5;
    tCANMsgObject g_sCANMsgObject6;
    
    uint8_t g_pui8Msg1[8] = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    
    
    void
    PrintCANMessageInfoTx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj);
    
    void
    CANIntHandler(void)
    {
        tCANMsgObject sCANMessage;
        uint8_t pui8MsgData[8];
    
        uint32_t ui32Status;
        ui32Status = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE);
        if(ui32Status == CAN_INT_INTID_STATUS)
        {
    
            ui32Status = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL);
            g_bErrFlag = 1;
            UARTprintf("TRANSMIT STATUS: %x\n", ui32Status);
        }
    
        else if(ui32Status == 1)
        {
            CANIntClear(CAN0_BASE, 1);
            g_ui32Msg1Count++;
            g_bRXFlag1 = 1;
            g_bErrFlag = 0;
    
        }
        else if(ui32Status == 2)
        {
            CANIntClear(CAN0_BASE, 2);
            g_ui32Msg2Count++;
            g_bRXFlag2 = 1;
            g_bErrFlag = 0;
        }
    
        else if(ui32Status == 3)
        {
    
            CANIntClear(CAN0_BASE, 3);
            g_ui32Msg3Count++;
            g_bRXFlag3 = 1;
            g_bErrFlag = 0;
        }
    
        else if(ui32Status == 4)
            {
    
                CANIntClear(CAN0_BASE, 4);
                g_ui32Msg4Count++;
                g_bRXFlag4 = 1;
                g_bErrFlag = 0;
            }
    
        else if(ui32Status == 5)
                {
    
                    CANIntClear(CAN0_BASE, 5);
                    g_ui32Msg5Count++;
                    g_bRXFlag5 = 1;
                    g_bErrFlag = 0;
                }
    
        else if(ui32Status == 6)
                {
    
                    CANIntClear(CAN0_BASE, 6);
                    g_ui32Msg6Count++;
                    g_bRXFlag6 = 1;
                    g_bMsgObj6Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 7)
                {
    
                    CANIntClear(CAN0_BASE, 7);
                    g_ui32Msg7Count++;
                    g_bRXFlag7 = 1;
                    //g_bMsgObj7Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 8)
                {
    
                    CANIntClear(CAN0_BASE, 8);
                    g_ui32Msg8Count++;
                    g_bRXFlag8 = 1;
                    //g_bMsgObj8Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 9)
                {
    
                    CANIntClear(CAN0_BASE, 9);
                    g_ui32Msg9Count++;
                    g_bRXFlag9 = 1;
                    //g_bMsgObj9Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 10)
                {
    
                    CANIntClear(CAN0_BASE, 10);
                    g_ui32Msg10Count++;
                    g_bRXFlag10 = 1;
                    //g_bMsgObj10Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 11)
                {
    
                    CANIntClear(CAN0_BASE, 11);
                    g_ui32Msg11Count++;
                    g_bRXFlag11 = 1;
                    //g_bMsgObj11Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 12)
                {
    
                    CANIntClear(CAN0_BASE, 12);
                    g_ui32Msg12Count++;
                    g_bRXFlag12 = 1;
                    //g_bMsgObj12Sent = 1;
                    g_bErrFlag = 0;
                }
    
        else
        {
    
        }
    }
    
    
    
    
    void
    InitConsole(void)
    {
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
        GPIOPinConfigure(GPIO_PB0_U1RX);
        GPIOPinConfigure(GPIO_PB1_U1TX);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
        UARTClockSourceSet(UART1_BASE, UART_CLOCK_PIOSC);
        GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
        //sysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);
        UARTStdioConfig(1, 115200, 16000000);
    }
    
    void
    PrintCANMessageInfoTx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj)
    {
        unsigned int uIdx;
    
        UARTprintf("Sending msg: obj=%d ID=0x%04X msg=0x", ui32MsgObj,
                   psCANMsg->ui32MsgID);
        for(uIdx = 0; uIdx < psCANMsg->ui32MsgLen; uIdx++)
        {
            UARTprintf("%02X ", psCANMsg->pui8MsgData[uIdx]);
        }
        UARTprintf("\n");
    }
    
    void
    PrintCANMessageInfoRx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj)
    {
        unsigned int uIdx;
    
        if(psCANMsg->ui32Flags & MSG_OBJ_DATA_LOST)
        {
            //UARTprintf("CAN message loss detected on message object %d\n",
              //         ui32MsgObj);
        }
    
        UARTprintf("Msg Obj=%u ID=0x%05X len=%u data=0x", ui32MsgObj,
                   psCANMsg->ui32MsgID, psCANMsg->ui32MsgLen);
        for(uIdx = 0; uIdx < psCANMsg->ui32MsgLen; uIdx++)
        {
            UARTprintf("%02X ", psCANMsg->pui8MsgData[uIdx]);
        }
        UARTprintf("\n");
    }
    
    
    
    int
    main(void)
    {
    
        //sysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);
        tCANMsgObject sCANMessage;
        uint8_t pui8MsgData[8];
        InitConsole();
        volatile uint32_t ui32Loop;
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
        GPIOPinConfigure(GPIO_PF0_CAN0RX);
        GPIOPinConfigure(GPIO_PF3_CAN0TX);
        GPIOPinTypeCAN(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_3);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);
        CANInit(CAN0_BASE);
        CANBitRateSet(CAN0_BASE, 16000000, 500000);
        CANIntRegister(CAN0_BASE, CANIntHandler); // if using dynamic vectors
        CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
        IntEnable(INT_CAN0);
        CANEnable(CAN0_BASE);
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
        GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_4);
    
    //----------------to transmit-----------------------------------
        g_sCANMsgObject1.ui32MsgID = 0x1006;
        g_sCANMsgObject1.ui32MsgIDMask = 0;
        g_sCANMsgObject1.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
        g_sCANMsgObject1.ui32MsgLen = sizeof(g_pui8Msg1);
        g_sCANMsgObject1.pui8MsgData = g_pui8Msg1;
    
    
    //------------------to receive-------------------------------------------
        sCANMessage.ui32MsgID = 0x1002;
        sCANMessage.ui32MsgIDMask = 0xfffff;
        sCANMessage.ui32Flags = (MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER |
                                 MSG_OBJ_EXTENDED_ID);
        sCANMessage.ui32MsgLen = 8;
    
        CANMessageSet(CAN0_BASE, 1, &sCANMessage, MSG_OBJ_TYPE_RX);
    
        for(;;)
        {
            //uint32_t ui32Status = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL);
            //UARTprintf("TRANSMIT STATUS: %x\n", ui32Status);
            SysCtlDelay(200000);
            //UARTprintf(" error - cable connected?\n");
            PrintCANMessageInfoTx(&g_sCANMsgObject1, 7);
            CANMessageSet(CAN0_BASE, 7, &g_sCANMsgObject1, MSG_OBJ_TYPE_TX);
    
            if(g_bRXFlag1)
                    {
    
                        sCANMessage.pui8MsgData = pui8MsgData;
                        CANMessageGet(CAN0_BASE, 1, &sCANMessage, 0);
                        g_bRXFlag1 = 0;
                        PrintCANMessageInfoRx(&sCANMessage, 1);
                    }
            
            if(g_bErrFlag)
            {
                UARTprintf(" error - cable connected?\n");
    
            }
            else
            {
                //UARTprintf(" total count = %u\n",
                //           g_ui32Msg1Count);
            }
    
    
        }
    
        return(0);
    }
    

    下图 是  CAN0的 CANH 和 CANL 引脚的作用域:

    这是 PCAN 视图:  

    您可以看到、使用相同代码时、CAN1端口上没有问题。 我确信收发器没有损坏、因为我用了很多不同的卡来尝试它、结果是一样的。

    您对这种情况的发生原因有什么看法吗?

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

    您好!

     很抱歉,我在度假。 下星期一我将进行介绍。 同时、我建议您在寄存器窗口中捕获所有 CAN1寄存器设置并与 CAN0进行比较。 您是否看到任何差异?

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

    您好、Charles、


    正如您所说、我捕获了 CAN0和 CAN1的所有寄存器设置。  

    当端口在代码中设置为 CAN0 (PF0-PF3)时、捕获到 CAN0的图片。

      


    CAN0端口似乎存在问题。


    另外、当我尝试查看 CAN0寄存器设置时、我也遇到了错误。

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

    您好!

     我看到您启用了 CAN0。 如果不启用 CAN0、您将看到显示的大量错误。 您能否将  while (!SysCtlPeripheralReady (SYSCTL_Periph_CAN0))添加 到代码中? 有什么不同吗? 您是否也可以单步进入 CANInit()函数?

    SysCtlPeripheralEnable (SYSCTL_Periph_CAN0);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_CAN0))//添加此行

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

    您还可以尝试两次实验吗?

     -在您的定制板上运行 TivaWare 示例 simple_tx.c 或 simple_rx.c。 你看到什么?

     -在 LaunchPad 板上运行您自己的软件? 你看到什么?

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

    您好!

    我将这一行添加到我的代码中  

    while (!SysCtlPeripheralReady (SYSCTL_Periph_CAN0))//添加此行

    现在、我可以看到 CAN0寄存器设置的值。 但仍然没有发送或接收到 CAN 消息。

    (在我注释该行后、寄存器仍然可见、因此我认为在之前尝试捕获 CAN0寄存器设置时出错。)

    [引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3845996 #3845996"] -在定制板上运行 TivaWare 示例 simple_tx.c 或 simple_rx.c。 您看到了什么?[/报价]

    我已经通过结合 TivaWare 示例中的 multi_TX 和 multi_Rx 来制作此代码。 正如我说过的、它在 CAN1上运行时没有任何问题。

    // multi_tx.c - Peripheral example demonstrating multiple CAN message transmission.
    
    
    #include <stdint.h>
    #include <stdbool.h>
    #include <math.h>
    
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "inc/hw_can.h"
    #include "inc/hw_ints.h"
    #include "driverlib/can.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "driverlib/uart.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/debug.h"
    #include "utils/uartstdio.c"
    #include "utils/uartstdio.h"
    
    unsigned int sysClock = 16000000;
    volatile uint32_t g_ui32IntCount = 0;
    volatile uint32_t g_ui32Msg1Count = 0;
    volatile uint32_t g_ui32Msg2Count = 0;
    volatile uint32_t g_ui32Msg3Count = 0;
    volatile uint32_t g_ui32Msg4Count = 0;
    volatile uint32_t g_ui32Msg5Count = 0;
    volatile uint32_t g_ui32Msg6Count = 0;
    volatile uint32_t g_ui32Msg7Count = 0;
    volatile uint32_t g_ui32Msg8Count = 0;
    volatile uint32_t g_ui32Msg9Count = 0;
    volatile uint32_t g_ui32Msg10Count = 0;
    volatile uint32_t g_ui32Msg11Count = 0;
    volatile uint32_t g_ui32Msg12Count = 0;
    volatile bool g_bMsgObj6Sent = 0;
    volatile bool g_bErrFlag = 0;
    
    volatile bool g_bRXFlag1 = 0;
    volatile bool g_bRXFlag2 = 0;
    volatile bool g_bRXFlag3 = 0;
    volatile bool g_bRXFlag4 = 0;
    volatile bool g_bRXFlag5 = 0;
    volatile bool g_bRXFlag6 = 0;
    volatile bool g_bRXFlag7 = 0;
    volatile bool g_bRXFlag8 = 0;
    volatile bool g_bRXFlag9 = 0;
    volatile bool g_bRXFlag10 = 0;
    volatile bool g_bRXFlag11 = 0;
    volatile bool g_bRXFlag12 = 0;
    
    tCANMsgObject g_sCANMsgObject1;
    tCANMsgObject g_sCANMsgObject2;
    tCANMsgObject g_sCANMsgObject3;
    tCANMsgObject g_sCANMsgObject4;
    tCANMsgObject g_sCANMsgObject5;
    tCANMsgObject g_sCANMsgObject6;
    /*
    uint8_t g_pui8Msg1[8] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
    uint8_t g_pui8Msg2[8] = { 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01 };
    uint8_t g_pui8Msg3[8] = { 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23 };
    uint8_t g_pui8Msg4[8] = { 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45 };
    uint8_t g_pui8Msg5[8] = { 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67 };
    uint8_t g_pui8Msg6[8] = { 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89 };
    
    
    */
    uint8_t g_pui8Msg1[8] = { 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    uint8_t g_pui8Msg2[8] = { 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77 };
    uint8_t g_pui8Msg3[8] = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 };
    uint8_t g_pui8Msg4[8] = { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33 };
    uint8_t g_pui8Msg5[8] = { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 };
    uint8_t g_pui8Msg6[8] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
    /*
    uint8_t g_pui8Msg1[8] = { 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB };
    uint8_t g_pui8Msg2[8] = { 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC };
    uint8_t g_pui8Msg3[8] = { 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD };
    uint8_t g_pui8Msg4[8] = { 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE };
    uint8_t g_pui8Msg5[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
    */
    
    void
    PrintCANMessageInfoTx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj);
    
    void
    CANIntHandler(void)
    {
        tCANMsgObject sCANMessage;
        uint8_t pui8MsgData[8];
    
        uint32_t ui32Status;
        ui32Status = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE);
        if(ui32Status == CAN_INT_INTID_STATUS)
        {
    
            ui32Status = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL);
            g_bErrFlag = 1;
            UARTprintf("TRANSMIT STATUS: %x\n", ui32Status);
        }
    
        else if(ui32Status == 1)
        {
            CANIntClear(CAN0_BASE, 1);
            g_ui32Msg1Count++;
            g_bRXFlag1 = 1;
            g_bErrFlag = 0;
    
        }
        else if(ui32Status == 2)
        {
            CANIntClear(CAN0_BASE, 2);
            g_ui32Msg2Count++;
            g_bRXFlag2 = 1;
            g_bErrFlag = 0;
        }
    
        else if(ui32Status == 3)
        {
    
            CANIntClear(CAN0_BASE, 3);
            g_ui32Msg3Count++;
            g_bRXFlag3 = 1;
            g_bErrFlag = 0;
        }
    
        else if(ui32Status == 4)
            {
    
                CANIntClear(CAN0_BASE, 4);
                g_ui32Msg4Count++;
                g_bRXFlag4 = 1;
                g_bErrFlag = 0;
            }
    
        else if(ui32Status == 5)
                {
    
                    CANIntClear(CAN0_BASE, 5);
                    g_ui32Msg5Count++;
                    g_bRXFlag5 = 1;
                    g_bErrFlag = 0;
                }
    
        else if(ui32Status == 6)
                {
    
                    CANIntClear(CAN0_BASE, 6);
                    g_ui32Msg6Count++;
                    g_bRXFlag6 = 1;
                    g_bMsgObj6Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 7)
                {
    
                    CANIntClear(CAN0_BASE, 7);
                    g_ui32Msg7Count++;
                    g_bRXFlag7 = 1;
                    //g_bMsgObj7Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 8)
                {
    
                    CANIntClear(CAN0_BASE, 8);
                    g_ui32Msg8Count++;
                    g_bRXFlag8 = 1;
                    //g_bMsgObj8Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 9)
                {
    
                    CANIntClear(CAN0_BASE, 9);
                    g_ui32Msg9Count++;
                    g_bRXFlag9 = 1;
                    //g_bMsgObj9Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 10)
                {
    
                    CANIntClear(CAN0_BASE, 10);
                    g_ui32Msg10Count++;
                    g_bRXFlag10 = 1;
                    //g_bMsgObj10Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 11)
                {
    
                    CANIntClear(CAN0_BASE, 11);
                    g_ui32Msg11Count++;
                    g_bRXFlag11 = 1;
                    //g_bMsgObj11Sent = 1;
                    g_bErrFlag = 0;
                }
        else if(ui32Status == 12)
                {
    
                    CANIntClear(CAN0_BASE, 12);
                    g_ui32Msg12Count++;
                    g_bRXFlag12 = 1;
                    //g_bMsgObj12Sent = 1;
                    g_bErrFlag = 0;
                }
    
        else
        {
    
        }
    }
    
    
    
    
    void
    InitConsole(void)
    {
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
        GPIOPinConfigure(GPIO_PB0_U1RX);
        GPIOPinConfigure(GPIO_PB1_U1TX);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
        UARTClockSourceSet(UART1_BASE, UART_CLOCK_PIOSC);
        GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
        //sysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);
        UARTStdioConfig(1, 115200, 16000000);
    }
    
    void
    PrintCANMessageInfoTx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj)
    {
        unsigned int uIdx;
    
        UARTprintf("Sending msg: obj=%d ID=0x%04X msg=0x", ui32MsgObj,
                   psCANMsg->ui32MsgID);
        for(uIdx = 0; uIdx < psCANMsg->ui32MsgLen; uIdx++)
        {
            UARTprintf("%02X ", psCANMsg->pui8MsgData[uIdx]);
        }
        UARTprintf("\n");
    }
    
    void
    PrintCANMessageInfoRx(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj)
    {
        unsigned int uIdx;
    
        if(psCANMsg->ui32Flags & MSG_OBJ_DATA_LOST)
        {
            //UARTprintf("CAN message loss detected on message object %d\n",
              //         ui32MsgObj);
        }
    
        UARTprintf("Msg Obj=%u ID=0x%05X len=%u data=0x", ui32MsgObj,
                   psCANMsg->ui32MsgID, psCANMsg->ui32MsgLen);
        for(uIdx = 0; uIdx < psCANMsg->ui32MsgLen; uIdx++)
        {
            UARTprintf("%02X ", psCANMsg->pui8MsgData[uIdx]);
        }
        UARTprintf("\n");
    }
    
    
    
    int
    main(void)
    {
    
        //sysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);
        tCANMsgObject sCANMessage;
        uint8_t pui8MsgData[8];
        InitConsole();
        volatile uint32_t ui32Loop;
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
        GPIOPinConfigure(GPIO_PF0_CAN0RX);
        GPIOPinConfigure(GPIO_PF3_CAN0TX);
        GPIOPinTypeCAN(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_3);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);
    
        while(!SysCtlPeripheralReady(SYSCTL_PERIPH_CAN0)) // Add this line
        {
        }
    
        CANInit(CAN0_BASE);
        CANBitRateSet(CAN0_BASE, 16000000, 500000);
        CANIntRegister(CAN0_BASE, CANIntHandler); // if using dynamic vectors
        CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
        IntEnable(INT_CAN0);
        CANEnable(CAN0_BASE);
    
    ;
    
    //----------------to transmit-----------------------------------
        g_sCANMsgObject1.ui32MsgID = 0x1006;
        g_sCANMsgObject1.ui32MsgIDMask = 0;
        g_sCANMsgObject1.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
        g_sCANMsgObject1.ui32MsgLen = sizeof(g_pui8Msg1);
        g_sCANMsgObject1.pui8MsgData = g_pui8Msg1;
    
    
    //------------------to receive-------------------------------------------
        sCANMessage.ui32MsgID = 0x1002;
        sCANMessage.ui32MsgIDMask = 0xfffff;
        sCANMessage.ui32Flags = (MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER |
                                 MSG_OBJ_EXTENDED_ID);
        sCANMessage.ui32MsgLen = 8;
    
        CANMessageSet(CAN0_BASE, 1, &sCANMessage, MSG_OBJ_TYPE_RX);
    
    
    
    
        for(;;)
        {
    
            SysCtlDelay(200000);
            PrintCANMessageInfoTx(&g_sCANMsgObject1, 7);
            CANMessageSet(CAN0_BASE, 7, &g_sCANMsgObject1, MSG_OBJ_TYPE_TX);
    
    
    
    
            if(g_bRXFlag1)
                    {
    
                        sCANMessage.pui8MsgData = pui8MsgData;
                        CANMessageGet(CAN0_BASE, 1, &sCANMessage, 0);
                        g_bRXFlag1 = 0;
                        PrintCANMessageInfoRx(&sCANMessage, 1);
                    }
    
    
    
    
    
            if(g_bErrFlag)
            {
                UARTprintf(" error - cable connected?\n");
    
            }
            else
            {
                //UARTprintf(" total count = %u\n",
                //           g_ui32Msg1Count);
            }
    
    
        }
    
        return(0);
    }
    

    这是 CANInit()函数的单步执行:

    [引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3845996 #3845996"] -在 LaunchPad 板上运行您自己的软件? 您看到了什么?[/报价]

    我上面提到的代码在 LaunchPad 板上运行良好。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3846165 #3846165)]我已经通过结合 TivaWare 示例中的 multi_TX 和 multi_Rx 来生成此代码。 就像我说的那样、它在 CAN1上运行时没有任何问题。[/QUERP]

    请告诉我您是否在定制板的 CAN0上运行示例。 我了解它适用于您的定制板的 CAN1。  

    [引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3846165 #3846165"]我上面提到的代码在 LaunchPad 板上运行良好。

    如果您在 LaunchPad 上为 CAN0编码、则代码正常。 如果 TivaWare 示例未在定制板的 CAN0上运行、则说明您的板可能有问题。 您是否有其他板可供尝试? 您能否在所有定制板上重现问题?

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

    您好!

    [引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3846174 #3846174">如果您在定制板的 CAN0上运行示例,请告诉我。 我了解它适用于您的定制板的 CAN1。  [/报价]

    我在自定义电路板上的 TIVAware 示例中尝试了 simple_tx、但它不能与 CAN0配合使用。

    [引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3846174 #3846174">如果您的 CAN0代码在 LaunchPad 上运行正常、则代码正常。 如果 TivaWare 示例未在定制板的 CAN0上运行、则说明您的板可能有问题。 您是否有其他板可供尝试? 您能否在所有定制板上重现问题?

    是的、我甚至在几乎4-5个不同的定制板上尝试过它。 这是我的定制板的 CAN 收发器的原理图。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3846278 #3846278"]

    我在自定义电路板上的 TIVAware 示例中尝试了 simple_tx、但它不能与 CAN0配合使用。

    [/报价]

    您能否在 simple_tx.c 示例中探测 CAN0TX 引脚? 您是否看到 PF3令人难以置信?

    此外、您在阅读原理图时、将 CAN0TX 直接驱动到收发器。 MCU 是一款3.3V 器件。 您应该在驱动5V 收发器之前先经过电平转换器。  

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

    您好、Charles、

    我在运行 simple_tx.c 时使用示波器测量了 PF3

    在我运行代码之前、它是恒定的2.7V、在我运行代码之后、它是恒定的3.3V。

    没有摆动或任何东西。 信号在连接或未连接到接收器时不会改变。

    [引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3846299 #3846299"]此外、您还可以阅读原理图、直接将 CAN0TX 驱动到收发器。 MCU 是一款3.3V 器件。 您应该在驱动5V 收发器之前先经过电平转换器。  [/报价]

    是的、您是对的、但这是两个收发器中的一个、另一个收发器在使用相同的连接时工作正常。

    此外、如果存在任何连接错误的路径、我还检查了 PCB 布局、但没有。

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

    [引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3847315 #3847315"]

    我在运行 simple_tx.c 时使用示波器测量了 PF3

    在我运行代码之前、它是恒定的2.7V、在我运行代码之后、它是恒定的3.3V。

    没有摆动或任何东西。 信号在连接或未连接到接收器时不会改变。

    [/报价]

    simple_TX 示例对 CAN0RX 和 CAN0TX 使用 PB4和 PB5引脚? 您是否更改了 PF0和 PF3的代码以在定制板上运行? 如果您没有更改为 PF0和 PF3、则它显然无法在您的定制板上工作。 请确认。

    假设您按原样运行 simple_tx 示例、您是否看到 PB5引脚上的 CAN0TX 如何变化?

    您能否向我发送使用 PF0和 PF3引脚的整个 CAN0 CCS 项目?

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

    您好!

    是的、我根据我的定制电路板设计配置了代码。

    这是项目的 wetransfer 下载链接:

    https://we.tl/t-0U4tzCi5dJ

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

    请将项目 zip 文件直接附加到此线程。 我的公司阻止访问任何外部共享站点。 您只需在编写时将 zip 文件拖动到编辑窗口中。  

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

    当然、

    e2e.ti.com/.../can0example.rar

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

    PF0/PF3无法在 LaunchPad 板上工作的原因是 P0和 PF3用于开关和 LED。 您能否查看原理图、了解 PF0和 PF3是如何连接的? 我尝试使用 PB4 (CAN0RX)和 PB5 (CAN0TX)运行 CAN0、但没有发现任何问题。 您可以尝试 PB4和 PB5吗? 您看到了什么差异吗?  

     

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

    您好!

    实际上、我在我的定制板上使用此代码、PF0和 PF3直接连接到收发器 RX 和 TX 引脚。

    该代码在 LaunchPad 上运行时没有任何问题。

    此外、该代码还适用于我的定制板(PA0&PA1)上的 CAN1。 但是、只要我将端口更改为定制板上的 CAN0 (PF0&PF3)、它就不起作用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3850712 #3850712"]在 Launchpad 上,此代码可以正常工作,不会出现任何问题

    您好!

     我将再次尝试在 LaunchPad 上运行。 但是、如果您已在 Launchpad 上运行它、并且它可以正常工作、则代码是可以的。 问题必须与电路板相关。 您能不能做我建议的、就是为 CAN0尝试 PB4/PB5或 PE4/PE5? 我知道这需要对您的电路板进行一些更改。 但我真的不知道还有什么建议、因为我们知道:

     您的代码在 LaunchPad 上运行。 这意味着代码良好。 如果代码在定制电路板上无法正常工作、则会导致电路板出现问题。  

     2. TivaWare simple_TX 在您的定制板上不起作用。 这再次导致电路板问题。  

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

    您好、Charles、

    好的、我将修改电路板以尝试您的建议、我将告诉您结果是什么。

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

    您好、再说一次、

    我根据 Charles 的建议修改了电路板、我尝试了与 PB4/PB5和 PE4/PE5的通信、这两种通信都不像 PF0/PF3那样正常工作。
    如果电路板上存在问题、我通过电缆将引脚直接焊接到 CAN 收发器 TX-RX 引脚上。 这没有改变结果、CAN0仍然不工作。

    这很奇怪、因为 CAN1工作正常。

    是否需要进行特定设置才能在这些模型 MCU 中使用 CAN0?
    这个问题对我来说非常重要、因为在我们的项目中、需要双 CAN 端口、但我只能使用一个。

    谢谢

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

    您好!

    [引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3899918 #3899918"]根据 Charles 的建议,我尝试了与 PB4/PB5和 PE4/PE5的通信,但二者都不像 PF0/PF3那样正常工作。[/quote

    您可以说、其中既是 CANTX 的 PB5又是 PE5、只是平坦线死了。 是这样吗? 您能否显示 PB5和 PE5的 CANTX 引脚的逻辑分析仪或示波器捕获? 下面是我捕获的内容。 我尝试了 PB5 (TX)/PB4 (RX)以及 PE5 (TX)/PE4 (RX)、在这两种情况下、我可以看到至少 TX 在我的 LaunchPad 上切换、而不仅仅是平面。 请注意、我运行 simple_tx 时经过修改、使用 PB5/PB4和 PE5/PE4来生成以下捕捉。

    根据 我们先前的讨论、如果以下两个案例为真、请再次确认。  

     您的代码在 LaunchPad 上运行。 这意味着您的代码良好。 如果  您的代码在定制电路板上无法正常工作、则会导致电路板出现问题。  

     2. TivaWare simple_TX 在您的定制板上不起作用。 这再次导致电路板问题。  

     我有用于 PB5和 PE5的 simple_tx。 请参阅以下附件。 为什么不先在 Launchpad 上尝试、然后再在定制板上尝试。 如果它仍然可以在您的 LaunchPad 上工作、但不能在您的定制板上工作、那么我真的不知道还有什么建议。 与您的定制板相比、在 LaunchPad 上运行时、在 TX 引脚上显示逻辑分析仪或示波器捕获。  

    e2e.ti.com/.../simple_5F00_tx_5F00_can0_5F00_pb5.ce2e.ti.com/.../simple_5F00_tx_5F00_can0_5F00_pe5.c

    我也对您的预定义设置很好奇。 请参见下面的。 您在 CCS 中输入了什么器件型号? 对于我来说、LaunchPad 具有 PART_TM4C123GH6PM。 如果您使用的是 TM4C123GH6PGE、则需要在您的设置中反映这一点。  

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

    您好 Charles

    再次感谢您的支持。

    我想我在上次尝试中犯了一个错误。 在上一个测试中、我能够通过 CAN0与 PE4/PE5引脚通信。 它适用于 simple_tx 代码和我在项目中使用的代码。 我通过将电缆直接从 MCU 的引脚连接到收发器来实现这一点。 这表示我的 MCU 的 CAN0端口正在工作、我所做的设置是正确的。

    但是、出于某种原因、我仍然无法与项目中应该使用的 PF0和 PF3引脚通信。 即使我使用电缆直接从 MCU 的引脚连接到收发器、正如我在 PE4/PE5引脚上所做的那样、结果也没有改变。

    下面是 Pf0和 PF3的示波器图像:
    顺便说一下、根据安装的代码、它应该在此时每隔100ms 发送一次周期性消息。
    第一幅和第二幅图像是在没有连接到收发器的 pcan 的情况下拍摄的。 (PF3 - PF0)

       


    当我将 PCAN 连接到收发器时、拍摄了第三、第四和第五幅图像。 (在示波器自动缩放时为 PF3 - PF0、示波器停止时)

          

    大家可以看到、当我连接 PCAN 时、我实际上可以在接收端看到一些信号、但我认为这些信号由于某种原因而损坏。 因为 MCU 无法处理我发送的 CAN 消息。

    当我尝试发送一条消息时、PCAN 接口上的状态从 OK 变为 BUSHEAVY。

    在查看数据表时、我看到了这样的表、其中我注意到 PF0和 PF3的"引脚分配"与其他引脚不同、是3、而不是8。 我想知道这是否要求我在配置期间执行不同的操作?

    顺便说一下、这里是 我在 CCS 的"预定义符号"部分中的设置。

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

    您好、Ayhan、

      很高兴您在 PE5/PE4上工作。

    [引用 userid="490779" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1033253/tm4c123gh6pge-can-protocol-with-can0-base/3902994 #3902994">在查看数据表时、我看到了这样的表、其中我注意到 PF0和 PF3的"引脚分配"是3、而不是8、这与其他引脚不同。 我想知道这是否要求我在配置期间执行不同的操作?

    我认为原因是 PF[0]是一个特殊的引脚。 您必须先解锁此引脚、然后才能将其用于 CAN。 我的错、我应该提前告知您。 默认情况下、PF[0]仅在 GPIO 模式下被锁定。 为了将 PF[0]重新用于其它功能、需要先将其解锁。 请使用 GPIOUnlockPin()来解锁它。  

      

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

    您好、Charles、

    最后、当我解锁 PF0和 PF3引脚时、它会工作。

    感谢您的所有支持。

    如果我要求您不要锁定该线程、您会介意吗、因为如果我在不久的将来遇到这样的问题、我们将继续讨论该线程。

    谢谢、此致。