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.
器件型号:LAUNCHXL-F28377S
大家好
我想在 PC 计算机和 LaunchPad F28377S 之间建立通信。 我花了很多时间来完成它。
以下是硬件方面的事实:
1) 1)板上的专用金引脚用于 CAN 连接。 此引脚为(CAN-L、CAN-H 和 GND)。 还有总线收发器(SN65HVD234D)。 此器 件的输出为 D (可发送数据 TXD)和 R (可接收数据 RXD)。 通过电阻器 R43和 R44 连接到 处理器引脚:76 (GPIO70 - CANRxA)和 76 (GPIO 71- CANTxA)
有以下软件事实:
1) 1)我分析 了器件类型 F2837xS 的 ControlSuit 示例。
C:\ti\controlSUITE\device_support\F2837xS\V210\F2837xS_Examples_CPU1。
2) 2)我编写了文档 F2837xS-DRL-UG.pdf
3) 3)根据这些信息、我开发了以下 CAN 的软件(仅 CAN 传输功能)。
我无法观察到任何有关 CAN-L 和 CAN-H 的信息 使用示波器、我只看到2、5V 左右的两个信号的值。
因此、我要帮助我解决这个问题。 请指出我的想法有什么错误、我必须走哪条路。
我将等待您的回复。
最好的服务
//######################################################################################################################
#include "F28x_Project.h"//设备头文件和示例 include 文件
#include
#include
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/hw_ca.h"
#include "driverlib/CAN.h"
unsigned char txMsgData[4];
tCANMsgObject sTXCANMessage;
void main (void)
{
InitSysCtrl();
InitGpio();
GPIO_SetupPinMux (70、GPIO_MUX_CPU1、1);//GPIO70 - CANRXA
GPIO_SetupPinOptions (70、GPIO_INPUT、GPIO_异 步);
GPIO_SetupPinMux (71、GPIO_MUX_CPU1、1);//GPIO71 - CANTXA
GPIO_SetupPinOptions (71、GPIO_OUTPUT、GPIO_PushPull);
CANInit (CANA_base);
//
//CANBitTimingSet (CAN 的地址、指向带有时钟参数(pClkParams)的结构)
//
//
//设置可以提供时钟源。 选择选项
// CANClkSourceSelect (CAN 的基址、时钟源) 0 -所选 CPU SYSCLKOUT
CANClkSourceSelect (CANA_base、0);
//
// CANBitRateSet (CAN 的基址、以 Hz 为单位的 CAN 时钟频率、比特率)
CANBitRateSet (CANA_base、200000000、250000);
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
// pMsgObject
sTXCANMessage.ui32MsgID = 0x203;// 11或29
//sTXCANMessage.ui32MsgIDMask = 0;//0x7F8;//无;
sTXCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
//sTXCANMessage.ui32Flags = 0;
sTXCANMessage.ui32MsgLen = 4;
sTXCANMessage.pucMsgData = txMsgData;
txMsgData[0]= 0x12;
txMsgData[1]= 0x34;
txMsgData[2]= 0x56;
txMsgData[3]= 0x78;
CANEnable (CANA_base);
for (;;)
{
txMsgData[0]= 0x12;
txMsgData[1]= 0x34;
txMsgData[2]= 0x56;
txMsgData[3]= 0x78;
//
//发送消息
// CANA_base address of CANA
//ObjID----配置1-32的对象编号(邮箱)
//pMsgObject-- 指向包含按摩对象设置的结构的指针、
//eMsgType--- 指示对象的消息类型);
//
CANMessageSet (CANA_base、2、&sTXCANMessage、MSG_OBJ_TYPE_TX);
DELAY_US (1000 * 250);
}
}
我尝试使用 GPIO 修改运行示例 CAN_EXTERNAL.c。 在 CAN-H、CAN-L 端口上有任何令人满意的结果。 请注意、在 LaunchPad 上、我们只有一个收发器。
该示例针对 F28377S (而非 LaunchPad)的 CAN 模块(CANA 和 CANB)进行开发。 此外、器件上的两个 CAN 模块需要通过 CAN 收发器相互连接。
示例初始化 CAN 模块 A 和 CAN 模块 B 以进行外部通信。 CAN-A 模块被设置为向 CAN-B 模块发送递增数据。 CAN-B 模块被设置为在接收到数据时触发一个中断处理例程(ISR)。 如果发送的数据与接收到的数据不匹配、则会设置错误标志
尝试以下操作:
GPIO_SetupPinMux (70、GPIO_MUX_CPU1、5);//GPIO70 - CANRXA
GPIO_SetupPinOptions (70、GPIO_INPUT、GPIO_异 步);
GPIO_SetupPinMux (71、GPIO_MUX_CPU1、5);//GPIO71 - CANTXA
GPIO_SetupPinOptions (71、GPIO_OUTPUT、GPIO_PushPull);
非常感谢。
GPIO71的设置(setupPinMux 和 SetupPinOption) 工作正常。 :):)。 谢谢你哈雷什:):)
现在、我有另一个阶段的 CAN 通信。 我想通过 CAN 接口(103h 帧)接受按摩。 不管用。
我的代码如下所示。 我不知道问题在哪里。 GPIO70 - CANRXA (实际数字5)的配置错误或代码中的错误。 也许我必须添加函数或进行重新配置。 提前感谢您的大力支持。
--定义
unsigned char rxMsgData_103h[4];
tCANMsgObject sRXCANMessage_103h;
--RxCAN 通信的 GPIO 设置
GPIO_SetupPinMux (70、GPIO_MUX_CPU1、5);//GPIO70 - CANRXA
GPIO_SetupPinOptions (70、GPIO_INPUT、GPIO_异 步);
-- 103h 帧的初始化
sRXCANMessage_103h.ui32MsgID = 0x103;// 11或29
//sRXCANMessage_103h.ui32MsgIDMask = 0;
sRXCANMessage_103h.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
sRXCANMessage_103h.ui32MsgLen = 4;
sRXCANMessage_103h.pucMsgData = rxMsgData_103h;
--从 CAN 接收帧
CANMessageSet (CANA_base、3、&sRXCANMessage_103h、MSG_OBJ_TYPE_RX);
从您的帖子来看、很难准确理解您要做的事情。 这是我的理解。 如果有任何错误、请告诉我:
问题:
问题:
您是如何得出未收到数据的结论的?
答案见上文。
在 CANRXA 引脚之前、您是否验证了正确接收到的帧? 您能否提供示波器捕获?
DD 您是否确保发送器和接收器都配置为相同的比特率?
不是100%
PC 端的 CAN 总线是如何端接的?
一个 CAN 电阻器(120R)是 LaunchPad、另一个是 PC 和 LaunchPad 之间的电缆。
在 Launchpad 端、您的代码在收到帧后会做什么?
代码下方
//######################################################################################################################
//
//文件:CAN_moje_transmit
//
//! - CANA 位于 GPIO71 (CANTXA)和 GPIO70 (CANRXA)上
//
//!
//! b 监视\b 变量\n
//! - TXCOUNT -调整以设置要发送的消息数
//! - txMsgCount -发送消息数的计数器
//! -rxMsgCount-接收报文数量的计数器
//! - txMsgData -一个包含正在发送的数据的数组
//! -rxMsgData-一个包含接收到的数据的数组
//! -errorFlag-表示发生错误的标志
//######################################################################################################################
//######################################################################################################################
//
//包含的文件
//
#include "F28x_Project.h"//设备头文件和示例 include 文件
#include
#include
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/hw_ca.h"
#include "driverlib/CAN.h"
//
//定义
//
#define RED_LED_GPIO 12 //红色 GPIO 12
#define blue_LED_GPIO 13 //蓝色 GPIO 13
//
//全局
//
//unsigned char txMsgData[4];
//unsigned char rxMsgData[4];
//tCANMsgObject sTXCANMessage;
int unsigned a、b、c、d;
//TX
unsigned char txMsgData_203h[4];
unsigned char txMsgData_205H[4];
//RX
unsigned char rxMsgData_103h[4];
//unsigned char rxMsgData[4];
tCANMsgObject sTXCANMessage_203h;
tCANMsgObject sTXCANMessage_205H;
tCANMsgObject sRXCANMessage_103h;
//tCANMsgObject sRXCANMessage;
//
//主函
//
void main (void)
{
//
//初始化系统控制:
// PLL、安全装置、启用外设时钟
//
InitSysCtrl();
//
//初始化 GPIO 并为 CANTX/CANRX 配置 GPIO 引脚
//在模块 A 和 B 上
//
InitGpio();
//
//为 CAN-A TX/RX 设置 GPIO 引脚多路复用器
//
GPIO_SetupPinMux (70、GPIO_MUX_CPU1、5);//GPIO70 - CANRXA
GPIO_SetupPinOptions (70、GPIO_INPUT、GPIO_异 步);
GPIO_SetupPinMux (71、GPIO_MUX_CPU1、5);//GPIO71 - CANTXA
GPIO_SetupPinOptions (71、GPIO_OUTPUT、GPIO_PushPull);
//
//设置 LED 的 GPIO 引脚多路复用器
//
GPIO_SetupPinMux (RED_LED_GPIO、GPIO_MUX_CPU1、0);
GPIO_SetupPinOptions (RED_LED_GPIO、GPIO_OUTPUT、GPIO_PushPull);
GPIO_SetupPinMux (blue_LED_GPIO、GPIO_MUX_CPU1、0);
GPIO_SetupPinOptions (blue_LED_GPIO、GPIO_output、GPIO_PushPull);
//
//初始化 CAN 控制器
// CANInit (基于 CAN 地址)
CANInit (CANA_base);
//
//CANBitTimingSet (CAN 的地址、指向带有时钟参数(pClkParams)的结构)
//
//
//设置可以提供时钟源。 选择选项
// CANClkSourceSelect (CAN 的基址地址、时钟源) 0 -所选 CPU SYSCLKOUT
CANClkSourceSelect (CANA_base、0);// 500kHz CAN 时钟
//
//设置 CAN 的通信参数
// CANBitRateSet (CAN 的基址地址、以 Hz 为单位的 CAN 时钟频率、比特率)
CANBitRateSet (CANA_base、200000000、250000);
//
//在 CAN B 外设上启用中断。
//CANIntEnable (基于 CAN 地址、要启用的中断源的位掩码)
//CAN_INT_ERROR | CAN_INT_STATUS 存在 kogical 或
//
//CANIntEnable (CANA_base、CAN_INT_ERROR | CAN_INT_STATUS);
//CANIntEnable (CANA_base、CAN_INT_IE0);
//CANIntEnable (CANA_base、CAN_INT_IE1);
//
//清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;
//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//
InitPieCtrl();
//
//禁用 CPU 中断并清除所有 CPU 中断标志
//
IER = 0x0000;
IFR = 0x0000;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//WYSYLANIE 可以 inicjalizacja
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// INICJALIZACJA (wysylanie) USTAWIEN CAN DLA RAMKI 203h I 205H
//frame_203h
// pMsgObject
sTXCANMessage_203h.ui32MsgID = 0x203;// 11或29
sTXCANMessage_203h.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
sTXCANMessage_203h.ui32MsgLen = 4;
sTXCANMessage_203h.pucMsgData = txMsgData_203h;
//205H 帧
//pMsgObject_205H
sTXCANMessage_205H.ui32MsgID = 0x205;// 11或29
sTXCANMessage_205H.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
sTXCANMessage_205H.ui32MsgLen = 4;
sTXCANMessage_205h.pucMsgData = txMsgData_205h;
// INICJALIZACJA POCZATKOWYCH DANYCH W RAMCE 203h I 205H
//初始化 Dana 203h
txMsgData_203h[0]= 0x1;
txMsgData_203h[1]= 0x2;
txMsgData_203h[2]= 0x3;
txMsgData_203h[3]= 0x4;
//将 Dana 初始化205H
txMsgData_205H[0]= 0x1;
txMsgData_205H[1]= 0x1;
txMsgData_205H[2]= 0x1;
txMsgData_205H[3]= 0x1;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//ODBIERANIE 可以 inicjalizacja
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// INICJALIZACJA (odbieranie) USTAWIEN CAN DLA RAMKI 103h
//frame_103h
// pMsgObject
sRXCANMessage_103h.ui32MsgID = 0x103;// 11或29
//sRXCANMessage_103h.ui32MsgIDMask = 0;
//sRXCANMessage_103h.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
sRXCANMessage_103h.ui32Flags = MSG_OBJ_USE_ID_FILTER;
sRXCANMessage_103h.ui32MsgLen = 4;
sRXCANMessage_103h.pucMsgData = rxMsgData_103h;
CANEnable (CANA_base);
for (;;)
{
// uaktualnianie wysycheuch danych w ramce 203h do can
// wpsane wartosci oczatkowe txMsgData_203h[4] sa zwiekszane o 1.
txMsgData_203h[0]+= 0x01;
txMsgData_203h[1]+= 0x01;
txMsgData_203h[2]+= 0x01;
txMsgData_203h[3]+= 0x01;
// uaktualnianie wysycheuch danych w ramce 205h do can
// wpsane wartosci oczatkowe txMsgData_205H[4] sa zwiekszane o 1 lub zmniejszane o 1.
txMsgData_205H[0]+= 0x01;
txMsgData_205H[1]-= 0x01;
txMsgData_205H[2]+= 0x01;
txMsgData_205H[3]-= 0x01;
// Opoznienie 0.5s
DELAY_US (1000 * 500);
//Wysylanie danych do can。 Ramka 203h I 205H
CANMessageSet (CANA_base、1、&sTXCANMessage_203h、MSG_OBJ_TYPE_TX);
CANMessageSet (CANA_base、2、&sTXCANMessage_205H、MSG_OBJ_TYPE_TX);
// Opoznienie 0.5s
DELAY_US (1000 * 500);
//Pobieranie danych z CAN。 Ramka 103h
CANMessageSet (CANA_base、3、&sRXCANMessage_103h、MSG_OBJ_TYPE_RX);
// Opoznienie 0.5s
DELAY_US (1000 * 500);
//Odembranchie danych z CAN.Ramka 103h。 奥德帕米尼姆普尔茨皮西比·多兹米尼姆
a=rxMsgData_103h[0];
b=rxMsgData_103h[1];
C=rxMsgData_103h[2];
D=rxMsgData_103h[3];
if (a=0x10)
{
//Wlaczenie LEDow
GPIO_WritePin (RED_LED_GPIO、0);
GPIO_WritePin (blue_LED_GPIO、0);
DELAY_US (1000 * 500);
}
其他
{
//Wylaczenie LEDow
GPIO_WritePin (RED_LED_GPIO、1);
GPIO_WritePin (blue_LED_GPIO、1);
}
DELAY_US (1000 * 500);
}
}
//
//文件结束
//
首先也是最重要的、您需要确保两个节点配置为完全相同的比特率。 这是极其关键的。 除非您确保这样做、否则没有进一步调试的意义。 我看到您正在将 MCU 初始化为250kbps。 PC 端呢? 是否确定它也配置为250kbps? 请特别注意 Chris 在之前的一篇文章中提到的:"除了 Harareesh 提到的内容外、controlSUITE 示例还针对具有不同振荡器频率的 controlCARD 进行了设置。 确保在项目中添加"_LAUNCHXL_F28377S"作为预定义符号。 有关详细信息、请参阅 F2837xS V210文档中的"F2837xS-FRM-EX-UG"第2章。
执行此操作:
在您的代码中、您同时在发送和接收数据。 目前、删除代码的发送部分、仅执行接收操作。
同时禁用消息过滤。 请在下面注释此行。
sRXCANMessage_103h.ui32Flags = MSG_OBJ_USE_ID_FILTER;
现在、您的代码使用固定的延迟。 使用适当的标志来确定数据是否已被接收。 否则很难同步通信。
唯一相关的示波器图是显示位时间为4us 的示波器图。 为什么波形如此嘈杂?
现在、看一下示波器图、无法确定 MSGID。 我假设 PC 上的 CAN 总线分析器软件具有一个 GUI、您可以在其中验证正在传输正确的 MSGID。
请仔细阅读我之前的帖子(禁用滤波、禁用 MCU 侧的传输、不使用固定的接收延迟等)并实现这些想法。
是否有关于此问题的任何更新?
您好!
我很抱歉我迟到了。 我的项目已关闭。
因此、此时我 必须停止 Rx 的问题。
现在是时候继续了。
此致
好的。 请关闭开机自检并在需要时重新打开。