tag 标签: mt9m114

相关博文
  • 热度 31
    2020-10-3 22:31
    7196 次阅读|
    0 个评论
    基于MT9M114+CYUSB3014的UVC摄像头开发4(亮度控制)
    1、 本文简单描述一下UVC的亮度控制机制,实际上就是测试AN75779的亮度功能。测试工具有两个,一个是关于位机出图像的E-CAM软件,另一个是监测USB3 是关于 e-CAM 软件更改亮度的截图,如下图: 弹出的控制页面中只有亮度是可以操作的,其它是灰色的。当然,后面的文章会介绍使能对比度、色调等其它控制功能,不过是收费的。 2、 这里用 BUS HOUND 软件监听 USB 总线上的控制传输指令,数据如下: 上图是软件 e-CAM 发出的两条指令,第一条指令是 8 个字节, 21 01 00 02 00 02 02 00 ,控制传输指令 CTL 是 USB 协议定义的指令,具体 8 个字节的含义用户可以自行查阅 UVC 标准协议。第二条指令 2 个字节, 31 00 。这个简单的控制传输指令,也可以用 BUS HOUND 软件完成,具体如下 : 图中 1 是选择 USB 传输; 图中 2 是选择控制传输; 图中 3 是输出实际的 8 字节控制传输指令; 图中 4 是输入要发送的 2 字节数据; 3、 结合上图中的8字节控制传输指令,请直接对照UVC协议具体分析一下(UVC协议第4章,或者第86页)。 第1字节21; 第2字节01,对应bRequest;常数定义操作的类型,具体见UVC协议的第87页,常数定义如下: 第3、4字节00 02;对应wValue; 第5、6字节00 02;对应wIndex; 第7、8字节02 00;对应wLength; 4 、亮度控制部分代码分析 打开文件uvc.c文件,我们看下程序是如何处理这8个字节的控制传输指令上的,定位在第323行上,如下: 函数CyFxUVCApplnUSBSetupCB ( )的输入参数有两个,如上图标记A,两个32位变量setupdat0和setupdat1正好是8个单字节,即是8个字节的控制传输指令;上图标记B的则是从这8个字节中按UVC协议提取的5个变量,分别是bmReqType,bRequest,wValue,wIndex,和wLength。 上位机发送的CTL指令为:21 01 00 02 00 02 02 00。注意到setupdat0=0x0200_0121;setupdat1=0x0002_0200,因为CYUSB3014内核的存储器组织是小端对齐的,所以4个字节的顺序是正好相反的。经过函数CyFxUVCApplnUSBSetupCB()的处理,如上图中标记B的处理,控制传输的5个变量的值如下: bmReqType=0x21; bRequest =0x01; wValue =0x0200; wIndex =0x0200; wLength=0x0002; 上图中标记C的代码,是识别出UVC的控制指令后,通过事件设置函数CyU3PEventSet()设置事件CY_FX_UVC_VIDEO_CONTROL_REQUEST_EVENT。 接收事件CY_FX_UVC_VIDEO_CONTROL_REQUEST_EVENT是在函数UVCAppEP0Thread_Entry()中完成的。此函数在文件uvc.c中的第1667行,如下图: 通过获取事件函数CyU3PEventGet(),上图中标记A的,获取事件CY_FX_UVC_VIDEO_CONTROL_REQUEST_EVENT。再通过上图标记B的代码,识别出 8==CY_FX_UVC_PROCESSING_UNIT_ID=0x02,执行函数UVCHandleProcessingUnitRqts()。 函数UVCHandleProcessingUnitRqts()在第1215行,如下图: 上图红框中代码是设置亮度的代码,先通过函数CyU3PUsbGetEP0Data()读出OUT传输的两个字节,存入变量glEp0Buffer中,再经过变量值范围检查后执行设置亮度的函数SensorSetBrightness()。 5、亮度设置相关的还包括描述符部分,以AN75779的USB2描述符为例,如下: 上面的处理单元共有3个字节的位控制字节,最低字节的D0位代表亮度控制,这是UVC协议定义好的。 如果将上面的D0位设置为0,再编绎程序,下载到电路板中,图像正常,但亮度控制功能所属的视频属性控制页都不显示了,仅剩下照相机控制页了。 作为上面的对比,将图像属性控制的3个字节的最低字节8位全部设置为1,即FF, * D0: Brightness;//亮度 * D1: Contrast;//对比度 * D2: Hue;//色调 * D3: Saturation;//饱合度 * D4: Sharpness;//清晰度 * D5: Gamma;//伽玛 * D6: White Balance Temperature;//白平衡 * D7: White Balance Component;//白平衡 未完,接下一章。 良子USB,20200912 专注USB3.0、FPGA、PCIE、UVC摄像头开发 QQ:1345482533
  • 热度 13
    2015-6-27 22:09
    3026 次阅读|
    1 个评论
          接上一篇。上一篇介绍的是I2C的写操作。       接着介绍I2C的读操作。读操作要比写操作复杂一些,因为读操作也是从写操作开始的,要写入从哪里个地址开始读。读函数也得重新封装,函数名字定义为:SensorRead1A2B(uint8_t slaveAddr, uint8_t OneAddr),1A代表的是1个字节的寄存器地址,2B代表的是2个字节的寄存器值,输入参数有两个,一个是slaveAddr,另一个是OneAddr。       测试此函数的方法同前面,下面是截图,也就是读回MT9M001的ID,         对上图进行一下说明。MT9M001的ID是寄存器0x00里的值,正确的是0x8431。上图是一个完整的ID读操作,第一步要通过0xBA写入要读取的寄存器地址0x00。 第二步写入0xBA,读回的值是0x8431,高字节0x84在前,低字节0x31在后。可以看到,ID值已经被正确读回。            AN75779配套的摄像头是MT9M114,是一款120万像素的,分辨率是720P的,分辨率是1280 X 720的。MT9M001是一款130万像素的,分辨率是1280 X 1024的。在默认情况下,两者分辨率是不同的,需要重新配置一下MT9M001,使MT9M001的输出分辨率也为 1280 X 720,这样才有可能成像。      查MT9M001的数据手册,找到与窗口控制相关的寄存器如下:             上面红框中的是与窗口大小相关的。改变这两个寄存器的值,可以改变摄像头输出的窗口大小。这两个寄存器的解释如下:      寄存器0x03是设置窗口大小的,默认值是0x03FF,对应的十进制是1023(1024-1)。 我们需要输出是719(720-1),16进制是0x02CF,也就是要通过I2C写入0x03的值是0x02CF。        未完待续,,,,。     (另公布一群号178338109,CYUSB3014开发专业讨论区)     淘宝店铺: http://liangziusb.taobao.com 良子.2015年    承接USB开发工程  QQ:2687652834  
  • 热度 19
    2015-6-27 12:17
    2728 次阅读|
    0 个评论
          接上一篇。       这一篇文章介绍测试AN75779的I2C通信功能,读回摄像头MT9M001的ID。       AN75779提供了95%的源程序,仅是没有包括与摄像头相关的初始代码,但提供了I2C读写的函数,分别是一字节读写和二字节读写。打开文件sensor.c,可以找到4个函数,分别是: 1、 CyU3PReturnStatus_t SensorWrite2B(uint8_t slaveAddr, uint8_t highAddr, uint8_t lowAddr, uint8_t highData, uint8_t lowData) 2、 CyU3PReturnStatus_t SensorWrite(uint8_t slaveAddr, uint8_t highAddr, uint8_t lowAddr, uint8_t count, uint8_t *buf) 3、 CyU3PReturnStatus_t SensorRead2B(uint8_t slaveAddr, uint8_t highAddr, uint8_t lowAddr, uint8_t *buf) 4、 CyU3PReturnStatus_t SensorRead(uint8_t slaveAddr, uint8_t highAddr, uint8_t lowAddr, uint8_t count, uint8_t *buf)         这4个函数,都提供了源代码,用户可以仔细看一下。既然有现成的函数,我们直接用就好了。还有就是最基本的I2C读写函数,官方也提供了API函数,分别是CyU3PI2cReceiveBytes()和CyU3PI2cTransmitBytes(),分别对应一收一发。       I2C读写函数有了,我们再查一下摄像头MT9M001的地址,ID对应的寄存器地址及正确的ID值是多少。仔细查阅MT9M001的数据手册,可以找到器件地址是0xBA,ID对应的寄存器地址是0x00,正确的ID值应该是0x8431,如下图所示:        注意到寄存器地址是一字节的,值是是二字节的。这与前面的4个I2C读写函数都不太相同。前面的4个读写函数,寄存器的地址都是双字节的,看来需要我们修改这几个函数。先统一一下函数名称,前面4个I2C读写函数,结合MT9M001的特点,可以只使用2个,函数名称统一为:SensorWrite1A2B(参数),SensorRead1A2B(参数)。其中的1A代表地址是1字节的,2B代表寄存器的值是2个字节的。以函数SensorWrite1A2B()为例,修改成如下: CyU3PReturnStatus_t SensorWrite1A2B(uint8_t slaveAddr, uint8_t OneAddr,uint16_t RegisterValue)        其中第一个参数为MT9M001的器件地址,第二个参数是寄存器的地址,是8位的一个字节,第三个参数是要写入寄存器的值,是16位的两个字节。接下来验证这个函数的正确性,按MT9M001数据手册里提供的验证,手册中的如下:       实现以上功能的函数就是:glDebugRspBuffer = SensorWrite1A2B (SENSOR_ADDR_WR, 0x09, 0x0284);       按照之前测试摄像头复位的方法,将SensorWrite1A2B()插入到SensorReset()后,输入的指令也一样。采集后的I2C波形如下:       上图用红线分隔成4部分,每一部分为一字节,左数第一部分为MT9M001的器件地址,十进制为186,16进制为0xBA,第二部分为寄存器地址,16进制为0x09,第三部分为寄存器值的高位,十进制的02,16进制也为0x02,第四部分是寄存器值的低为,16进制的0x84。可以看到,和数据手册描述的一样,成功验证了I2C的写操作。       未完待续,,,,。     (另公布一群号178338109,CYUSB3014开发专业讨论区)     淘宝店铺: http://liangziusb.taobao.com 良子.2015年    承接USB开发工程  QQ:2687652834
  • 热度 22
    2015-6-27 12:16
    1154 次阅读|
    0 个评论
        正在更新,,,,     (另公布一群号178338109,CYUSB3014开发专业讨论区)     淘宝店铺: http://liangziusb.taobao.com 良子.2015年    承接USB开发工程  QQ:2687652834
  • 热度 23
    2015-6-24 21:46
    1948 次阅读|
    0 个评论
            接上一篇。         接着测试摄像头的复位信号。将复位的函数SensorReset()插入到如下位置,当程序执行到此位置时,对摄像头进行复位。                  在实际测试之前,先看一下开发板的连接情况,如下:        CYUSB3014使用的是GPIO22,或者说是CTL5,直接连到MT9M001的复位引脚上。 下载完AN75779附带的程序后,按下图操作,输入控制命令,        对上图进行一下说明。1是选择的OUT端点,2是选择进行数据传输,3是输入的命令,4是命令执行按钮,5是显示命令已经成功执行的信息。在执行上面的操作过程中,用示波器监测一下GPIO22,结果如下:       示波器一格的宽度是10mS,复位信号的低电平大致也是 10mS,与程序的功能一致。这样,我们已经验证了AN75779的复位功能。     未完待续,,,,下一篇会接着介绍如何验证AN75779的I2C通信功能。         (另公布一群号178338109,CYUSB3014开发专业讨论区)     淘宝店铺: http://liangziusb.taobao.com 良子.2015年    承接USB开发工程  QQ:2687652834