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.8335万:2.8335万 CAN问题

Guru**** 2587365 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/659749/ccs-tms320f28335-28335-can-problem

部件号:TMS320F2.8335万

工具/软件:Code Composer Studio

2.8335万 CAN故障

    

我设计了一个带有2.8335万 CAN接口的板(称为测试板),其原理如上所示。 测试板的串行端口功能,指示灯和其他功能正常,仿真器与测试板的连接也正常。

测试板的Cana接口使用引脚GPIO18和GPIO19,CANB接口使用引脚GPIO12和GPIO13。我已将Cana +与CANB+连接,Cana-与CANB-连接,并且在我的CCS项目中有一个120Ω Ω 电阻器与Cana +和Cana-并联。 我将CANA设置为发送0X5555.5555万和0XAAAAAAAA,CANB以接收和发现异常,如下所述:

1、我买了一个2.8335万的开发板(也称为开发板),同一个CCS项目在开发板中正常运行,开发板的TXD波形显示在:下面

测试板和开发板的CANA和CANB接口引脚相同,但测试板的CAN接口异常,无法设置CANA的TA位。

2、我尝试过另一个GPIO,如GPIO30和GPIO31,CANB传输到CANA,执行相同的操作。TXD引脚的波形显示在:º 以下

3、我比较了测试板和开发板的区别,发现芯片屏不同,测试板芯片批号为G4A,开发板芯片批号为CA,如下所示:

所以我想知道为什么会发生这种情况?

// TI文件$Revision:/main/8 $//
签入$Date:2007年8月10日09:04:22 $//################################################################################

//文件名:Example_28xECAN_A_to_B_Xmit.c
//
//描述:eCAAN-A至eCAAN-B TXLOOP -传输循环
////
假设:
////
此程序需要DSP2833x头文件。
////
2833x DSP的两个CAN端口需要
相互连接//(通过CAN收发器)
////
eCANA位于GPIO19 (CANTXA)和
//上 GPIO18 (CANRXA)
//
// eCANB位于GPIO20 (CANTXB)和
//上 GPIO21 (CANRXB)
////
提供时,此项目配置为"引导至SARAM"
//操作。 2833x引导模式表如下所示。
//有关配置eZdsp引导模式的信息,
//请参阅eZdsp随附的文档,
////
$Boot_Table:////

GPIO87 GPIO86 GPIO85 GPIO84
// XA15. XA14. XA13. XA12
// PU PU PU PU
// ===================================================================
// 1. 1. 1. 1跳转至Flash
// 1. 1. 1. 0 SCI-A引导
// 1. 1. 0 1 SPI-A引导
// 1. 1. 0 0 I2C-A启动
// 1. 0 1. 1 eCAN-A启动
// 1. 0 1. 0 McBSPA-A引导
// 1. 0 0 1跳转至XINTF X16
// 1. 0 0 0跳转至XINTF x32
// 0 1. 1. 1跳转至OTP
// 0 1. 1. 0并行GPIO I/O引导
// 0 1. 0 1个并行XINTF启动
// 0 1. 0 0跳转至SARAM <-"boot to SARAM"
// 0 0 1. 1 Branch以检查引导模式
// 0 0 1. 0启动至闪存,绕过ADC校准
// 0 0 0 1引导至SARAM,绕过ADC校准
// 0 0 0 0引导至SCI-A,绕过ADC校准
// BOOT_Table_END$////

描述:
////
此示例使用MAILBOX5将数据传输到另一个CAN模块
//此程序可能永久循环或传输"n"次数,
//其中"n"是TXCOUNT值。
////
此示例可用于检查CAN-A和CAN-B 由于CAN-B
是//在DSP2833x_eCAN.c中初始化
的,因此它将确认运行此代码的节点传输的所有帧//。
// 2833x DSP的两个CAN端口都需要相互连接(通过CAN收发器)
////####################################################################################

//原始作者:HJ
////
$TI发行版:DSP2833x头文件1.10 $//
发行日期:2008年2月15日$//##############################################################################


#include "DSP2833x_Device.h" // DSP2833x Headerfile包括文件
#include "DSP2833x_examples.h"// DSP2833x示例包括文件

#define TXCOUNT 100 //传输发生时间(TXCOUNT)。
#define LED1 GpioDataRegs.GPATOGGLE.bit.GPIO4
#define LED2 GpioDataRegs.GPATOGGLE.bit.GPIO5
#define LED3 GpioDataRegs.GPATOGGLE.bit.GPIO6
#define LED4 GpioDataRegs.GPATOGGLE/Globals/

i,j;
长 loopcount =0;
volatile struct MBOX *Mailbox;
UINT32 ErrorCount;
UINT32 PassCount;
UINT32 MessageReceivedCount;

UINT32 TestMbox1 =0;
UINT32 TestMbox2 =0;
UINT32 TestMbox3 =0;


void mailbox_check(Int32 T1, Int32 T2, Int32 T2)
{
IF (T1 !=0x5555.5555万)||(T2 != 0xAAAAAAAA)||(T3 != 0x9555.5555万)
{
ErrorCount++;
}
否则
{
PassCount++;}

}


