FX2 开发USB摄像头同步传输问题
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
希望大神能指点下,问题出在哪里,往那个方向走,拜谢

上位机
初始化代码:
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
希望大神能指点下,问题出在哪里,往那个方向走,拜谢


...全文
相关推荐
基于 USB2.0 协议的高分辨率数字摄像头
##### 3.2 EZ-USB FX2控制器特点EZ-USB FX2(CY7C68013)是由Cypress公司设计的一款专为高速传输外设而开发的USB2.0控制芯片。
EZ-USBFX2.rar_ez usb _ez-usb_ez-usb fx2
**开发过程**开发基于EZ-USB FX2的USB设备通常涉及以下步骤:1. **硬件设计**: 根据应用需求,设计电路板,连接EZ-USB FX2与其他外设。2.
cy3684_ez_usb_fx2lp_development_kit_15.rar
这款芯片广泛应用于各种USB设备,如打印机、摄像头、音频设备、医疗设备等。2. **USB 固件开发**:开发套件中的固件涵盖了USB协议栈,包括设备描述符、配置、接口、端点等。
Cypress EZ-USB® FX3 Application
**FX3的应用场景**: - **影像处理**:FX3可以处理来自摄像头或其他视频源的数据流,实现实时编码和传输。
Cypress fx3入门资料
通过阅读EZ-USB®Fx3TM入门AN75705文档,开发者可以了解到USB3.0的概述,包括USB3.0的电气接口、线缆与连接器,以及USB3.0与USB2.0的区别等信息。


驱动开发/核心开发
