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.

[参考译文] TMS570LS0432:TMS570LS0432和 TMS320F28069M 之间的 CAN 通信

Guru**** 2605645 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/749567/tms570ls0432-can-communication-between-tms570ls0432-and-tms320f28069m

器件型号:TMS570LS0432

我尝试了两个 F28069板之间以及两个 Hercules 板之间的 CAN 通信、它工作正常、但我无法在 F28069和 Hercules 板之间进行通信。 我检查了波特率、msgid 和 DLC、所有这些设置都相同、F28069的 CANL 和 CANH 硬件连接连接到 Hercules 板的收发器以及 TX、RX。

/* TMS320F28069的代码*/
#include "DSP28x_Project.h" //器件头文件和示例包括文件

#define TXCOUNT 100 //传输将发生(TXCOUNT)时间

较长 I;
long 循环计数= 0;

void mailbox_read (Int16 I);

uint32 TestMbox1 = 0;
uint32 TestMbox2 = 0;
uint32 TestMbox3 = 0;

void main (void)
{
struct eCAN-regs ECanaShadow;

InitSysCtrl();
InitECanGpio();

Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();

InitECan(); //初始化 eCAN-A 模块

//写入 MSGID 字段
ECANaMboxs.MBOX0.MSGID.ALL = 0x8000000001; //扩展标识符
ECANaMboxs.MBOX16.MSGID.ALL = 0x8000000001;

//将被测邮箱配置为发送和接收邮箱
ECanaShady.CANMD.all = ECanaRegs.CANMD.all;
ECanaShady.CANMD.bit.md0 = 0;
ECANaRegs.CANMD.ALL = ECANaShady.CANMD.ALL;

ECanaShady.CANMD.all = ECanaRegs.CANMD.all;
ECanaShady.CANMD.bit.MD16 = 1;
ECANaRegs.CANMD.ALL = ECANaShady.CANMD.ALL;

//启用被测邮箱
ECanaShady.CANME.ALL = ECanaRegs.CANME.ALL;
ECANaShady.CANME.bit.ME0 = 1;
ECanaRegs.CANME.ALL = ECanaShadure.CANME.ALL;

ECanaShady.CANME.ALL = ECanaRegs.CANME.ALL;
ECanaShading.CANME.bit.ME16 = 1;
ECanaRegs.CANME.ALL = ECanaShadure.CANME.ALL;

//写入主控寄存器中的 DLC 字段
ECANaMboxs.MBOX0.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX16.MSGCTRL.bit.DLC = 8;

//写入邮箱 RAM 字段
ECANaMboxs.MBOX0.MDL.ALL = 0x8000000001;
ECANaMboxs.MBOX0.MDH.ALL = 0x89ABCDEF;

//
//开始传输
//
对于(i=0;i < TXCOUNT;i++)
{
ECanaShady.CANTRS.ALL = 0;
ECanaShady.CANTRS.bit.TRS0 = 1; //为待测试的邮箱设置 TRS
ECANaRegs.CANTRS.ALL = ECANaShady.CANTRS.ALL;

操作
{
ECanaShady.Canta.all = ECanaRegs.Canta.all;
} while (ECanaShading.Canta.bit.TA0 = 0);//等待 TA25位被置位

ECanaShading.Canta.all = 0;
ECanaShading.Canta.bit.TA0 = 1; //清除 TA25
ECanaRegs.Canta.all = ECanaShady.Canta.all;

循环计数++;

//此 func 读取指定的邮箱数据
mailbox_read (16);
}
}

//
// mailbox_read -此函数通过
邮箱号(MBXnbr)读取指定//的内容。 rcv MBX 的 msgid 作为
// MDL 数据进行传输。
//
void
mailbox_read (int16 MBXnbr)
{
volatile struct MBOX *邮箱;
邮箱=&ECanaMbboxs.MBOX0 + MBXnbr;
TestMbox1 =邮箱->MDL.all;//
TestMbox2 =邮箱->MDH.all;//
TestMbox3 =邮箱->MSGID.ALL;//
}

// TMS570LS0432的代码*//
////*用户代码开始(0)*/
#include "sys_common.h"
#include "system.h"
#include "ca.h"
#include "sci.h"
//*用户代码结束*//
//* include 文件*/
#include "sys_common.h"
//*用户代码开始(1)*

void *
/@@main.n *代码结束
*@请注意、默认情况下、此函数为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实现应用程序。
*/
*用户代码开始(2)*/
#define D_size 9
uint8_t Rx_data[D_size]={0};
uint32_t error=0;
uint8 value=0x80;
uint32_t checkPackets (uint8_t * src_packet、uint8_t * dst_packet、uint32
)*用户


代码开始(t_user)*/t void 3)*/ t*(t_end)/t 代码(t_t
canInit();//initialize CAN 模块
sciInit();//initialize sci 模块
sciSend (scilinREG、21、(unsigned char *)"Hey\r\n");
sciSend (scilinREG、D_size、value);
/*等待 CAN1*/上收到消息
while (!canIsRxMessageArrived (canREG1、canMESSAGE_BOX1));
canGetData (canREG1、canMESSAGE_BOX1、Rx_DATA);/* CAN1*/上的接收
sciSend (scilinREG、D_size、Rx_data);//在 canbus 上发送接收到的数据
/*检查接收到的数据模式*/
//error= checkPackets (&TX_DATA[0]、&Rx_DATA[0]、D_size);
while (1);//infinite loop
/*用户代码结束*/
//return 0;
}
//用户代码开始(4)*/
uint32_t checkPackets (uint8_t * src_packet、uint8_t * dst_packet、uint32_t psize)
{
uint32_t err=0;
uint32_t cnt=psize;
while (cnt -)
{
if ((* src_packet++)!=(* dst_packet++))
{
ERR++;
}
}
return (err);
}/*CAN
中断通知(未使用但必须提供)*/
void canMessageNotification (canbase_t *节点、uint32_t MessageBox)
{
return;
}
/* CAN 中断通知(未使用但必须提供)*/
void canErrorNotification (canbase_t *节点、uint32_t 通知)
{
return;
}/*CAN
中断通知(不使用,但必须提供)*/
void esmGroup1Notification (无符号通道)
{
return;
}/*CAN
中断通知(不使用,但必须提供)*/
void esmGroup2Notification (无符号通道)
{
返回;
} 
//
库文件的部分*/ for (i = 0U;i < 8U;i++)
{
#if (__little_endian_= 1)||(__little_ENDIAN_= 1))
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
NODE->IF1DATx[i]=*数据;
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
/*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
Data++;
#else
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
NODE->IF1DATx[s_canByteOrder[i]=*数据;
/*SAFETYMCUSW 45 D MR:21.1 "仅此驱动程序允许有效的非 NULL 输入参数"*/
/*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
Data++;
#endif
}
/**-将 TX 数据复制到消息框中*/
/*SAFETYMCUSW 93 S MR:6.1、6.2、10.1、10.2、10.3、10.4 "LDRA 工具问题"*/
NOode->IF1NO =(uint8) MessageBox;
成功= 1U;
} 

在这个"库的一部分"文件中、32位数据被复制到8位消息框中、这将是通信的一个问题。

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

    您好!

    已将这一问题通知有关专家。

    请注意、这是美国的感恩节周、大多数 TI 工程师都不在。

    请预计下周初收到延迟的回复。

     

    此致、

    Sudhakar

    ------------------------------------------------------

    如果帖子回答了您的问题、请使用 "验证答案" 按钮进行标记。

    其他有用链接:

    C2000入门     C2000闪存常见问题/常见问题      仿真常见问题解答

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

    请尽快答复。