TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28335: can初始化时卡死,一直在等待ECanaShadow.CANES.bit.CCE位被置位

Part Number:TMS320F28335

void InitECana(void)
{Uint16 i;//// Create a shadow register structure for the CAN control registers. This// is needed, since only 32-bit access is allowed to these registers.// 16-bit access to these registers could potentially corrupt the register// contents or return false data. This is especially true while writing// to/reading from a bit (or group of bits) among bits 16 - 31//struct ECAN_REGS ECanaShadow;EALLOW;		// EALLOW enables access to protected bitsSysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1;//// Configure eCAN RX and TX pins for CAN operation using eCAN regs//ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;ECanaShadow.CANTIOC.bit.TXFUNC = 1;ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;ECanaShadow.CANRIOC.bit.RXFUNC = 1;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 = ECanaRegs.CANMC.all;ECanaShadow.CANMC.bit.SCB = 1;ECanaRegs.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//for(i=0;i<32;i++){ECanaMboxes.MBOXn[i].MSGCTRL.all = 0x00000000;}//// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again// as a matter of precaution.//ECanaRegs.CANTA.all	= 0xFFFFFFFF;// Clear all TAn bitsECanaRegs.CANRMP.all = 0xFFFFFFFF;// Clear all RMPn bitsECanaRegs.CANGIF0.all = 0xFFFFFFFF;// Clear all interrupt flag bitsECanaRegs.CANGIF1.all = 0xFFFFFFFF;//// Configure bit timing parameters for eCANA//ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;ECanaShadow.CANMC.bit.CCR = 1 ;// Set CCR = 1ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;ECanaShadow.CANES.all = ECanaRegs.CANES.all;do{ECanaShadow.CANES.all = ECanaRegs.CANES.all;} while(ECanaShadow.CANES.bit.CCE != 1 );  	// Wait for CCE bit to be setECanaShadow.CANBTC.all = 0;ECanaShadow.CANBTC.bit.BRPREG =15;// 60/15+1 = 3.75MhzECanaShadow.CANBTC.bit.SJWREG =2;//ECanaShadow.CANBTC.bit.TSEG2REG = 2;// 3.75/(10+2+3) = 250Khz,采样率80%ECanaShadow.CANBTC.bit.TSEG1REG = 10;ECanaShadow.CANBTC.bit.SAM = 1;ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;ECanaShadow.CANMC.bit.CCR = 0 ;// Set CCR = 0ECanaShadow.CANMC.bit.PDR = 0 ;			// 正常模式,不允许低功耗
	ECanaShadow.CANMC.bit.DBO = 1 ;			// 8字节数据顺序1:byte1,byte0,byte3,byte2,byte5,byte4,byte7,byte6
											//0:byte2,byte3,byte0,byte1,byte6,byte7,byte4,byte5
	ECanaShadow.CANMC.bit.WUBA =0 ;// 0:向PDR写0,离开低功耗,1:检测总线状态离开低功耗
	ECanaShadow.CANMC.bit.CDR = 0 ;			// 改变数据域请求
	ECanaShadow.CANMC.bit.ABO = 1 ;			// 自动连接总线位
	ECanaShadow.CANMC.bit.STM = 0 ;			// 1:环回自测模式,0:正常模式
	ECanaShadow.CANMC.bit.SRES = 0;			// 1:复位,0:无效
	ECanaShadow.CANMC.bit.MBNR = 0;			// Mailbox numberECanaRegs.CANMC.all = ECanaShadow.CANMC.all;for(i=0;i<32;i++)
	{
		ECanaMboxes.MBOXn[i].MSGCTRL.bit.TPL = 32-i;	//数据越大,邮箱优先级越高,优先发送
		ECanaMboxes.MBOXn[i].MSGCTRL.bit.RTR = 0;	// 远程发送请求,0:没有远程帧
		ECanaMboxes.MBOXn[i].MSGCTRL.bit.DLC = 8;	// 全部按8个字节长度,
	}do{ECanaShadow.CANES.all = ECanaRegs.CANES.all;} while(ECanaShadow.CANES.bit.CCE != 0 );// Wait for CCE bit to be  cleared//// Disable all Mailboxes//ECanaRegs.CANME.all = 0;		// Required before writing the MSGIDsEDIS;
}

现象:程序在运行时会卡死在上述代码的69行的while(ECanaShadow.CANES.bit.CCE != 1 );等待该标志位置位,程序将不会往下执行,重新刷写程序并在仿真状态能够通过while循环,并正常运行。

代码结构:在此正式程序之前会有bootloader程序(自己创建的),在bootloader程序中已经执行过can初始化,在APP程序再次执行中会卡死在69行位置。

问题:1、can初始化是否只能执行一次?

           2、该问题是否有相应的解决方式?

Yale Li:

检查一下ECanaRegs.CANES中相应位的值

,

user6032433:

谢谢回答,ECanaRegs.CANES.bit.SA1位被置位,这个现象有可能是硬件引起的,相同的程序在不同的硬件基板上有的可以通过,有的无法通过。

我的疑问是1、为什么在bootloader中的CAN初始化可以通过,但在app程序就无法通过这个循环。(bootloader程序放在sectorA和sectorB中,app程序放在sectorC及之后的flash块中)

2、can在第一次初始化后,后面就不能再重新初始化了吗?

,

Yale Li:

程序卡死在第69行的 do while循环判断 那里,也就是说 CANES.CCE 位不能被置位。在TRM中有相关描述,请查看sprui07_TMS320x2833x, TMS320x2823x Technical Reference Manual第815页:

一旦 CCE 位被清零(作为模块初始化的一部分),CANRX 引脚必须被检测为高电平之后,才能再次将 CCE 位设置为 1。

,

user6032433:

也就是说如果CANRX引脚一值被拉低程序就永远不可能运行下去,在外围电路中CANRX引脚需要上拉,那么如果配置这个引脚cpu内部上拉有用吗?

,

Yale Li:

user6032433 said:也就是说如果CANRX引脚一值被拉低程序就永远不可能运行下去,

是的,

user6032433 said:配置这个引脚cpu内部上拉有用吗?

可以使用内部上拉。

,

user6032433:

问题解决,感谢回答。

,

Yale Li:

客气了~问题解决就好

赞(2)
未经允许不得转载:TI中文支持网 » TMS320F28335: can初始化时卡死,一直在等待ECanaShadow.CANES.bit.CCE位被置位
分享到: 更多 (0)