最近一直在弄dsp和usb,68013数据传输模式是异步slave fifo的模式,现在把我的设计思路说明一下
1.开发板是DM648的dsp开发板,集成了68013和56引脚的cpld,既然采用的的是异步slave fifo的bulk传输模式,控制引脚就需要有EWE\ERE读写信号,SLOE输出使能信号,PKTEND短数据包结束信号,SLCS片选信号,fifo_adr0/fifo_adr1地址信号,还有FLAGA/B/C fifo空满标志信号。其中sloe输出使能信号由clpd来控制它的逻辑,其他的信号由dsp来控制它的逻辑。
2.其中一个问题,开发板是清华设计的开发板,dsp内部集成了读写信号(换句话说,就是读写信号我无法控制),其中assign EWEN = ASDWEN; //write enable 这就是写信号的产生,也就是由dsp的ASDWEN引脚来控制(内部集成好的);读信号assign EREN = AOEN; //both R_WN and #AOE act low 读信号由AOEN引脚控制
3.固件程序中采用端点2为OUT端点,端点6为IN,AUTOIN和AUTOOUT方式。BULK传输模式,其中端点6为4*512缓冲。
4.pc机上用Cypress带的CYconSole软件来发送和接受数据,当pc机给usb发送数据时(也就是在dsp端接受),数据接受一切正常,发送什么接受什么。当我dsp给pc机发送时,问题是比如我发送01 02 03 那么接受到的数据就是01 00 00 00 02 00 00 00 03 00 00 00;首先确定了不是因为字节序的问题。
dsp上程序是
void Dsp_PC(char* buf,int len)
{
int i=0;
int pin_ADR0=16;
int pin_ADR1=17;
int pin_FLAGB=19;
int pin_PKTEND=21;
if(0==GPIO_Input_Read(pin_FLAGB)) //读取端点是否满,为0时,端点已满,不可再写操作
{
while(1)
{
if(1==GPIO_Input_Read(pin_FLAGB))
{
break;
}
}
}
if(1==GPIO_Input_Read(pin_FLAGB)) // 不满,可以写数据
{
GPIO_Output_Config(pin_ADR1,1); //这是给FIFO_ADR[1:0]赋值10
GPIO_Output_Config(pin_ADR0,0);
GPIO_Output_Config(pin_PKTEND,1);//给PKTEND引脚写1
for(i=0;i<len;i++)
{
*(unsigned int*)USB_68013CS=buf[i];//USB_68013CS是求得的usb2.0在我开发板上的地址
uDelayuS(7);
}
GPIO_Output_Config(pin_PKTEND,0);//发送完数据后,PKTEND引脚电平跳变
GPIO_Output_Config(pin_PKTEND,1);
}
return ;
}
5.这个问题一直无法解决,相同的pc机给dsp发送数据时,跟dsp给pc机发送采用的程序几乎一样,但是写操作时数据中间就夹杂三个00 如果我发送10个数据,那么我用示波器检测写信号时发生了10次的高低跳变,也没问题,但是我测试时,我在*(unsigned int*)USB_68013CS=buf[i];这句话前后给写引脚EWE分别写0 写1,给他跳变,那么就没有00 ,接受就很正常。
请教各位,谁有这块的经验,至于我的固件程序,我让cypress公司的技术支持看过,他们说没有问题。
如果我想在dsp板上给写信号写0和写1,那么我就得改版开发板。这不合乎我的初衷,现在我怀疑的就是对于异步slave fifo这种模式的写时序我控制达不到人家的要求
|