工具/软件: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");//停止此处
}



