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/TMS320F2.8379万D:MCU板的两个双核处理器之间基于CAN的数据传输问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/619044/ccs-tms320f28379d-issue-with-can-based-data-transfer-between-two-dual-core-processor-of-mcu-boards

部件号:TMS320F2.8379万D
主题中讨论的其他部件:C2000WARE

工具/软件:Code Composer Studio

大家好,

     在执行特定操作时,我遇到了一个非常典型的问题,即通过CAN总线传输和接收数据,具体描述如下:

1)在我的程序中,我正在将接收到的数据与预定义的数据进行比较,通过这些数据我正在执行闪烁LED操作。 完整的源代码如下所示:

[  

#Define Blinky_LED_GPIO 56.

//
//主菜单
//

内部主(无效)

tCANMsgObject sTXCANMessage;
tCANMsgObject sRXCANMessage;
unsigned char ucTXMsgData[8]={'0','0','0','0','0','0','0'},RXUMsgData[8]={'0','0','0','0','0','0'0','0'0';
unsigned char ucMsgData1[8]={'0','0','0','0','0','0','0','0'};
//unsigned int I;
无符号字符x[8]={'a','b','c','d','1','2','3','4'};

//
//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例函数可在F2837xD_sysctrl.c文件中找到。
//
InitSysCtrl();

//
//步骤2. 初始化GPIO:8
//此示例函数可在F2837xD_GPIO.c文件和中找到
//说明了如何将GPIO设置为其默认状态。
//


伊尼特·格皮奥();
GPIO_SetupPinMux (36,GPIO _MUX_CPU1,6);//GPIO30 - CANRXA
GPIO_SetupPinMux (37,GPIO _MUX_CPU1,6);//GPIO31 - CANTXA
GPIO设置PIN选项(36,GPIO输入,GPIO _异步);
GPIO设置引脚选项(37,GPIO输出,GPIO推送);

GPIO_SetupPinMux (Blinky_LED_GPIO,GPIO _MUX_CPU1,0);
GPIO_SetupPinOptions (Blinky_LED_GPIO,GPIO输出,GPIO);

//
//初始化CAN控制器
//
CANInit (Cana_base);

//
//可以为设置计时,使M3/主子系统时钟不工作
//
CANClkSourceSelect(Cana_base, 0);

//
//设置CAN总线的比特率。 此功能设置CAN
//额定配置的总线定时。 您可以实现更多的控制
//通过CAN总线定时,改为使用函数CANBitTimingSet()
//(如果需要)。
//在本例中,CAN总线设置为500 kHz。 在下面的函数中,
//调用SysCltlClockGatet()用于确定其时钟速率
//用于为CAN外围设备计时。 这可以替换为
//固定值(如果知道系统时钟的值),保存额外的值
//函数调用。 对于某些零件,CAN外围设备由固定的计时器计时
// 8 MHz,无论系统时钟如何,在这种情况下,呼叫
// SysClockCatlockGatet()应替换为800万。 查阅数据
//表,了解有关CAN外围设备时钟的更多信息。
//
CANBitRateSet(Cana_base, 2亿, 50万);

//
//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
//
色调;

//
//将PIE控件寄存器初始化为其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//此函数位于F2837xD_PIECTRL.c文件中。
//
InitPieCtrl();

//
//禁用CPU中断并清除所有CPU中断标志:
//
IER = 0x0000;
IFR = 0x0000;

//
//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//这将填充整个表,即使中断也是如此
//在本例中不使用。 这对于调试非常有用。
// shell ISR例程位于F2837xD_DefaultIsr.C.中
//此函数位于F2837xD_PieVect.C.中
//
InitPieVectorTable();

//
//启用测试模式并选择外部回送
//
//HWREG (Cana_base + CAN_O_CTL)|= CAN_CTL_TEST;
//HWREG (Cana_base + CAN_O_TEST)= CAN_TEST_EXL;

//
//启用CAN以进行操作。
//
CANEnable (Cana_base);

//
//初始化将用于发送CAN的消息对象
//消息。 消息将为4个字节,其中包含增量
//值。 最初它将被设置为0。
//
//*(unsigned long *)ucTXMsgData =0;
sTXCANMessage.ui32MsgID = 1;// CAN消息ID -使用1
sTXCANMessage.ui32MsgIDMask = 0;// TX不需要掩码
sTXCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;//在TX上启用中断
sTXCANMessage.ui32MsgLen = sizeof(ucTXMsgData);//邮件大小为4
sTXCANMessage.pucMsgData = ucTXMsgData;// PTR到消息内容

//
//初始化将用于接收CAN的消息对象
//消息。
//
//*(unsigned long *) ucRXMsgData = 0;
sRXCANMessage.ui32MsgID = 1;// CAN消息ID -使用1
sRXCANMessage.ui32MsgIDMask = 0;// TX不需要掩码
sRXCANMessage.ui32Flags = MSG_OBJ_NO_FLAGS;
sRXCANMessage.ui32MsgLen = sizeof(RXucMsgData);//邮件大小为4
sRXCANMessage.pucMsgData = ucRXMsgData;// ptr至邮件内容

//
//设置用于接收消息的消息对象
//
CANMessageSet (Cana_base,2,&sRXCANMessage,MSG_OBJ_TYPE_RX);

//
//输入循环以发送消息。 新消息将按发送一次
//秒。 4个字节的消息内容将被视为未签名的内容
//长,每次增加1。
//
对于(;;)

//
//使用对象编号1发送CAN消息(与
// CAN ID,在本例中也是1)。 此功能将导致
//要立即传输的消息。
//
CANMessageSet (Cana_base,1,&sTXCANMessage,MSG_OBJ_TYPE_TX);

//
//现在等待1秒钟,然后继续
//
DELAY _US(1000*1000);</s>1000

//
//获取接收消息
//
CANMessageGet (Cana_base,2,&sRXCANMessage,TRUE);

//
//确保接收的数据与传输的数据匹配
//
/* IF (*(unsigned long *) ucTXMsgData)!=(*(unsigned long *) ucRXMsgData)

ASM (" ESTOP0");

}
*/
//
//增加传输的消息数据中的值。
//
//(*(unsigned long *) ucTXMsgData)++;

//

ucRXMsgData1[1]=ucRXMsgData[1];
RXCmsgData1[2]=ucRXMsgData[2];
RXCmsgData1[3]=ucRXMsgData[3];
RXCmsgData1[4]=ucRXMsgData[4];
RXCmsgData1[5]=ucRXMsgData[5];
ucRXMsgData1[6]=ucRXMsgData[6];
RXCmsgData1[7]=ucRXMsgData[7];
ucRXMsgData1[8]=ucRXMsgData[8];


IF (x!=ucRXMsgData1){

//
//打开LED
//

GPIO写入引脚(Blinky_LED_GPIO,0);

//
//延迟一段时间。
//

DELAY _US(1000*500);

//
//关闭LED
//

GPIO_WritePin (Blinky_LED_GPIO,1);

//
//延迟一段时间。
//

DELAY _US(1000*500);

//ASM (" ESTOP0");

}

否则{

ASM (" ESTOP0");

}

}

}

调试上述程序时,LED开始闪烁,不是在正确的逻辑上,而是在相反逻辑上。 从输出中可以看出,接收到的与预定义数据进行比较的数据丢失,因此程序输出将比较输出逻辑视为false。

因此,我请求您浏览我的源代码,并在相同的代码中提出任何修改建议,以获得准确的操作。

     提前感谢

此致

Sumanta

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我写这封信是为了告诉您,一位C2000小组成员已被指派担任此职位,应该很快就会回答。

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

    我建议使用for循环将黄金值与从那里接收的数据进行比较并进行调试。

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

    您好,Chris:

            LED闪烁与数据匹配的问题已经解决,但我在通过ADC引脚感应数据和在CAN RX端口接收相同数据方面遇到困难。 请提出同样的建议。

    此致

    Sumanta  

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

    很好的听到! 请参阅C2000Ware中的示例,以帮助更好地了解如何使用ADC。 如果您发现您有特定问题,请开始发布新帖子。 谢谢!

    此致
    Chris