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.

[参考译文] EK-TM4C123GXL:基于 ARM 的微控制器论坛

Guru**** 2534020 points
Other Parts Discussed in Thread: EK-TM4C123GXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1079098/ek-tm4c123gxl-arm-based-microcontrollers-forum

部件号:EK-TM4C123GXL
“线程: 测试”中讨论的其它部件

嘿,伙计们,我目前正在通过 CAN 通信连接 EK-TM4C123GXL 和 ESP32 Devkit v1。 但是,我的 ESP32在上传 Arduino 提供的 exmaple CAN_mirror 代码后无法接收任何数据。 我目前使用 MCP2562作为 CAN 收发器。  

这两块板之间的通信是否可以通过 CAN 进行?

请帮帮我。 谢谢。  

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

    你好,Sheng,

    可以使用什么协议? 2.0 A/B 可以吗? 还是 FD?

    如果 TM4C 上支持这些协议,则它应使用正确的配置。

    EK-TM4C123GXL 上运行的代码也是什么?

    此致,

    拉尔夫·雅各比

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

    你好,拉尔夫,
    ESP32微控制器使用的协议是 CAN 2.0。  

    目前,我正在使用此配置将 ESP32连接到 TM4C123GXL。

    我当前使用的代码发送包装在 CAN 帧中的数据。

    谢谢。

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

    你好,Sheng,

    从我在 MCP2562数据表中看到的情况来看,VDD 输入为5V,但 CAN 线路驱动的电压大约为~2.5-3.3V? 只是想验证一下。

    我需要查看您的代码以进一步评论,因为所使用的硬件和协议看起来不错-您是否查看了我们的应用说明,该说明也提供了一些 CAN 示例?

    这是应用说明 https://www.ti.com/lit/pdf/spna244 ,所用的 BoosterPack 具有 MCP2551,因此我希望那里的代码在 TM4C 端能够正常工作,因为我们已经测试了这一点。

    此致,

    拉尔夫·雅各比

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

    你好,拉尔夫,   

    下面附上了支持了解了解了解情况的代码和 ESP32代码,供您参考。

    //针对 TivAware

    #include <stdlib.h>
    #include <stdint.h>
    #include <stdbool.h>
    #include "inc/HW_CAN.h"
    #include "inc/HW_ints.h"
    #include "inc/HW_memmap.h"(#include "inc/HW_memmap.h")
    #include "inc/HW_NVIC.h"
    #include "inc/HW_types.h"
    #include "driverlib/can.h"(#include "driverlib/can.h")
    #include "driverlib/debug.h"
    #include "driverlib/FPC.h"
    #include "driverlib/GPIO.h"
    #include "driverlib/interrupe.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/rom.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/Systick.h"
    #include "driverlib/UART.h"(#include "driverlib/UART.h")
    #include "utils/uartstdi.h"(#include "utils/uartstdi.h")

    /*这些头文件定义了将通过 CAN 总线发送的消息*/
    #include "CANMsg.h"

    #ifdef 调试
    无效
    __error__(字符*pcFilename,UINT32_tui32Line)

    }
    #endif


    /*一种计数器,用于跟踪 RX 中断的次数
    发生了*,这应与发送的 TX 消息数相匹配。 *
    volatile UINT32_t g_ui32MsgCount = 0;

    /*表示发生某些传输错误的标志。 *
    volatile bool g_BErrFlag = 0;

    /*定时器计数器(1/10秒)*/
    易失性 Int32_t g_timeds;


    /*延迟 x 毫秒*/
    无效延迟(UINT32_t ui32mSeconds)

    SystlDelay(ui32mSeconds*16000 /3);
    }

    /*此函数是 CAN 外围设备的中断处理程序。 它会检查
    *以找出中断的原因,并保留所有消息的计数
    *已收到。 *
    无效 CANIntHandler (无效){
    UINT32_t ui32状态;

    /*读取 CAN 中断状态以查找中断的原因*/
    ui32Status = CANIntStatus (CAN0_BASE,CAN_INT_STS_Cause);

    /*如果原因是控制器状态中断,则获取状态*/
    IF (ui32Status = CAN_INT_INTID_STATUS){
    /*读取控制器状态。 *
    ui32Status = CANStatusGet (CAN0_BASE,CAN_STS_CONTROL);

    /*设置一个标志,指示可能发生了一些错误。 *
    G_bErrFlag = 1;
    }

    /*检查原因是否是我们用于接收消息的消息对象1。 *
    否则,如果(ui32Status ==1){
    /*到达此点意味着 RX 中断发生在上
    *消息对象1,消息接收完成。 清除
    *消息对象中断。 *
    CANIntClear (CAN0_BASE,1);

    /*增加一个计数器,以跟踪收到的消息数。 *
    g_ui32消息计数++;

    /*收到消息后,清除所有错误标志。 *
    G_bErrFlag = 0;
    }
    }


    /*配置 UART 及其引脚。 这必须在 UARTprintf()之前调用。 *
    作废配置 UART (作废){
    /*启用 UART 使用的 GPIO 外设。 *
    SysPeripheralEnable (sysctl_Periph_GPIOA);

    /*启用 UART 0*/
    SysPeripheralEnable (sysctl_Periph_UART 0);

    /*为 UART 模式配置 GPIO 引脚。 *
    GPIOPinConfigure (GPIO PA0_U0RX);
    GPIOPinConfigure (GPIO _PA1_U0TX);
    GPIOPinTypeUART (GPIO 端口基础,GPIO 针脚0 | GPIO 针脚1);

    /*使用内部16MHz 振荡器作为 UART 时钟源。 *
    UARTClockSourceSet (UART0_BASE,UART_CLOCK_PIOSC);

    /*初始化控制台 I/O 的 UART
    *注:波特率为115200 -这在 Putty ETC 中必须相同*
    UART 配置(0,115200,16000000);
    }


    void ConfigureCAN (void){
    //对于本例,CAN0与引脚 B4和 B5上的 RX 和 TX 引脚一起使用。
    *需要启用 GPIO 端口 B,以便使用这些引脚。 *
    SysPeripheralEnable (sysctl_Periph_GPIOB);

    /*像 CAN 引脚一样启用这些引脚*/
    GPIOPinConfigure (GPIO _PB4_CAN0RX);
    GPIOPinConfigure (GPIO _PB5_CAN0TX);

    /*将这些引脚配置为 CAN 引脚*/
    GPIOPinTypeCAN (GPIO _PORTB_BASE,GPIO _PIN_4 | GPIO _PIN_5);

    /*启用 CAN 外围设备*/
    SysPeripheralEnable (sysctl_Periph_CAN0);

    //初始化 CAN 控制器
    CANInit(CAN0_base);

    /*将 CAN 时钟设置为500 kHz */
    CANBitRateSet (CAN0_BASE,SysCTLClockGet(),500000);

    /*在 CAN 外围设备上启用中断。 *
    CANIntEnable (CAN0_BASE,CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);

    /*启用处理器(NVIC)上的 CAN 中断。 *
    IntEnable(INT_CAN0);

    /*启用 CAN 操作。 *
    CANEnable (CAN0_BASE);
    }


    /*使用微控制器的 CANPeripheral */发送 CANMsg
    Void SendCANMsg( CANMsg *msg ){
    tCANMsgObject sCANMessage;

    /*用消息*/填充 CAN 消息对象
    sCANMessage.ui32消息 ID =消息->ID;
    sCANMessage.ui32消息标识掩码=0;
    sCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
    sCANMessage.ui32 MsgLen =8;
    sCANMessage.pui8消息数据=消息->有效负载;

    /*发送消息*/
    //UART printf("%d",sCANMessage);
    CANMessageSet (CAN0_BASE,1,&sCANMessage,MSG_OBJ_TYPE_TX);
    }


    Void SysTickHandler(void){
    g_timeds++;
    }


    Int main (void){
    CANMsg msg;

    /*将时钟设置为直接从外部晶体/振荡器运行。 *
    Sysctl 时钟集(sysctl_SYSDIV_1 | sysctl_use_OSC | sysctl_OSC 主|
    sysctl_XT_16MHz);

    /*初始化 UART。 *
    配置 UART();

    /*初始化 CAN 消息处理程序。 *
    ConfigureCAN();

    /*以0.1秒为间隔启动计时器*/
    SysTickPeriodSet (SysCTLClockGet()/10);

    IntMasterEnable();
    SysTickIntEnable();
    SysTickEnable();

    /*您需要一个监听相关 COM 端口的终端才能看到此文本*/
    UART printf("Beginning CAN packet transmission ...\n");

    当(1){
    /*生成发送一些 CAN 消息*/
    GenerateMPPT1OutputPowerMessage2 (&msg,12,3);
    SendCANMsg(&msg );
    延时(100);
    GenerateMPPT1OutputPowerMessage(&msg,115,4);

    SendCANMsg(&msg );
    延时(100);

    /*您可以在此处添加其他人... *
    }

    //返回(0);
    }

    //Esp32代码

    #include <Arduino .h>
    #include <ESP32Can.h>
    #include <CAN_CONFIG.h>

    CAN_device_t CAN_cfg;// CAN 配置
    提示 int rx_queue_size = 10;//接收队列大小

    void setup(){
    Serial.begin(115200);
    serial.println("镜像演示- ESP32-Arduino - CAN");
    CAN_cfg.speed = CAN_speed_500KBPS;
    //CAN_cfg.clock = 16000000;
    CAN_cfg.TX_PIN_id = GPIO _NUM_5;
    CAN_cfg.Rx_pin_id = GPIO _NUM_4;
    CAN_cfg.Rx_queue = xQueueCreate (rx_queue_size,sizeof (CAN_frame-relay));

    //初始化 CAN 模块
    ESP32Can.CANInit();
    }

    void loo(){
    CAN_frame-relay rs_frame;
    //从队列接收下一个 CAN 帧
    serial.printf ("0x%08X",rx_frame.msgid);
    如果(xQueueReceive(CAN_cfg.Rx_queue,&Rx_frame,3 * portTXK_Period_MS)=pdTRUE){

    如果(Rx_frame.Fir == CAN_frame_std)为{
    printf("New standard frame ");
    }
    否则{
    printf("New extended frame ");
    }

    如果(Rx_frame-relay .Fir B.RTR == CAN_RTR)为{
    printf ("从0x%08X 开始的 RTR,DLC %d\r\n",rx_frame.msgid,rx_frame.fir.B.dlc);
    }
    否则{
    printf("从0x%08X 开始,DLC %d,数据",rx_frame.msgid,rx_frame.B.dlC);
    对于(int i = 0;i < rx_frame.fir B. dlc;I++){

    printf ("0x%02x ",rx_frame.data.u8[i]);

    }
    printf("\n");
    }

    //回复发件人
    ESP32Can.CANWriteFrame (&Rx_frame);
    }

    }

    我尝试了两个了解蒂沃特的董事会,他们能够相互沟通。 我用 ESP32交换了接收器端后,它不起作用。 我将查看您发送给我的文档。

    谢谢!

    此致,

    Choo

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

    你好,Choo,

    谢谢! 我还没有机会对此进行审查,但我应该能够在明天或以其他方式推迟到我的同事那里。

    此致,

    拉尔夫·雅各比

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

    你好,Choo,

    [引用 userid="507216" url="~ë/support/icros/arm-based 微处理器组/基于 ARM 的微控制器/f/arm-based 微控制器-forum/1079098/EK-tm4c123gxl-arm-mriggers-forum/4001609#4001609]',我曾尝试与两个主板进行交流,并意识到它们彼此能够与对方沟通。 我用 ESP32交换了接收器端后,它不起作用。 我将查看您发送给我的文档。

    我看到,这表明至少 TM4C 到 TM4C 的配置是正确的。 我不希望有其他配置来向 ESP32发送数据包。 波特率是我能想到的一个领域,但这似乎是好的。

    您是否曾尝试监控总线上的信号,并比较 TM4C 和 TM4C 的信号与 TM4C 和 ESP32的信号有何不同? 我觉得这会给我们提供最多的数据,因为如果它在 TM4C 和 TM4C 之间工作,那么信号就会在该信号和 TM4C 和 ESP32之间不同,这会提供根本原因的指示 ,或者信号看起来相同,并会得到证实 ESP32未正确接收数据包。

    从代码上讲,我审查了您的实施情况,但没有任何问题对我来说是一个有意义的问题,因为 TM4C 到 TM4C 测试成功。

    此致,

    拉尔夫·雅各比