“线程: 测试”中讨论的其它部件
嘿,伙计们,我目前正在通过 CAN 通信连接 EK-TM4C123GXL 和 ESP32 Devkit v1。 但是,我的 ESP32在上传 Arduino 提供的 exmaple CAN_mirror 代码后无法接收任何数据。 我目前使用 MCP2562作为 CAN 收发器。
这两块板之间的通信是否可以通过 CAN 进行?
请帮帮我。 谢谢。
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.
嘿,伙计们,我目前正在通过 CAN 通信连接 EK-TM4C123GXL 和 ESP32 Devkit v1。 但是,我的 ESP32在上传 Arduino 提供的 exmaple CAN_mirror 代码后无法接收任何数据。 我目前使用 MCP2562作为 CAN 收发器。
这两块板之间的通信是否可以通过 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,
[引用 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 测试成功。
此致,
拉尔夫·雅各比