天天看点

基于DSP28335的EtherCAT从站系统配置困扰难题

  • 最近一年都在做这个课题,有人用STM32做过从站,我想拿DSP来做EtherCAT从站,遇到很多个难题。解决了很多,但是还是有一个问题很棘手。
  • DSP的存储机制是16位的,也就是说,在这里定义一个char类型变量,它占16位,而不是8位。这一点让人很困恼。因为从站芯片,无论是ET1100,还是AX58100,都是8位的。我尝试用XINTF接口代替STM32的FSMC接口。
do
    {
        intMask = 0x0093;
        HW_EscWriteWord(&intMask, ESC_AL_EVENTMASK_OFFSET);
        intMask = 0;
		HW_EscReadWord(&intMask, ESC_AL_EVENTMASK_OFFSET);
    }while(intMask != 0x0093);// PDI接口测试
           
  • 因为XINTF只支持16位和32位,所以我用16位的模式,AX58100采样16位异步总线的模式,写一个2字节数0x0093进去,读出来的结果是0x9393。
//初始化XINTF
void InitXintf(void)
{
	EALLOW;

	SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;     // XTIMCLK

	XintfRegs.XINTCNF2.bit.XTIMCLK = 1;//此位等于1,则设置XTIMCLK=1/2 SYSCLKOUT
	                                                                    //即:XTIMCLK=150/2=75MHz
	XintfRegs.XINTCNF2.bit.WRBUFF = 0;//此为“写缓冲器深度控制位”,设置为0,
	                                                                   //则无写缓冲器,即默认状态
	XintfRegs.XINTCNF2.bit.CLKOFF = 1;//禁止XCLKOUT输出

	XintfRegs.XINTCNF2.bit.CLKMODE = 1;//设置XCLKOUT=1/2 XTIMCLK
	                                                            //即:XCLKOUT=75/2=37.5MHz
/***********************************Zone6*****************************/
			//当使用ready信号,ACTIVE必须大于或等于1,Lead必须大于或等于1
			//配置写操作时序
			XintfRegs.XTIMING6.bit.XWRLEAD = 3;
			XintfRegs.XTIMING6.bit.XWRACTIVE = 7;
			XintfRegs.XTIMING6.bit.XWRTRAIL = 1;
			//配置读操作时序
			XintfRegs.XTIMING6.bit.XRDLEAD = 3;
			XintfRegs.XTIMING6.bit.XRDACTIVE = 7;
			XintfRegs.XTIMING6.bit.XRDTRAIL = 1;
			XintfRegs.XTIMING6.bit.X2TIMING = 1;
			//采样XREADY信号
			XintfRegs.XTIMING6.bit.USEREADY = 0 ;//不使用XREADY
			XintfRegs.XTIMING6.bit.READYMODE = 0;
			//配置数据总线宽度16位
			XintfRegs.XTIMING6.bit.XSIZE = 3;
	EDIS;
	InitXintf16Gpio();
	DELAY_US(5);
}
void InitXintf16Gpio(void)
{
	EALLOW;
	//GPIO一共88个引脚。GPIOA:0-31;GPIOB:32-63;GPIOC:64-87
	//对于GPIOC   64-79   GPCMUX1 只有两种选择,00或01:通用GPIO功能;10或11:XD15~XD0
	GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 3;       //XD15
	GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 3;
	GpioCtrlRegs.GPCMUX1.bit.GPIO66 = 3;
	GpioCtrlRegs.GPCMUX1.bit.GPIO67 = 3;
	GpioCtrlRegs.GPCMUX1.bit.GPIO68 = 3;
	GpioCtrlRegs.GPCMUX1.bit.GPIO69 = 3;
	GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 3;
	GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 3;
	GpioCtrlRegs.GPCMUX1.bit.GPIO72 = 3;
	GpioCtrlRegs.GPCMUX1.bit.GPIO73 = 3;
	GpioCtrlRegs.GPCMUX1.bit.GPIO74 = 3;
	GpioCtrlRegs.GPCMUX1.bit.GPIO75 = 3;
	GpioCtrlRegs.GPCMUX1.bit.GPIO76 = 3;
	GpioCtrlRegs.GPCMUX1.bit.GPIO77 = 3;
	GpioCtrlRegs.GPCMUX1.bit.GPIO78 = 3;
	GpioCtrlRegs.GPCMUX1.bit.GPIO79 = 3;       //XD0
	//GPIOB 40~47   GPBMUX1 只有两种选择,00:通用GPIO功能;10或11:XA0~XA7
	GpioCtrlRegs.GPBMUX1.bit.GPIO40 = 3;       //XA0
	GpioCtrlRegs.GPBMUX1.bit.GPIO41 = 3;
	GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 3;
	GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 3;
	GpioCtrlRegs.GPBMUX1.bit.GPIO44 = 3;
	GpioCtrlRegs.GPBMUX1.bit.GPIO45 = 3;
	GpioCtrlRegs.GPBMUX1.bit.GPIO46 = 3;
	GpioCtrlRegs.GPBMUX1.bit.GPIO47 = 3;      //XA7
	//对于GPIOC   80-87   GPCMUX2 只有两种选择,00或01:通用GPIO功能;10或11:XA8~XA15
	GpioCtrlRegs.GPCMUX2.bit.GPIO80 = 3;      //XA8
	GpioCtrlRegs.GPCMUX2.bit.GPIO81 = 3;
	GpioCtrlRegs.GPCMUX2.bit.GPIO82 = 3;
	GpioCtrlRegs.GPCMUX2.bit.GPIO83 = 3;
	GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 3;
	GpioCtrlRegs.GPCMUX2.bit.GPIO85 = 3;      //XA13
//	GpioCtrlRegs.GPCMUX2.bit.GPIO86 = 3;
//	GpioCtrlRegs.GPCMUX2.bit.GPIO87 = 3;      //XA15
	//对于GPIOB  39   GPBMUX1 只有两种选择,00:通用GPIO功能;10或11:XA16
//	GpioCtrlRegs.GPBMUX1.bit.GPIO39 = 3;      //XA16
	//对于GPIOA  31~29   GPBMUX2 只有两种选择,00:通用GPIO功能;10或11:XA17~XA19
//	GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 3;      //XA17
//	GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 3;      //XA18
//	GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 3;      //XA19
	//对于GPIOB 34
//	GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 3;       //XREADY
	GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 3;       //XRNW
	GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 3;       //XWE0
//	GpioCtrlRegs.GPBMUX1.bit.GPIO36 = 3;       //XZCS0
//	GpioCtrlRegs.GPBMUX1.bit.GPIO37 = 3;       //XZCS7
	GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 3;       //XZCS6
	EDIS;
}
           
  • XINTF仍然16位的模式,AX58100采用8位异步总线模式。把DSP的数据线只接低八位,地址线全部接。这样的话,拿DSP的16位模拟8位传输,写的时候把高八位和第八位分开存放在两个变量里,分两次写到AX58100;读的时候,连续读两次,先读到的是低八位,把两个八位组合成一个16位数。这样的话,原理上行得通。而且写进去0x0093,读出来的也是0x0093。但我读其他地址的时候,结果都是0,很明显这样也不行。问题在哪,不知道……心急啊!
  • 大家如果有建议,可以留言,如果您做过,或者有办法,我可以支付费用请教。谢谢!
     
     另外,等我把它弄出来,给大家发博文讲讲这个事。现在尝试用SPI总线试试,因为DSP的SPI支持16位或者其他位,我试试8位。DSP用的人不多,不如STM32普遍,所以想找个人问问也难啊。
               

继续阅读