请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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位消息框中、这将是通信的一个问题。