CY7C68013 + MT9M001 做USB摄像头,调试了1个星期,
现在问题是上位机启动同步传输下位机没有数据返回,已经测试过用批量传输可以接收到960字节的摄像头数据。代码如下:
上位机
初始化代码:
bool bIn = this->m_pUSBDevice->EndPoints[i]->bIn;
bool bBulk = (this->m_pUSBDevice->EndPoints[i]->Attributes == 1);
if (bBulk && bIn)
{
this->m_pInEndpt = (CCyIsocEndPoint *) m_pUSBDevice->EndPoints[i];
printf("Find end point EndAddr=0x%x\n",m_pInEndpt->Address);
}
启动同步IN端点的传输:这里用BeginDataXfer(buf, len, &inOvLap)方法也试过,没有用
CCyIsoPktInfo *isoPktInfos;
int pkts;
// Allocate the IsoPktInfo objects, and find-out how many were allocated
isoPktInfos = this->m_pInEndpt->CreatePktInfos(len, pkts);
printf("iso pkts:%d\n",pkts);
LONG recvdBytes = 0;
m_pInEndpt->TimeOut = 10000;
this->m_pInEndpt->SetXferSize( len );
if (this->m_pInEndpt->XferData(buf, len, isoPktInfos)) {
//这里返回成功,但是len长度为0
for (int i=0; i<pkts; i++)
if (isoPktInfos[i].Status == 0)
recvdBytes += isoPktInfos[i].Length;
}
delete [] isoPktInfos;
return recvdBytes;
下位机代码:
端点描述符:
;; Endpoint Descriptor
db DSCR_ENDPNT_LEN ;; Descriptor length
db DSCR_ENDPNT ;; Descriptor type
db 82H ;; Endpoint number, and direction
db ET_ISO ;; BITS[0:1]=1;BITS[2:3]=00;BITS[45:]=0
db 00H ;; Maximun packet size (LSB)
db 04H ;; Max packect size (MSB)
db 01H ;; Polling interval 125us轮询一次
上下位机同步:
发送命令等待1个数据包更新
//等待第1帧数据包
debugCnt = (WORD)(EP2CS & 0x70)>>4;
IOA |= 0x08; //PA3 低电平
SYNCDELAY;
IOA &= ~0x08; //PA3 低电平
while(!(WORD)(EP2CS & 0x70)>>4);//等待数据包更新
初始化代码:
CPUCS=((CPUCS & ~bmCLKSPD) | bmCLKSPD1 | bmCLKOE); //USB时钟频率48M,时钟输出使能
IFCONFIG = bmIFCLKPOL|bmIFCFG1|bmIFCFG0; //FIFO时钟外部提供 IFCLK时钟取反 同步模式 选择slavefifo模式
//端点配置
SYNCDELAY;
// EP2CFG=0xE8; //EP2 输入 BULK 4个缓冲区 单个1024字节
// EP2CFG=0xEA; //EP2 输入 BULK 2个缓冲区 单个1024字节
EP2CFG=0xD8; //EP2 输入 ISO 4个缓冲区 单个1024字节
SYNCDELAY;
EP4CFG=0x00;
SYNCDELAY;
EP6CFG=0x00;
SYNCDELAY;
EP8CFG=0x00;
SYNCDELAY;
EP2ISOINPKTS = 0x03; //同步传输中每125us可以发送数据包个数
//arm 端点4个缓冲区需要写入4次
// SYNCDELAY;
// EP2BCL = 0x80; // arm EP6OUT by writing bytecount w/skip.
// SYNCDELAY;
// EP2BCL = 0x80; // arm EP6OUT by writing bytecount w/skip.
// SYNCDELAY;
// EP2BCL = 0x80; // arm EP6OUT by writing bytecount w/skip.
// SYNCDELAY;
// EP2BCL = 0x80; // arm EP6OUT by writing bytecount w/skip.
//复位端口2 FIFO
SYNCDELAY;
FIFORESET=0x80;
SYNCDELAY;
FIFORESET=0x02;
SYNCDELAY;
FIFORESET=0x00;
//slave FIFO配置
SYNCDELAY;
REVCTL = 0x03;
SYNCDELAY;
FIFOPINPOLAR=0x3C; //SLOE 高电平有效,SLWR高电平有效
SYNCDELAY;
EP2FIFOCFG=0x0C; //AUTOIN=1 ZEROLEN=1 8位数据宽度
SYNCDELAY;
EP2AUTOINLENH = MSB(PACK_LEN); //配置端点2FIFO自动传输长度
SYNCDELAY;
EP2AUTOINLENL = LSB(PACK_LEN);
备注:PACK_LEN = 1024
端点缓冲区长度也配置为1024
希望大神能指点下,问题出在哪里,往那个方向走,拜谢