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.

[参考译文] CCS/TMS320F28377S:CAN 中存在问题

Guru**** 2477865 points
Other Parts Discussed in Thread: TMS320F28377S

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/874282/ccs-tms320f28377s-problem-in-can

器件型号:TMS320F28377S

工具/软件:Code Composer Studio

您好!

我想在 TMS320F28377S 中使用 CAN。 这是我的代码。 我应该每隔一秒发送一次数据。 但它在 CAN 引脚上持续发送帧,CAN 上没有任何内容发送到 USB 转换器(CAN 到 USB 正常工作,也不存在设置问题)。 因此、请帮助解决此问题。

#include "F28x_Project.h"
#include
#include
#include "F28x_Project.h"
#include
#include
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/hw_ca.h"
#include "driverlib/CAN.h"
#include "CAN_lib.h"

//
//全局
//

volatile unsigned long g_ulMsgCount = 0;//跟踪的计数器
//发送次数
//成功。
volatile unsigned long g_BErrFlag = 0;//一个标志来指示某些标志

tCANMsgObject sRXCANMessage2;
tCANMsgObject sTXCANMessage;
tCANMsgObject sRXCANMessage;

#define TX_MSG_OBJ_ID 1.
#define RX_MSG_OBJ_ID2
#define MSG_DATA_LENGTH 8.
#define Transmit 数据长度6

//发生传输错误。
unsigned char ucTXMsgData[4]、ucRXMsgData[4];
unsigned char txMsgData[8]={0};
unsigned char rxMsgData[8];

void init_can (void)

EALLOW;

GPIO_SetupPinMux (30、GPIO_MUX_CPU1、1);//GPIO30 - CANRXA
GPIO_SetupPinOptions (30、GPIO_INPUT、GPIO_异 步);

GPIO_SetupPinMux (31、GPIO_MUX_CPU1、1);//GPIO31 - CANTXA
GPIO_SetupPinOptions (31、GPIO_OUTPUT、GPIO_PushPull);

EDIS;

CANInit (CANA_base);
//
//设置可以从 PLL 输出时钟计时
//
CANClkSourceSelect (CANA_base、0);// 500kHz CAN 时钟
//
//为每个模块将 CAN 总线位速率设置为500kHz
//此函数为标称配置设置 CAN 总线时序。
//您可以使用实现对 CAN 总线时序的更多控制
//函数 CANBitTimingSet()代替这个函数(如果需要)。
//此外、请查阅器件数据表以了解更多相关信息
// CAN 模块计时。
//
CANBitRateSet (CANA_base、200000000、250000);

sTXCANMessage.ui32MsgID = 0x1;// 29位标识符
sTXCANMessage.ui32MsgIDMask = 0;
sTXCANMessage.ui32Flags = 0;
sTXCANMessage.ui32MsgLen = Transmit 数据长度;
sTXCANMessage.pucMsgData = txMsgData;

//
//初始化要发送的发送消息对象数据缓冲区
//
txMsgData[0]= 0x7E;
txMsgData[1]= 0x01;
txMsgData[2]= 0x01;
txMsgData[3]= 0x00;
txMsgData[5]= 0x0D;
txMsgData[4]= check_can (txMsgData、4);

sRXCANMessage2.ui32MsgID = 0x01;
sRXCANMessage2.ui32MsgIDMask = 0;
sRXCANMessage2.ui32Flags = 0;
sRXCANMessage2.ui32MsgLen = MSG_DATA_LENGTH;
sRXCANMessage2.pucMsgData = rxMsgData;
CANMessageSet (CANA_base、RX_MSG_OBJ_ID2、&sRXCANMessage2、MSG_OBJ_TYPE_RX);
//
//启动 CAN 模块 A 和 B 操作
//
CANEnable (CANA_base);


void send_data_on CAN (void)


 CANMessageSet (CANA_base、TX_MSG_OBJ_ID、&sTXCANMessage、MSG_OBJ_TYPE_TX);

返回;

void recive_data_on can (void)

CANMessageGet (CANA_base、2、&sRXCANMessage、true);
返回;

unsigned char check_can (unsigned char txMsgData[]、unsigned char len)

unsigned char i、chk = 0;
int sum =0;
for (i =0;<len;i++){
chk ^= txMsgData[i];
sum += txMsgData[i];

return ((chk^sum)&0xFF);

main (空)

init_cand();

 while (1)

 {

   SEND_DATA_ON_CAN ();  //每隔1秒发送一次数据

   延迟(One_second);

 }

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

    Sameer、您好!

    CAN 将始终传输帧、除非它从节点接收到 ACK。  ACK 位将发出信号、表明至少有一个节点识别 CAN 帧、否则将始终重新发送消息。  我不熟悉您的 USB 转换器、但它是否会在帧转换为串行帧后将 ACK 信号发送回 CAN?  USB 转换器是如何实现的? 它是直接连接到 CANTX/RX 引脚还是连接到 CANBUS (CANL/CANH)?

    此致、

    Joseph

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

    感谢您重放、

    我使用 ISO1050DW 收发器将微控制器的 CAN TX/RX 引脚与 CAN 转 USB 转换器相连。 有一点不清楚、我可以使用它  

    "CANMessageSet (CANA_base、TX_MSG_OBJ_ID、&sTXCANMessage、MSG_OBJ_TYPE_TX)"、用于在 CAN 上发送数据。

    是否有任何方法可以停止重新传输? 即使没有收到确认也是如此。 上述计划是否有任何错误????   

     

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

    Sameer、您好!

    我看不到 CANMessageSet 调用有任何问题,但您可能希望在调用 CANMessageSet()之前先调用 CANEnable()。  我认为、您看不到数据的原因是、在程序中调用 CANMessageSet 命令时、尚未启用 CAN。

    此致、

    Joseph