- 最近一年都在做这个课题,有人用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;
}