Other Parts Discussed in Thread:C2000WARE
调试CAN通讯时一直显示发送不成功(邮箱忙),用示波器测试CANTXA、CANRXA引脚波形后发现CANTXA引脚高低电平波形正常,CANRXA引脚高电平为3.3V,低电平为2V(因此DSP芯片检测到的CANRXA信号一直为高电平,这也是导致通讯一直发送失败的原因)。部分原理图以及波形如下:,调试过程中,我将CANTXA与CANRXA信号经过74HC367缓冲器进行电平转换后再接入到DSP芯片。
此图为SN65HVD230DR芯片4脚波形(缓冲器前端,电压正常,高电平为5V,低电平为0V)。
此图为缓冲器后端波形也就是DSP28034芯片GPIO30脚波形(此处波形电压异常,高电平为3.3V,低电平为2V)。
为了查找电压异常原因,我将DSP芯片GPIO30脚与367缓冲器之间断开连接,此时测量缓冲器后端波形发现电压又重新恢复正常(低电平为0V),由此判断,此处电压异常与DSP芯片有关。
部分初始化程序代码如下:
#define IINIT_CAN_TIME 3
Uint16 InitdspECan(Uint16 baud) // Initialize eCAN-A module
{
struct ECAN_REGS ECanaShadow; // 声明一个影子寄存器,某些寄存器只能使用32位操作
Uint32 *MsgCtrlPi; // 初始化引用指针
Uint16 i; // 循环变量
static Uint16 con = 0;
static Uint16 count = 0; // 超时计数器
if (baud >= CAN_BAUD_SUM)
return CAN_INIT_BAUD_ERR; // 波特率出错
if (count > IINIT_CAN_TIME) // 初始化超时出错
return CAN_INIT_TIMEOUT;
EALLOW;
if (con == 0)
{
GpioCtrlRegs.GPAPUD.bit.GPIO30 = 0; // Enable pull-up for GPIO30 (CANRXA)
GpioCtrlRegs.GPAPUD.bit.GPIO31 = 0; // Enable pull-up for GPIO31 (CANTXA)
/* Set qualification for selected CAN pins to asynch only */
// Inputs are synchronized to SYSCLKOUT by default.
// This will select asynch (no qualification) for the selected pins.
GpioCtrlRegs.GPAQSEL2.bit.GPIO30 = 3; // Asynch qual for GPIO30 (CANRXA)
/* Configure eCAN-A pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be eCAN functional pins.
GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 1; // Configure GPIO30 for CANTXA operation
GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 1; // Configure GPIO31 for CANRXA operation
/* Configure eCAN RX and TX pins for eCAN transmissions using eCAN regs*/
// ECANREGS.CANTIOC.bit.TXFUNC = 1;
// ECANREGS.CANRIOC.bit.RXFUNC = 1;
/* Configure eCAN RX and TX pins for CAN operation using eCAN regs*/
ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
ECanaShadow.CANTIOC.bit.TXFUNC = 1;//CANTX引脚用于CAN发送功能
ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;
ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
ECanaShadow.CANRIOC.bit.RXFUNC = 1;//CANRX引脚用于CAN接收功能
ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
/* Configure eCAN for HECC mode – (reqd to access mailboxes 16 thru 31) */
// HECC mode also enables time-stamping feature
ECanaShadow.CANMC.all = 0;
ECanaShadow.CANMC.bit.SRES = 1;
ECANREGS.CANMC.all = ECanaShadow.CANMC.all; // 软件复位CAN模块
ECanaShadow.CANMC.all = ECANREGS.CANMC.all; // 读取CAN主控制寄存器
ECanaShadow.CANMC.bit.SCB = 1; // eCAN模式
ECanaShadow.CANMC.bit.SUSP = 1; // 外设不受调试影响
// ECanaShadow.CANMC.bit.DBO = 1; // 首先 最低有效位 高字节在前
ECanaShadow.CANMC.bit.CCR = 1; // CPU请求修改波特率或全局屏蔽寄存器
ECanaShadow.CANMC.bit.ABO = 1; // 自动恢复总线使能
ECANREGS.CANMC.all = ECanaShadow.CANMC.all; // 回写控制寄存器
/* Initialize all bits of 'Master Control Field' to zero */
// Some bits of MSGCTRL register come up in an unknown state. For proper operation,
// all bits (including reserved bits) of MSGCTRL must be initialized to zero
MsgCtrlPi = (Uint32 *)(&ECANMBOXES.MBOX0.MSGCTRL); // 消息控制器指针
for (i=0; i<32; i++)
{
MsgCtrlPi[i<<2] = 0x00000000; // 清零所有消息控制寄存器
}
MsgCtrlPi = (Uint32 *)(&ECANLAMS.LAM0); // 息控制器指针
for (i=0; i<32; i++) // 清空所有屏蔽寄存器
{
MsgCtrlPi[i] = 0x00000000; //
}
/*
ECanaMboxes.MBOX0.MSGCTRL.all = 0x00000000;
……….
ECanaMboxes.MBOX31.MSGCTRL.all = 0x00000000;
*/
// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
// as a matter of precaution.
ECANREGS.CANTRR.all = 0xFFFFFFFF; // 复位发送请求,取消正在进行的发送
ECANREGS.CANTA.all = 0xFFFFFFFF; // 清零发送响应寄存器/* Clear all TAn bits */
ECANREGS.CANRMP.all = 0xFFFFFFFF; // 接收消息挂起寄存器/* Clear all RMPn bits */
ECANREGS.CANGIF0.all = 0xFFFFFFFF; // 全局中断标志/* Clear all interrupt flag bits */
ECANREGS.CANGIF1.all = 0xFFFFFFFF;
ECANREGS.CANOPC.all = 0; // 所有邮箱可被覆盖
/* Configure bit timing parameters for eCANA
ECanaShadow.CANMC.all = ECANREGS.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 1 ; // CPU请求修改波特率或全局屏蔽寄存器
ECANREGS.CANMC.all = ECanaShadow.CANMC.all;
*/
con = 1; // 第一阶段完成
}
if (con == 1)
{
ECanaShadow.CANES.all = ECANREGS.CANES.all;
if (ECanaShadow.CANES.bit.CCE != 1 ) // Wait for CCE bit to be set..
{
count++;
EDIS;
return CAN_INIT_TIME; // 初始化进行中
}
else
con = 2;
}
if (con == 2)
{
ECanaShadow.CANBTC.all = 0; // 初始化波特率
ECanaShadow.CANBTC.bit.BRPREG = eCanBaud[baud].BRPREG;
ECanaShadow.CANBTC.bit.TSEG2REG = eCanBaud[baud].TSEG2REG;
ECanaShadow.CANBTC.bit.TSEG1REG = eCanBaud[baud].TSEG1REG;
ECanaShadow.CANBTC.bit.SAM = 0;
ECANREGS.CANBTC.all = ECanaShadow.CANBTC.all;
ECanaShadow.CANMC.all = ECANREGS.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 0 ; // 波特率设置完成 Set CCR = 0
ECANREGS.CANMC.all = ECanaShadow.CANMC.all;
con = 3;
}
if (con == 3)
{
ECanaShadow.CANES.all = ECANREGS.CANES.all;
if (ECanaShadow.CANES.bit.CCE != 0 ) // Wait for CCE bit to be cleared..
{
count++;
EDIS;
return CAN_INIT_TIME;
}
}
/* Disable all Mailboxes */
con = 0;
count = 0;
ECANREGS.CANME.all = 0; // Required before writing the MSGIDs
EDIS;
eCanTranEnFlag = 0; // 清空邮箱初始化标志
eCanReEnFlag = 0;
return CAN_INIT_SUCC; // 初始化成功
}
此外,这几天查看相关帖子时,一些帖子提到的CANH与CANL之间的负载电阻、以及在GPIO30口串接小电阻来避免灌电流等方法我都试过,并没有解决问题。
望大佬帮忙看下这个是什么原因导致的,比较着急。感谢感谢!
Green Deng:
你好,TI官方有提供eCAN通讯的例程,你有没有用例程测试过eCANRX引脚是否收发正常?
C:\ti\c2000\C2000Ware_3_04_00_00\device_support\f2803x\examples\c28\ecan_back2back
,
user4077200:
你好,我今天升级了CCS,试了一下你说的这个例程。工作在自测模式下时,是能正常收发数据的,芯片引脚测量不到波形。 后来在例程中将其改成普通模式后,用示波器抓了一下CANRXA脚与CANTXA脚波形,发现TX脚电平正常,RX脚的低电平还是不对,不是0V而是2V左右。请问这个还有可能是什么原因?考虑到74HC367的工作电压是5V,可能是电平不匹配,我将芯片换成了74LVC14。将SN65HVD230DR芯片4脚信号经过两次反向接到DSP芯片。测试结果低电平比原来稍微降了一些,降到了大约1.6V左右。但是这个不能解决问题,eCAN通讯还是不能正常工作。