FX2 开发USB摄像头同步传输问题

hceng 2018-09-22 01:39:23
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


希望大神能指点下,问题出在哪里,往那个方向走,拜谢
...全文
271 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