找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3094|回复: 0
打印 上一主题 下一主题
收起左侧

ov2640 IO口读取驱动源码

[复制链接]
跳转到指定楼层
楼主
ID:416895 发表于 2018-10-28 20:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ov2640 IO口读取驱动源码,具体看压缩包。

单片机源程序如下:
  1. /*
  2. * OV2640 driver.
  3. *
  4. */
  5. #include <config.h>
  6. #ifdef CAM2640
  7. #include <devices/ov2640.h>
  8. #include <devices/sensor.h>

  9. #include "ov2640_regs.h"


  10. const static uint8_t OV2640_AUTOEXPOSURE_LEVEL0[]=
  11. {
  12.         0xFF,        0x01,        0xff,
  13.         0x24,        0x20,        0xff,
  14.         0x25,        0x18,        0xff,
  15.         0x26,        0x60,        0xff,
  16.         0x00,        0x00,        0x00
  17. };

  18. const static uint8_t OV2640_AUTOEXPOSURE_LEVEL1[]=
  19. {
  20.         0xFF,        0x01,        0xff,
  21.         0x24,        0x34,        0xff,
  22.         0x25,        0x1c,        0xff,
  23.         0x26,        0x70,        0xff,
  24.         0x00,        0x00,        0x00
  25. };
  26. const static uint8_t OV2640_AUTOEXPOSURE_LEVEL2[]=
  27. {
  28.         0xFF,        0x01,        0xff,
  29.         0x24,        0x3e,        0xff,
  30.         0x25,        0x38,        0xff,
  31.         0x26,        0x81,        0xff,
  32.         0x00,        0x00,        0x00
  33. };
  34. const static uint8_t OV2640_AUTOEXPOSURE_LEVEL3[]=
  35. {
  36.         0xFF,        0x01,        0xff,
  37.         0x24,        0x48,        0xff,
  38.         0x25,        0x40,        0xff,
  39.         0x26,        0x81,        0xff,
  40.         0x00,        0x00,        0x00
  41. };
  42. const static uint8_t OV2640_AUTOEXPOSURE_LEVEL4[]=
  43. {
  44.         0xFF,        0x01,        0xff,
  45.         0x24,        0x58,        0xff,
  46.         0x25,        0x50,        0xff,
  47.         0x26,        0x92,        0xff,
  48.         0x00,        0x00,        0x00
  49. };

  50. static void SCCB_WriteRegs(sensor_t *sensor, const uint8_t * pbuf)
  51. {
  52.         uint8_t reg_addr;
  53.         uint8_t reg_data;
  54.    
  55.    
  56.         if (sensor == NULL) {
  57.                 return;
  58.         }
  59.    
  60.    
  61.     while(1)
  62.         {
  63.                 if((*pbuf == 0) && (*(pbuf + 1) == 0))
  64.                 {
  65.                         break;
  66.                 }
  67.                 else
  68.                 {
  69.             reg_addr = *pbuf++;
  70.             reg_data = *pbuf++;
  71.                         sal_fiic_write_slave_std(sensor->iic_dev, OV2640_IIC_ADDR, reg_data, reg_addr);
  72.                 }
  73.         }
  74. }

  75. static int set_auto_exposure_level(sensor_t *sensor, int level)
  76. {
  77.         if (sensor == NULL) {
  78.                 return SAL_ERR_P_NULL;
  79.         }

  80.         switch (level) {
  81.                 case 0:
  82.                         SCCB_WriteRegs(sensor, OV2640_AUTOEXPOSURE_LEVEL0);
  83.                         break;
  84.                 case 1:
  85.                         SCCB_WriteRegs(sensor, OV2640_AUTOEXPOSURE_LEVEL1);
  86.                         break;
  87.                 case 2:
  88.                         SCCB_WriteRegs(sensor, OV2640_AUTOEXPOSURE_LEVEL2);
  89.                         break;
  90.                 case 3:
  91.                         SCCB_WriteRegs(sensor, OV2640_AUTOEXPOSURE_LEVEL3);
  92.                         break;
  93.                 case 4:
  94.                         SCCB_WriteRegs(sensor, OV2640_AUTOEXPOSURE_LEVEL4);
  95.                         break;
  96.                 default:
  97.                         SCCB_WriteRegs(sensor, OV2640_AUTOEXPOSURE_LEVEL0);
  98.                         break;
  99.         }

  100.         return 0;
  101. }

  102. static int probe(sensor_t *sensor)
  103. {
  104.     if (sensor == NULL) {
  105.         return SAL_ERR_P_NULL;
  106.     }
  107.    
  108.     sal_fiic_read_slave_std(sensor->iic_dev, OV2640_IIC_ADDR, OV_CHIP_ID, &sensor->chip_id);
  109.    
  110.     if (sensor->chip_id == OV2640_ID) {
  111.         sal_info("OV2640 probe OK, OV2640 ID = 0x%02x.\r\n", sensor->chip_id);
  112.         sensor->slv_addr = OV2640_IIC_ADDR;
  113.         return SAL_OK;
  114.     }
  115.    
  116.     sal_err("OV2640 not found! chip_id read: %02x.\r\n", sensor->chip_id);
  117.     return SAL_ERR;
  118. }

  119. static int reset(sensor_t *sensor)
  120. {
  121.         if (sensor == NULL) {
  122.                 return SAL_ERR_P_NULL;
  123.         }

  124.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, OV2640_DSP_RA_DLMT, 0x01);
  125.     sensor->iic_dev->delay_us(2);
  126.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, OV2640_SENSOR_COM7, 0x80);
  127.     sensor->iic_dev->delay_us(2);
  128.         return 0;
  129. }

  130. static int set_bandw (sensor_t *sensor, uint8_t black_white)
  131. {
  132.         if (sensor == NULL) {
  133.                 return SAL_ERR_P_NULL;
  134.         }

  135.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0xff, 0x00);
  136.     sensor->iic_dev->delay_us(2);
  137.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7c, 0x00);
  138.     sensor->iic_dev->delay_us(2);
  139.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7d, black_white);
  140.     sensor->iic_dev->delay_us(2);
  141.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7c, 0x05);
  142.     sensor->iic_dev->delay_us(2);
  143.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7d, 0x80);
  144.     sensor->iic_dev->delay_us(2);
  145.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7d, 0x80);
  146.     sensor->iic_dev->delay_us(2);

  147.         return SAL_OK;
  148. }

  149. static int set_auto_whitebal(sensor_t *sensor, int enable)
  150. {
  151. #define CTRL1               0xC3
  152. #define CTRL1_AWB           0x08 /* Enable AWB */

  153.     uint8_t reg;
  154.     int ret = SAL_OK;
  155.     sal_fiic_read_slave_std(sensor->iic_dev, sensor->slv_addr, 0xFF, ®);
  156.     sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0xFF, reg & (~0x01));
  157.     sal_fiic_read_slave_std(sensor->iic_dev, sensor->slv_addr, CTRL1, ®);
  158.     ret = sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, CTRL1, (reg & (~CTRL1_AWB)) | ((enable != 0) ? CTRL1_AWB : 0));

  159.     return ret;
  160. }

  161. static int set_color_effects (sensor_t *sensor, uint8_t value1, uint8_t value2)
  162. {
  163.         if (sensor == NULL) {
  164.                 return SAL_ERR_P_NULL;
  165.         }

  166.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0xff, 0x00);
  167.     sensor->iic_dev->delay_us(2);
  168.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7c, 0x00);
  169.     sensor->iic_dev->delay_us(2);
  170.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7d, 0x18);
  171.     sensor->iic_dev->delay_us(2);
  172.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7c, 0x05);
  173.     sensor->iic_dev->delay_us(2);
  174.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7d, value1);
  175.     sensor->iic_dev->delay_us(2);
  176.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7d, value2);
  177.     sensor->iic_dev->delay_us(2);

  178.         return SAL_OK;
  179. }

  180. static int set_contrast (sensor_t *sensor, uint8_t value1, uint8_t value2)
  181. {
  182.         if (sensor == NULL) {
  183.                 return SAL_ERR_P_NULL;
  184.         }

  185.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0xff, 0x00);
  186.     sensor->iic_dev->delay_us(2);
  187.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7c, 0x00);
  188.     sensor->iic_dev->delay_us(2);
  189.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7d, 0x04);
  190.     sensor->iic_dev->delay_us(2);
  191.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7c, 0x07);
  192.     sensor->iic_dev->delay_us(2);
  193.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7d, 0x20);
  194.     sensor->iic_dev->delay_us(2);
  195.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7d, value1);
  196.     sensor->iic_dev->delay_us(2);
  197.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7d, value2);
  198.     sensor->iic_dev->delay_us(2);
  199.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7d, 0x06);
  200.     sensor->iic_dev->delay_us(2);

  201.         return SAL_OK;
  202. }

  203. static int set_brightness (sensor_t *sensor, uint8_t brightness)
  204. {
  205.         if (sensor == NULL) {
  206.                 return SAL_ERR_P_NULL;
  207.         }

  208.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0xff, 0x00);
  209.     sensor->iic_dev->delay_us(2);
  210.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7c, 0x00);
  211.     sensor->iic_dev->delay_us(2);
  212.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7d, 0x04);
  213.     sensor->iic_dev->delay_us(2);
  214.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7c, 0x09);
  215.     sensor->iic_dev->delay_us(2);
  216.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7d, brightness);
  217.     sensor->iic_dev->delay_us(2);
  218.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x7d, 0x00);
  219.     sensor->iic_dev->delay_us(2);

  220.         return SAL_OK;
  221. }


  222. const unsigned char OV2640_JPEG_INIT[][2]=
  223. {
  224.         {0xff, 0x00},
  225.         {0x2c, 0xff},
  226.         {0x2e, 0xdf},
  227.         {0xff, 0x01},
  228.         {0x3c, 0x32},
  229.         {0x11, 0x00},
  230.         {0x09, 0x02},
  231.         {0x04, 0x28},
  232.         {0x13, 0xe5},
  233.         {0x14, 0x48},
  234.         {0x2c, 0x0c},
  235.         {0x33, 0x78},
  236.         {0x3a, 0x33},
  237.         {0x3b, 0xfB},
  238.         {0x3e, 0x00},
  239.         {0x43, 0x11},
  240.         {0x16, 0x10},
  241.         {0x39, 0x92},
  242.         {0x35, 0xda},
  243.         {0x22, 0x1a},
  244.         {0x37, 0xc3},
  245.         {0x23, 0x00},
  246.         {0x34, 0xc0},
  247.         {0x36, 0x1a},
  248.         {0x06, 0x88},
  249.         {0x07, 0xc0},
  250.         {0x0d, 0x87},
  251.         {0x0e, 0x41},
  252.         {0x4c, 0x00},
  253.         {0x48, 0x00},
  254.         {0x5B, 0x00},
  255.         {0x42, 0x03},
  256.         {0x4a, 0x81},
  257.         {0x21, 0x99},
  258.         {0x24, 0x40},
  259.         {0x25, 0x38},
  260.         {0x26, 0x82},
  261.         {0x5c, 0x00},
  262.         {0x63, 0x00},
  263.         {0x61, 0x70},
  264.         {0x62, 0x80},
  265.         {0x7c, 0x05},
  266.         {0x20, 0x80},
  267.         {0x28, 0x30},
  268.         {0x6c, 0x00},
  269.         {0x6d, 0x80},
  270.         {0x6e, 0x00},
  271.         {0x70, 0x02},
  272.         {0x71, 0x94},
  273.         {0x73, 0xc1},
  274.         {0x12, 0x40},//0x40
  275.         /*SensorWindow */
  276.         {0x17, 0x11},// HREFST[10:3]
  277.         {0x18, 0x43},// HREFEND[10:3]
  278.         {0x19, 0x00},// VSTRT[9:2]
  279.         {0x1a, 0x4b}, // VEND[9:2]
  280.         {0x32, 0x09},// Bit7..6--PCLK分频设置,10二分频,11四分频; Bit[5:3]: HREFEND[2:0]; Bit[2:0]: HREFST[2:0][===zm.li==>定义Window(H*W):400*300]
  281.         // {0x03, 0x0f}, Bit[3:2]: VEND[1:0]; Bit[1:0]: VSTRT[1:0]
  282.         {0x37, 0xc0},
  283.         {0x4f, 0x60},
  284.         {0x50, 0xa8},
  285.         {0x6d, 0x00},
  286.         {0x3d, 0x38},
  287.         {0x46, 0x3f},
  288.         {0x4f, 0x60},
  289.         {0x0c, 0x3c},
  290.         {0xff, 0x00},
  291.         {0xe5, 0x7f},
  292.         {0xf9, 0xc0},
  293.         {0x41, 0x24},
  294.         {0xe0, 0x14},
  295.         {0x76, 0xff},
  296.         {0x33, 0xa0},
  297.         {0x42, 0x20},
  298.         {0x43, 0x18},
  299.         {0x4c, 0x00},
  300.         {0x87, 0xd5},
  301.         {0x88, 0x3f},
  302.         {0xd7, 0x03},
  303.         {0xd9, 0x10},
  304.         {0xd3, 0x82},
  305.         {0xc8, 0x08},
  306.         {0xc9, 0x80},
  307.         {0x7c, 0x00},
  308.         {0x7d, 0x00},
  309.         {0x7c, 0x03},
  310.         {0x7d, 0x48},
  311.         {0x7d, 0x48},
  312.         {0x7c, 0x08},
  313.         {0x7d, 0x20},
  314.         {0x7d, 0x10},
  315.         {0x7d, 0x0e},
  316.         {0x90, 0x00},
  317.         {0x91, 0x0e},
  318.         {0x91, 0x1a},
  319.         {0x91, 0x31},
  320.         {0x91, 0x5a},
  321.         {0x91, 0x69},
  322.         {0x91, 0x75},
  323.         {0x91, 0x7e},
  324.         {0x91, 0x88},
  325.         {0x91, 0x8f},
  326.         {0x91, 0x96},
  327.         {0x91, 0xa3},
  328.         {0x91, 0xaf},
  329.         {0x91, 0xc4},
  330.         {0x91, 0xd7},
  331.         {0x91, 0xe8},
  332.         {0x91, 0x20},
  333.         {0x92, 0x00},
  334.         {0x93, 0x06},
  335.         {0x93, 0xe3},
  336.         {0x93, 0x05},
  337.         {0x93, 0x05},
  338.         {0x93, 0x00},
  339.         {0x93, 0x04},
  340.         {0x93, 0x00},
  341.         {0x93, 0x00},
  342.         {0x93, 0x00},
  343.         {0x93, 0x00},
  344.         {0x93, 0x00},
  345.         {0x93, 0x00},
  346.         {0x93, 0x00},
  347.         {0x96, 0x00},
  348.         {0x97, 0x08},
  349.         {0x97, 0x19},
  350.         {0x97, 0x02},
  351.         {0x97, 0x0c},
  352.         {0x97, 0x24},
  353.         {0x97, 0x30},
  354.         {0x97, 0x28},
  355.         {0x97, 0x26},
  356.         {0x97, 0x02},
  357.         {0x97, 0x98},
  358.         {0x97, 0x80},
  359.         {0x97, 0x00},
  360.         {0x97, 0x00},
  361.         {0xc3, 0xed},
  362.         {0xa4, 0x00},
  363.         {0xa8, 0x00},
  364.         {0xc5, 0x11},
  365.         {0xc6, 0x51},
  366.         {0xbf, 0x80},
  367.         {0xc7, 0x10},
  368.         {0xb6, 0x66},
  369.         {0xb8, 0xA5},
  370.         {0xb7, 0x64},
  371.         {0xb9, 0x7C},
  372.         {0xb3, 0xaf},
  373.         {0xb4, 0x97},
  374.         {0xb5, 0xFF},
  375.         {0xb0, 0xC5},
  376.         {0xb1, 0x94},
  377.         {0xb2, 0x0f},
  378.         {0xc4, 0x5c},
  379.         /*ImageSize定义*/
  380.         {0xc0, 0x64},
  381.         {0xc1, 0x4B},
  382.         {0x8c, 0x00},/*H*W=800*600*/

  383.         {0x86, 0x3D},
  384.         {0x50, 0x00},
  385.         /*ImageWindow 定义*/
  386.         {0x51, 0xC8},
  387.         {0x52, 0x96},
  388.         {0x53, 0x00},
  389.         {0x54, 0x00},
  390.         {0x55, 0x00},
  391.         /*OutSize定义*/
  392.         {0x5a, 0xC8},
  393.         {0x5b, 0x96},
  394.         {0x5c, 0x00},

  395.         {0xd3, 0x7f},
  396.         {0xc3, 0xed},
  397.         {0x7f, 0x00},
  398.         {0xda, 0x00},
  399.         {0xe5, 0x1f},
  400.         {0xe1, 0x67},
  401.         {0xe0, 0x00},
  402.         {0xdd, 0x7f},
  403.         {0x05, 0x00},

  404.         {0x12, 0x40},//0x40
  405.         {0xd3, 0x7f},
  406.         /*ImageSize定义*/
  407.         {0xc0, 0x16},/*Image HSize[10..3]*/
  408.         {0xC1, 0x12},/*Image VSize[10..3]*/
  409.         {0x8c, 0x00},/*Bit6--HSize[11]?, Bit5..3--HSize[2..0], Bit2..0--VSize[2..0]*//*H*V= 176*144 */

  410.         {0x86, 0x3d},
  411.         {0x50, 0x00},
  412.         /*ImageWindow 定义*/
  413.         {0x51, 0x2C},/*HSize[7..0]*/
  414.         {0x52, 0x24},/*VSize[7..0]*/
  415.         {0x53, 0x00},/*Offerset_X[7..0]*/
  416.         {0x54, 0x00},/*Offerset_Y[7..0]*/
  417.         {0x55, 0x00},/*Bit7-VSize[8], Bit6..4-Offerset_Y[10..8],Bit3-HSize[8], Bit2..0-Offerset_Y[10..8]*/
  418.         /*OutSize定义*/
  419.         {0x5A, 0x2c},/*OutW[7..0]*/
  420.         {0x5b, 0x24},/*OutH[7..0]*/
  421.         {0x5c, 0x00},/*Bit7..4-Zoom Spead, Bit2-OutH[8], Bit1..0-OutW[9..8]*/
  422. };

  423. const unsigned char OV2640_YUV422[][2]=
  424. {
  425.         {0xFF, 0x00},/*选中DSP[寄存器bank选择0--DSP, 1--Sensor]*/
  426.         {0x05, 0x00},/*bit0 = 0-->DSP处理采集图像(非Bypass DSP直接将Sensor数据输出)*/
  427.         {0xDA, 0x10},/*bit4=1-->JPEG输出,bit3..2=0-->YUV422格式,bit1=0-->HREF与sensor相同,bit0=0-->High byte first YUYV(C2[4]=0复位缺省)*/
  428.         {0xD7, 0x03},/*芯片保留寄存器*/
  429.         {0xDF, 0x00},/*芯片保留寄存器*/
  430.         {0x33, 0x80},/*芯片保留寄存器*/
  431.         {0x3C, 0x40},/*芯片保留寄存器*/
  432.         {0xe1, 0x77},/*芯片保留寄存器*/
  433.         {0x00, 0x00},/*芯片保留寄存器*/
  434. };

  435. const unsigned char OV2640_RGB565[][2]=
  436. {
  437.         {0xFF, 0x00},/*选中DSP[寄存器bank选择0--DSP, 1--Sensor]*/
  438.         {0x05, 0x00},/*bit0 = 0-->DSP处理采集图像(非Bypass DSP直接将Sensor数据输出)*/
  439.         {0xDA, 0x1C},/*bit4=1-->JPEG输出,bit3..2=11-->RGB565格式,bit1=0-->HREF与sensor相同,bit0=0-->High byte first YUYV(C2[4]=0复位缺省)*/
  440.         {0xD7, 0x03},/*芯片保留寄存器*/
  441.         {0xDF, 0x00},/*芯片保留寄存器*/
  442.         {0x33, 0x80},/*芯片保留寄存器*/
  443.         {0x3C, 0x40},/*芯片保留寄存器*/
  444.         {0xe1, 0x77},/*芯片保留寄存器*/
  445.         {0x00, 0x00},/*芯片保留寄存器*/
  446. };

  447. const unsigned char OV2640_JPEG[][2]=
  448. {
  449.         {0xe0, 0x14},/*芯片保留寄存器*/
  450.         {0xe1, 0x77},/*芯片保留寄存器*/
  451.         {0xe5, 0x1f},/*芯片保留寄存器*/
  452.         {0xd7, 0x03},/*芯片保留寄存器*/
  453.         {0xda, 0x10},/*芯片保留寄存器*/
  454.         {0xe0, 0x00},/*芯片保留寄存器*/
  455.         {0xFF, 0x01},
  456.         {0x04, 0x08},
  457. };

  458. /* JPG 160x120 */
  459. const unsigned char OV2640_160x120_JPEG[][2]=
  460. {
  461.         {0xff, 0x01},
  462.         {0x12, 0x40},
  463.         {0x17, 0x11},
  464.         {0x18, 0x43},
  465.         {0x19, 0x00},
  466.         {0x1a, 0x4b},
  467.         {0x32, 0x09},
  468.         {0x4f, 0xca},
  469.         {0x50, 0xa8},
  470.         {0x5a, 0x23},
  471.         {0x6d, 0x00},
  472.         {0x39, 0x12},
  473.         {0x35, 0xda},
  474.         {0x22, 0x1a},
  475.         {0x37, 0xc3},
  476.         {0x23, 0x00},
  477.         {0x34, 0xc0},
  478.         {0x36, 0x1a},
  479.         {0x06, 0x88},
  480.         {0x07, 0xc0},
  481.         {0x0d, 0x87},
  482.         {0x0e, 0x41},
  483.         {0x4c, 0x00},
  484.         {0xff, 0x00},
  485.         {0xe0, 0x04},
  486.         {0xc0, 0x64},
  487.         {0xc1, 0x4b},
  488.         {0x86, 0x35},
  489.         {0x50, 0x92},
  490.         {0x51, 0xc8},
  491.         {0x52, 0x96},
  492.         {0x53, 0x00},
  493.         {0x54, 0x00},
  494.         {0x55, 0x00},
  495.         {0x57, 0x00},
  496.         {0x5a, 0x28},
  497.         {0x5b, 0x1e},
  498.         {0x5c, 0x00},
  499.         {0xe0, 0x00},
  500. };

  501. /* JPG 176x144 */
  502. const unsigned char OV2640_176x144_JPEG[][2]=
  503. {
  504.         {0xff, 0x01},
  505.         {0x11, 0x05},/*摄像头晶振6MHz、主控MCU工作频率16MHz时,此寄存器可设为0x05(6分频)、0x0B(12分频)*/
  506.         {0x12, 0x00}, // Bit[6:4]: Resolution selection//0x02为彩条
  507.         {0x17, 0x11}, // HREFST[10:3]
  508.         {0x18, 0x75}, // HREFEND[10:3]
  509.         {0x32, 0x36}, // Bit[5:3]: HREFEND[2:0]; Bit[2:0]: HREFST[2:0]
  510.         {0x19, 0x01}, // VSTRT[9:2]
  511.         {0x1a, 0x97}, // VEND[9:2]
  512.         {0x03, 0x0f}, // Bit[3:2]: VEND[1:0]; Bit[1:0]: VSTRT[1:0]
  513.         {0x37, 0x40},
  514.         {0x4f, 0xbb},
  515.         {0x50, 0x9c},
  516.         {0x5a, 0x57},
  517.         {0x6d, 0x80},
  518.         {0x3d, 0x34},
  519.         {0x39, 0x02},
  520.         {0x35, 0x88},
  521.         {0x22, 0x0a},
  522.         {0x37, 0x40},
  523.         {0x34, 0xa0},
  524.         {0x06, 0x02},
  525.         {0x0d, 0xb7},
  526.         {0x0e, 0x01},

  527.         //176x144
  528.         {0xff, 0x00},
  529.         {0xc2, 0xcc},
  530.         {0xc0, 0xc8},
  531.         {0xc1, 0x96},
  532.         {0x8c, 0x00},
  533.         {0x86, 0x3d},
  534.         {0x50, 0x9b},
  535.         {0x51, 0x90},
  536.         {0x52, 0x2c},
  537.         {0x53, 0x00},
  538.         {0x54, 0x00},
  539.         {0x55, 0x88},
  540.         {0x5a, 0x2c},
  541.         {0x5b, 0x24},
  542.         {0x5c, 0x00},
  543.         {0xd3, 0x7F},
  544. };


  545. /* JPG 320x240 */
  546. const unsigned char OV2640_320x240_JPEG[][2]=
  547. {
  548.         {0xff, 0x01},
  549.         {0x11, 0x05},/*摄像头晶振6MHz、主控MCU工作频率16MHz时,此寄存器可设为0x05(6分频)、0x0B(12分频)*/
  550.         {0x12, 0x00}, // Bit[6:4]: Resolution selection//0x02为彩条
  551.         {0x17, 0x11}, // HREFST[10:3]
  552.         {0x18, 0x75}, // HREFEND[10:3]
  553.         {0x32, 0x36}, // Bit[5:3]: HREFEND[2:0]; Bit[2:0]: HREFST[2:0]
  554.         {0x19, 0x01}, // VSTRT[9:2]
  555.         {0x1a, 0x97}, // VEND[9:2]
  556.         {0x03, 0x0f}, // Bit[3:2]: VEND[1:0]; Bit[1:0]: VSTRT[1:0]
  557.         {0x37, 0x40},
  558.         {0x4f, 0xbb},
  559.         {0x50, 0x9c},
  560.         {0x5a, 0x57},
  561.         {0x6d, 0x80},
  562.         {0x3d, 0x34},
  563.         {0x39, 0x02},
  564.         {0x35, 0x88},
  565.         {0x22, 0x0a},
  566.         {0x37, 0x40},
  567.         {0x34, 0xa0},
  568.         {0x06, 0x02},
  569.         {0x0d, 0xb7},
  570.         {0x0e, 0x01},

  571.         //320*240
  572.         {0xff, 0x00},
  573.         {0xe0, 0x04},
  574.         {0xc0, 0xc8},
  575.         {0xc1, 0x96},
  576.         {0x86, 0x3d},
  577.         {0x50, 0x92},
  578.         {0x51, 0x90},
  579.         {0x52, 0x2c},
  580.         {0x53, 0x00},
  581.         {0x54, 0x00},
  582.         {0x55, 0x88},
  583.         {0x57, 0x00},
  584.         {0x5a, 0x50},
  585.         {0x5b, 0x3c},
  586.         {0x5c, 0x00},
  587.         {0xd3, 0x7F},
  588.         {0xe0, 0x00}
  589. };

  590. /* JPG 352x288 */
  591. const unsigned char OV2640_352x288_JPEG[][2]=
  592. {
  593.         {0xff, 0x01},
  594.         {0x12, 0x40},
  595.         {0x17, 0x11},
  596.         {0x18, 0x43},
  597.         {0x19, 0x00},
  598.         {0x1a, 0x4b},
  599.         {0x32, 0x09},
  600.         {0x4f, 0xca},
  601.         {0x50, 0xa8},
  602.         {0x5a, 0x23},
  603.         {0x6d, 0x00},
  604.         {0x39, 0x12},
  605.         {0x35, 0xda},
  606.         {0x22, 0x1a},
  607.         {0x37, 0xc3},
  608.         {0x23, 0x00},
  609.         {0x34, 0xc0},
  610.         {0x36, 0x1a},
  611.         {0x06, 0x88},
  612.         {0x07, 0xc0},
  613.         {0x0d, 0x87},
  614.         {0x0e, 0x41},
  615.         {0x4c, 0x00},

  616.         {0xff, 0x00},
  617.         {0xe0, 0x04},
  618.         {0xc0, 0x64},
  619.         {0xc1, 0x4b},
  620.         {0x86, 0x35},
  621.         {0x50, 0x89},
  622.         {0x51, 0xc8},
  623.         {0x52, 0x96},
  624.         {0x53, 0x00},
  625.         {0x54, 0x00},
  626.         {0x55, 0x00},
  627.         {0x57, 0x00},
  628.         {0x5a, 0x58},
  629.         {0x5b, 0x48},
  630.         {0x5c, 0x00},
  631.         {0xe0, 0x00}
  632. };


  633. static int set_jpeg_img_format (sensor_t *sensor, image_format_e img_format)
  634. {
  635.         uint32_t i;

  636.         if (sensor == NULL) {
  637.                 return SAL_ERR_P_NULL;
  638.         }

  639.         reset(sensor);
  640.         HAL_Delay(200);

  641.         /* Initialize OV2640 */
  642.         for (i = 0; i < (sizeof(OV2640_JPEG_INIT) / 2); i++) {
  643.                 sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, OV2640_JPEG_INIT[i][0], OV2640_JPEG_INIT[i][1]);
  644.                 HAL_Delay(2);
  645.         }

  646.         /* Set to output OV2640_RGB565 (2560bytes size vs 3072 in YUV422 mode.) OV2640_YUV422 */
  647.         for (i = 0; i < (sizeof(OV2640_YUV422) / 2); i++) {
  648.                 sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, OV2640_YUV422[i][0], OV2640_YUV422[i][1]);
  649.                 HAL_Delay(2);
  650.         }

  651.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0xff, 0x01); /*选中Sensor寄存器bank*/
  652.         sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, 0x15, 0x00); /*设置结果:bit5=0-->PCLK持续输出;bit4=0-->数据在PCLK降沿时更新好;
  653.                                                                                                    bit3=0-->HRef正极性输出;bit1=0-->VSYNC正极性输出;*/

  654.         /* Set to output JPEG */
  655.         for (i = 0; i < (sizeof(OV2640_JPEG) / 2); i++) {
  656.                 sal_fiic_write_slave_std(sensor->iic_dev, sensor->slv_addr, OV2640_JPEG[i][0], OV2640_JPEG[i][1]);
  657.                 HAL_Delay(2);
  658.         }
  659.    
  660.         HAL_Delay(100);
  661.    
  662.     uint8_t data = 0;

  663. ……………………

  664. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

下载:
ov2640.zip (4.68 KB, 下载次数: 30)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表