阅读:1754回复:5
使用CMOS Sensor开发过usb应用的请进
希望和各位大虾讨论
QQ:149715860 Email:liukunlong@163.com |
|
最新喜欢:![]() |
沙发#
发布于:2004-11-03 12:08
本人应用方案(usb2.0摄像头):
Hynix 7131GP Sensor(VGA),usb主ic使用68013,GPIF工作模式,(sensor)vclk连接(68013)IFCLK(24Mhz),vsync(场频)连接Int0和Rdy0,hsync(行频)连接Rdy1,GPIF在VSync、Hsync同时有效时采集数据,在VSync下降沿时触发中断,负责帧处理。 现遇到问题无法读取一帧(VGA:640×480,YUV422)完整的数据: 1、Firmware怎样处理帧起始位? 2、应用程序要怎样处理才能读出完整的图像帧?现在的表现为只能读到部分数据。 接下来我会将firmware部分代码贴出来,供大家讨论。 |
|
板凳#
发布于:2004-11-03 13:14
端点配置为:
SYNCDELAY; // EP6CFG = 0xE0; // EP6 512 BULK AutoIN 4x SYNCDELAY; EP6AUTOINLENH = 0x02; //ep6 auto commit length 512 SYNCDELAY; EP6AUTOINLENL = 0x00; 数据采集过程: void TD_Poll(void) // Called repeatedly while the device is idle { if (EP68FIFOFLGS & 0x02) // if EP6 FIFO is empty { //重新配置EP6为Auto IN if (EP6FIFOCFG == 0x00) { SYNCDELAY; EP6FIFOCFG = 0x08;//AUTO IN 8-BIT BUS SYNCDELAY; EP6AUTOINLENH = 0x02; //ep6 auto commit length 512 SYNCDELAY; EP6AUTOINLENL = 0x00; SYNCDELAY; } //read a frmae bytes data from GPIF Peripheral_SetEP6GPIFTC(FRAME_TOTAL); Peripheral_FIFORead(2); } } VSync中断处理: static WORD xFIFOBC_IN = 0x0000; void Vsync_isr(void) interrupt INT0_VECT { /*强制发送长度小于0x200的包*/ // get EP6FIFOBCH/L value xFIFOBC_IN = ( ( EP6FIFOBCH << 8 ) + EP6FIFOBCL ); while (xFIFOBC_IN >= 0x0200) // if pkt is short, { xFIFOBC_IN = ( ( EP6FIFOBCH << 8 ) + EP6FIFOBCL ); } // force a commit to the host if (INPKTEND > 0) INPKTEND = 0x06; // 发送帧起始位 SYNCDELAY; EP6FIFOCFG = 0x00;//AUTOIN = 0 8-BIT BUS SYNCDELAY; EP6FIFOBUF[0] = 0x00; SYNCDELAY; EP6BCH = MSB(1); SYNCDELAY; EP6BCL = LSB(1); SYNCDELAY; } |
|
地板#
发布于:2004-11-04 13:34
帖子沉的真快!
为什么无人问津,还是同道太少, 不是我不明白,这世界变化快! |
|
地下室#
发布于:2004-11-04 14:01
我也在做个类似的东西,大家可以多多交流呀。
|
|
5楼#
发布于:2004-11-04 14:07
你看我的程序有怎么问题。我要通过C口的高低来控制写数据,如果高,68013自动写51发送,否则发送Data总线上的数据。程序如下:
int i=0,contrl=0; if(IOC&&0x10)contrl=1; if(contrl) { FIFORESET = 0x80; SYNCDELAY; FIFORESET = 0x08; SYNCDELAY; FIFORESET = 0x00; if (EP68FIFOFLGS & 0x02) // write data to ep6fifobuf when ep6 empty { EP6FIFOCFG = 0x44; for(i;i<=511;i++) { EP6FIFOBUF = 0x51; } } SYNCDELAY; EP6BCH = 0x02; SYNCDELAY; EP6BCL = 0x00; contrl=0; } else { EP6FIFOCFG = 0x4C; SYNCDELAY; EP6AUTOINLENH = 0x02; SYNCDELAY; EP6AUTOINLENL = 0x00; } |
|