void main()
{/*

为CAN控制寄存器创建阴影寄存器结构。
这是必需的,因为只允许32位访问这些寄存器。 对
这些寄存器的16位访问可能会损坏寄存器内容。
这在写入位16 - 31 */

struct ECAN_regs ECanaShadow中的一个位(或一组位)时尤其如此;
struct ecan_regs ECanbShadow;
//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例功能可在DSP2833x_sysctrl.c文件中找到。
InitSysCtrl();

EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO4 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 0;
gpioCtrlRegs.GPADIR.bit.GPIO5 = 1;
gpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;
gpioCtrlRegs.GPADIR.bit.GPIO6 = 1;gpioCtrlRegs.GPAMUX1.bit.GPIO7
= 0;gpioCtrlRegs.bit.gipoir.GPIO7.bit
= 1.
EDIS;

//步骤2。 初始化GPIO:
//此示例函数可在DSP2833x_GPIO.c文件中找到,
//说明了如何将GPIO设置为其默认状态。
// InitGpio();//跳过此示例

//仅初始化此示例的eCAN引脚
//此函数位于DSP2833x_eCAN.c
InitECanGpio();//

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

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

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

//使用指向shell Interrupt
// Service routines (ISR)的指针初始化PIE矢量表。
//这将填充整个表,即使在此
示例中未使用中断//。 这对于调试非常有用。
// shell ISR例程可在DSP2833x_DefaultIsr.C.中找到
//此函数位于DSP2833x_PieVect.C.中
本

例中使用的InitPieVectorTable();//中断被重新映射到此
文件中找到的// ISR函数。

//本示例中未使用中断。

//步骤4. 初始化所有设备外设:
//此函数位于DSP2833x_InitPeripherals.c
// InitPeripherals()中;//此示例不需要

//在此示例中,仅初始化eCAN-A和eCAN-B
//此函数位于DSP2833x_eCAN.c
InitECan()中;
ErrorCount = 0;
PassCount = 0;
//步骤5. 用户特定代码:

/*写入MSGID字段*/

ECanaMboxes.MBOX10.MSGID.ALL = 0x9555555555;//扩展标识符

ECanbMboxes.MBOX10.MSGID.ALL = 0x95.5555万55555;//5.5555万//扩展标识
符/*将受测邮箱配置为传输邮箱*/

ECanaShadam.CAMD.CAN.CANBMD.ALL = E13.CANBMD.CAN.CAN.AID.CAN.AID.CAN.AID= E10.CAMBMD.CAN.AID.CAN.AID.CAN.AID.CAN.AID= E10.CAMBMD.CAMBMD.CAN.AID.CAN.AID.CAN.AID.CAN.AID.CAN.AID.CAN.AID= E10.CAMBMD.CAN.MD.=



E

ECanbRegs.CANMD.ALL = ECanbShade.CANMD.ALL;

/* Enable Mailbox under test */

ECanaShade.CANME.ALL = ECanaRegs.CANME.ALL;
ECanaShade.CANME.ME.ME10 = 1;
ECanaRegs.CANBME.ALL = ECanbadme.CAN.ALL

= Ebme.CAN.CANBME.CANBME.ALL =

ECanbRegs.CANMe.ALL = ECanbShade.CANMe.ALL;

/*写入主控区中的DLC字段*/

ECanaMboxes.MBOX10.MSGCTRL.bit.DLC = 8;

/*写入邮箱RAM字段*/

ECanaMboxs.MBO10.MDL.All = 0xM55MAX.MAX.MAX.XMAX.MAX.XMAX.XMAX.55=




全部邮


箱方框= XMAX.X55MMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMAX.XMA

/*开始传输*/


用于(I=0;I < TXCOUNT;I++)
{

ECanaShadow.CANTRS.ALL = 0;
ECanaShadow.CANTRS.bit.TRS10 = 1; //为正在测试的邮箱设置TRS
ECanaRegs.CANTRS.ALL = ECanaShade.CANTRS.ALL;

做
{
ECanaShade.Canta.All = ECanaRegs.Canta.All;
} while (ECanaShade.Canta.bit.TA10 ==0);//等待设置TA5位。//如果线没有连接,如果线连接错误


ECanaShadow.Canta.all = 0;
ECanaShade.Canta.bit.TA10 = 1; //清除TA5
ECanaRegs.Canta.all = ECanaShade.Canta.all;

邮箱=&ECanbMcboxes.MBOX0 + 25;// CANB读数据
TestMbox1 =邮箱->MDL.ALL;//= 0x (n是MBX编号)
TestMbox2 =邮箱->MDH.ALL;//= 0x (常量)
TestMbox3 =邮箱->MSGID.ALL;//= 0x (n是MBX编号)
mailbox_check (TestMbox1,TestMbox2,TestMbox3);//检查接收到的数据





loopcount ++;
}
IF (ErrorCount == 0)
{
ASM (" ESTOP0");//确定,数据校验正确
}
否则
{
ASM (" ESTOP0");//错误,
}


//ASM (" ESTOP0");//停止此处
} 

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

    您好,

               请从TI网站下载我的app.note SPRA876B,并浏览标题为“调试核对表”的部分。 事实上,示例中的app.note是在F2.8335万设备上开发的,您应该能够从该app.note“按现在的方式”运行任何示例。

     

    由于您的项目在"开发板"上运行良好,因此可以合理地假定这是"测试板"中的硬件问题。 您是否对两块板的原理图进行了比较? 我假设测试板具有隔离(ADUM1201),而开发板则没有隔离。

     

    在"测试板"中,您谈论的是Cana+和Cana-之间的120欧姆电阻器。 CANB+和CANB-之间的电阻器如何? 请记住,总线两端都需要端接。

     

    未设置TA位表明两个CAN端口之间的硬件连接不好。

     

    "芯片屏幕"(或包装符号化)与您的问题无关。 两个设备功能相同。

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

    感谢您的回复,我终于离开了,CANH\CANL和GND之间有多余的电容,这导致了问题的发生。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴您的问题得到解决,但您能否进一步解释? 这种"多余电容"的确切来源是什么?您是如何消除它的?