久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2302|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

OV7670帶FIFO的CMOS攝像頭STM32程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:569034 發(fā)表于 2019-6-21 18:17 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
圖像采集程序
  1. #include "stm32f10x.h"                  
  2. #include<stdio.h>
  3. //應(yīng)用層函數(shù)頭文件
  4. #include"Application.h"        
  5. /*與板子相關(guān)的頭文件*/
  6. #include"LED.h"
  7. #include"KEY.h"
  8. #include"EXIT.h"
  9. #include"USART.h"
  10. #include"delay.h"
  11. #include"I2C.h"         
  12. #include"OV7670.h"

  13. uint8_t PIC[R][C];
  14. //當(dāng)前的狀態(tài)
  15. //下一步的狀態(tài)
  16. OV7670_State OV_State=Wait_Vsync1;
  17. u16 TrueLine;
  18. u8 datareadyflag=0;



  19. /*
  20.         攝像頭模塊初始化

  21. */
  22. void Data_Bus_Config(void)
  23. {                                          
  24.         
  25.         /*通用GPIO結(jié)構(gòu)體聲明*/
  26.         GPIO_InitTypeDef GPIO_InitStructure;
  27.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;        
  28.         /*開啟時(shí)鐘*/        
  29.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);               
  30.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);               
  31.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

  32.         GPIO_InitStructure.GPIO_Pin=D0_Pin;               
  33.         GPIO_Init(D0_Port,&GPIO_InitStructure);
  34.         GPIO_InitStructure.GPIO_Pin=D1_Pin;               
  35.         GPIO_Init(D1_Port,&GPIO_InitStructure);
  36.         GPIO_InitStructure.GPIO_Pin=D2_Pin;               
  37.         GPIO_Init(D2_Port,&GPIO_InitStructure);
  38.         GPIO_InitStructure.GPIO_Pin=D3_Pin;               
  39.         GPIO_Init(D3_Port,&GPIO_InitStructure);
  40.         GPIO_InitStructure.GPIO_Pin=D4_Pin;               
  41.         GPIO_Init(D4_Port,&GPIO_InitStructure);
  42.         GPIO_InitStructure.GPIO_Pin=D5_Pin;               
  43.         GPIO_Init(D5_Port,&GPIO_InitStructure);
  44.         GPIO_InitStructure.GPIO_Pin=D6_Pin;               
  45.         GPIO_Init(D6_Port,&GPIO_InitStructure);
  46.         GPIO_InitStructure.GPIO_Pin=D7_Pin;               
  47.         GPIO_Init(D7_Port,&GPIO_InitStructure);

  48.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  49.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  50.         //PWDN
  51.         GPIO_InitStructure.GPIO_Pin=PWDN_Pin;
  52.         GPIO_Init(PWDN_Port,&GPIO_InitStructure);
  53.         //RESET
  54.         GPIO_InitStructure.GPIO_Pin=RESET_Pin;
  55.         GPIO_Init(RESET_Port,&GPIO_InitStructure);
  56.         //FIFO_RCK
  57.         GPIO_InitStructure.GPIO_Pin=FIFO_RCK_Pin;
  58.         GPIO_Init(FIFO_RCK_Port,&GPIO_InitStructure);
  59.         //FIFO_EO
  60.         GPIO_InitStructure.GPIO_Pin=FIFO_OE_Pin;
  61.         GPIO_Init(FIFO_OE_Port,&GPIO_InitStructure);
  62.         //FIFO_RRST
  63.         GPIO_InitStructure.GPIO_Pin=FIFO_RRST_Pin;
  64.         GPIO_Init(FIFO_RRST_Port,&GPIO_InitStructure);
  65.         //FIFO_WR
  66.         GPIO_InitStructure.GPIO_Pin=FIFO_WR_Pin;
  67.         GPIO_Init(FIFO_WR_Port,&GPIO_InitStructure);
  68.         //FIFO_WRST
  69.         GPIO_InitStructure.GPIO_Pin=FIFO_WRST_Pin;
  70.         GPIO_Init(FIFO_WRST_Port,&GPIO_InitStructure);
  71.         //STORBE
  72.         GPIO_InitStructure.GPIO_Pin=STORBE_Pin;
  73.         GPIO_Init(STORBE_Port,&GPIO_InitStructure);
  74. }
  75. void OV7670_Init(void)
  76. {
  77.         /*I2C控制引腳初始化*/
  78.         I2C_Configuration();
  79.         /*數(shù)據(jù)總線與控制總線初始化*/
  80.         Data_Bus_Config();
  81.         OV7670_Register_Init();
  82.         /*以上初始化結(jié)束之后才可以初始化下面的*/
  83.         EXTI_ClearITPendingBit(EXTI_Line0);
  84.         EXTI_Config(EN);

  85.         
  86. }
  87. void OV7670_Register_Init(void)
  88. {
  89.         PWDN_L;/*電源工作方式*/
  90.         RESET_L;//寄存器復(fù)位
  91.         delay_ms(20);
  92.         RESET_H;

  93.         //YUV格式
  94.         I2C_WriteByte(0x12,0x80);
  95.         I2C_WriteByte(0x3a, 0x04);
  96.         I2C_WriteByte(0x40, 0xd0);
  97.         I2C_WriteByte(0x12, 0x14);
  98.         I2C_WriteByte(0x32, 0x80);
  99.         I2C_WriteByte(0x17, 0x16);
  100.         I2C_WriteByte(0x18, 0x04);
  101.         I2C_WriteByte(0x19, 0x02);
  102.         I2C_WriteByte(0x1a, 0x7b);
  103.         I2C_WriteByte(0x03, 0x06);
  104.         I2C_WriteByte(0x0c, 0x00);
  105.         I2C_WriteByte(0x3e, 0x00);
  106.         I2C_WriteByte(0x70, 0x3a);
  107.         I2C_WriteByte(0x71, 0x35);
  108.         I2C_WriteByte(0x72, 0x11);
  109.         I2C_WriteByte(0x73, 0x00);
  110.         I2C_WriteByte(0xa2, 0x02);
  111.         I2C_WriteByte(0x11, 0x81);         
  112.         I2C_WriteByte(0x7a, 0x20);
  113.         I2C_WriteByte(0x7b, 0x1c);
  114.         I2C_WriteByte(0x7c, 0x28);
  115.         I2C_WriteByte(0x7d, 0x3c);
  116.         I2C_WriteByte(0x7e, 0x55);
  117.         I2C_WriteByte(0x7f, 0x68);
  118.         I2C_WriteByte(0x80, 0x76);
  119.         I2C_WriteByte(0x81, 0x80);
  120.         I2C_WriteByte(0x82, 0x88);
  121.         I2C_WriteByte(0x83, 0x8f);
  122.         I2C_WriteByte(0x84, 0x96);
  123.         I2C_WriteByte(0x85, 0xa3);
  124.         I2C_WriteByte(0x86, 0xaf);
  125.         I2C_WriteByte(0x87, 0xc4);
  126.         I2C_WriteByte(0x88, 0xd7);
  127.         I2C_WriteByte(0x89, 0xe8);        
  128.         I2C_WriteByte(0x13, 0xe0);
  129.         I2C_WriteByte(0x00, 0x00);         
  130.         I2C_WriteByte(0x10, 0x00);
  131.         I2C_WriteByte(0x0d, 0x00);
  132.         I2C_WriteByte(0x14, 0x28);
  133.         I2C_WriteByte(0xa5, 0x05);
  134.         I2C_WriteByte(0xab, 0x07);
  135.         I2C_WriteByte(0x24, 0x75);
  136.         I2C_WriteByte(0x25, 0x63);
  137.         I2C_WriteByte(0x26, 0xA5);
  138.         I2C_WriteByte(0x9f, 0x78);
  139.         I2C_WriteByte(0xa0, 0x68);
  140.         I2C_WriteByte(0xa1, 0x03);
  141.         I2C_WriteByte(0xa6, 0xdf);
  142.         I2C_WriteByte(0xa7, 0xdf);
  143.         I2C_WriteByte(0xa8, 0xf0);
  144.         I2C_WriteByte(0xa9, 0x90);
  145.         I2C_WriteByte(0xaa, 0x94);
  146.         I2C_WriteByte(0x13, 0xe5);
  147.         I2C_WriteByte(0x0e, 0x61);
  148.         I2C_WriteByte(0x0f, 0x4b);
  149.         I2C_WriteByte(0x16, 0x02);
  150.         I2C_WriteByte(0x1e, 0x37);
  151.         I2C_WriteByte(0x21, 0x02);
  152.         I2C_WriteByte(0x22, 0x91);
  153.         I2C_WriteByte(0x29, 0x07);
  154.         I2C_WriteByte(0x33, 0x0b);
  155.         I2C_WriteByte(0x35, 0x0b);
  156.         I2C_WriteByte(0x37, 0x1d);
  157.         I2C_WriteByte(0x38, 0x71);
  158.         I2C_WriteByte(0x39, 0x2a);
  159.         I2C_WriteByte(0x3c, 0x78);
  160.         I2C_WriteByte(0x4d, 0x40);
  161.         I2C_WriteByte(0x4e, 0x20);
  162.         I2C_WriteByte(0x69, 0x00);
  163.         I2C_WriteByte(0x6b, 0x60);
  164.         I2C_WriteByte(0x74, 0x19);
  165.         I2C_WriteByte(0x8d, 0x4f);
  166.         I2C_WriteByte(0x8e, 0x00);
  167.         I2C_WriteByte(0x8f, 0x00);
  168.         I2C_WriteByte(0x90, 0x00);
  169.         I2C_WriteByte(0x91, 0x00);
  170.         I2C_WriteByte(0x92, 0x00);
  171.         I2C_WriteByte(0x96, 0x00);
  172.         I2C_WriteByte(0x9a, 0x80);
  173.         I2C_WriteByte(0xb0, 0x84);
  174.         I2C_WriteByte(0xb1, 0x0c);
  175.         I2C_WriteByte(0xb2, 0x0e);
  176.         I2C_WriteByte(0xb3, 0x82);
  177.         I2C_WriteByte(0xb8, 0x0a);
  178.         I2C_WriteByte(0x43, 0x14);
  179.         I2C_WriteByte(0x44, 0xf0);
  180.         I2C_WriteByte(0x45, 0x34);
  181.         I2C_WriteByte(0x46, 0x58);
  182.         I2C_WriteByte(0x47, 0x28);
  183.         I2C_WriteByte(0x48, 0x3a);
  184.         I2C_WriteByte(0x59, 0x88);
  185.         I2C_WriteByte(0x5a, 0x88);
  186.         I2C_WriteByte(0x5b, 0x44);
  187.         I2C_WriteByte(0x5c, 0x67);
  188.         I2C_WriteByte(0x5d, 0x49);
  189.         I2C_WriteByte(0x5e, 0x0e);
  190.         I2C_WriteByte(0x64, 0x04);
  191.         I2C_WriteByte(0x65, 0x20);
  192.         I2C_WriteByte(0x66, 0x05);
  193.         I2C_WriteByte(0x94, 0x04);
  194.         I2C_WriteByte(0x95, 0x08);
  195.         I2C_WriteByte(0x6c, 0x0a);
  196.         I2C_WriteByte(0x6d, 0x55);
  197.         I2C_WriteByte(0x6e, 0x11);
  198.         I2C_WriteByte(0x6f, 0x9f);
  199.         I2C_WriteByte(0x6a, 0x40);
  200.         I2C_WriteByte(0x01, 0x40);
  201.         I2C_WriteByte(0x02, 0x40);
  202.         I2C_WriteByte(0x13, 0xe7);
  203.         I2C_WriteByte(0x15, 0x00);         
  204.         I2C_WriteByte(0x4f, 0x80);
  205.         I2C_WriteByte(0x50, 0x80);
  206.         I2C_WriteByte(0x51, 0x00);
  207.         I2C_WriteByte(0x52, 0x22);
  208.         I2C_WriteByte(0x53, 0x5e);
  209.         I2C_WriteByte(0x54, 0x80);
  210.         I2C_WriteByte(0x58, 0x9e);         
  211.         I2C_WriteByte(0x41, 0x08);
  212.         I2C_WriteByte(0x3f, 0x00);
  213.         I2C_WriteByte(0x75, 0x05);
  214.         I2C_WriteByte(0x76, 0xe1);
  215.         I2C_WriteByte(0x4c, 0x00);
  216.         I2C_WriteByte(0x77, 0x01);
  217.         I2C_WriteByte(0x3d, 0xc2);        
  218.         I2C_WriteByte(0x4b, 0x09);
  219.         I2C_WriteByte(0xc9, 0x60);
  220.         I2C_WriteByte(0x41, 0x38);
  221.         I2C_WriteByte(0x56, 0x40);        
  222.         I2C_WriteByte(0x34, 0x11);
  223.         I2C_WriteByte(0x3b, 0x02);                                                                 
  224.         I2C_WriteByte(0xa4, 0x89);
  225.         I2C_WriteByte(0x96, 0x00);
  226.         I2C_WriteByte(0x97, 0x30);
  227.         I2C_WriteByte(0x98, 0x20);
  228.         I2C_WriteByte(0x99, 0x30);
  229.         I2C_WriteByte(0x9a, 0x84);
  230.         I2C_WriteByte(0x9b, 0x29);
  231.         I2C_WriteByte(0x9c, 0x03);
  232.         I2C_WriteByte(0x9d, 0x4c);
  233.         I2C_WriteByte(0x9e, 0x3f);
  234.         I2C_WriteByte(0x78, 0x04);        
  235.         I2C_WriteByte(0x79, 0x01);
  236.         I2C_WriteByte(0xc8, 0xf0);
  237.         I2C_WriteByte(0x79, 0x0f);
  238.         I2C_WriteByte(0xc8, 0x00);
  239.         I2C_WriteByte(0x79, 0x10);
  240.         I2C_WriteByte(0xc8, 0x7e);
  241.         I2C_WriteByte(0x79, 0x0a);
  242.         I2C_WriteByte(0xc8, 0x80);
  243.         I2C_WriteByte(0x79, 0x0b);
  244.         I2C_WriteByte(0xc8, 0x01);
  245.         I2C_WriteByte(0x79, 0x0c);
  246.         I2C_WriteByte(0xc8, 0x0f);
  247.         I2C_WriteByte(0x79, 0x0d);
  248.         I2C_WriteByte(0xc8, 0x20);
  249.         I2C_WriteByte(0x79, 0x09);
  250.         I2C_WriteByte(0xc8, 0x80);
  251.         I2C_WriteByte(0x79, 0x02);
  252.         I2C_WriteByte(0xc8, 0xc0);
  253.         I2C_WriteByte(0x79, 0x03);
  254.         I2C_WriteByte(0xc8, 0x40);
  255.         I2C_WriteByte(0x79, 0x05);
  256.         I2C_WriteByte(0xc8, 0x30);
  257.         I2C_WriteByte(0x79, 0x26);
  258.         I2C_WriteByte(0x09, 0x00);        



  259.         /*
  260.         

  261. //        {0x3a, 0x04},//RGB
  262.         {0x12, 0x10},//QVGA  YUV
  263.         {0x3a, 0x14},//使用固定UV輸出
  264.         {0x3d, 0x80},//使用固定UV輸出
  265.                                                         //0         0       :      Y U Y V (3a:14 3d:80)
  266.                                                         //0         1       :      Y V Y U  (3a:14 3d:81)
  267.                                                         //1         0       :      U Y V Y (3a:18 3d:80)
  268.                                                         //1         1       :      V Y U Y (3a:18 3d:81)
  269.         {0x67, 0x11},//固定U值,0x11,方便測試
  270.         {0x68, 0xFF},//固定V值,0xFF,方便測試
  271. //        {0x40, 0x10},//RGB565
  272.         {0x40, 0xC0},//初始配置,YUV模式,這個(gè)寄存器必須設(shè)置,否則不好使
  273. //        {0x12, 0x14},//QVGA  RGB,


  274.            I2C_WriteByte(0x12, 0x10);
  275.            I2C_WriteByte (0x3a, 0x14);
  276.            I2C_WriteByte (0x3d, 0x80);
  277.            I2C_WriteByte(0x67, 0x11);
  278.            I2C_WriteByte(0x68, 0xFF);
  279.            I2C_WriteByte(0x40, 0xC0);
  280.          

  281.         */
  282.            I2C_WriteByte(0x12, 0x10);
  283.            I2C_WriteByte (0x3a, 0x14);
  284.            I2C_WriteByte (0x3d, 0x80);
  285.            I2C_WriteByte(0x67, 0x11);
  286.            I2C_WriteByte(0x68, 0xFF);
  287.            I2C_WriteByte(0x40, 0xC0);

  288.            LED_1(ON);
  289.            LED_2(ON);
  290. }

  291. void Read_Pic(void)
  292. {
  293.         u16 i,j;
  294.         u16 t1,t2;
  295. //以下代碼完成,圖像的采集,并顯示在tft上                                                                                         
  296.         for(i = 0; i < 240; i ++)         
  297.         {        
  298.                  if(i%6==1)
  299.                 {
  300.                         for(j = 0; j < 320; j ++)
  301.                         {
  302.                                 if (j<160)
  303.                                 {
  304.                                     //獲得一個(gè)Y分量的過程                                                                                
  305.                                         FIFO_RCK_L;                                       
  306.                                         FIFO_RCK_H;                                                
  307.                                         t1=(0x00ff&GPIOC->IDR);                                         
  308.                                         FIFO_RCK_L;                                                
  309.                                         FIFO_RCK_H;                                                
  310.                                         t2=(0x00ff&GPIOC->IDR);
  311.         
  312.                                         //跳過一個(gè)點(diǎn),隔開取點(diǎn)
  313.                                     FIFO_RCK_L;                                       
  314.                                         FIFO_RCK_H;                                                
  315.                                         t2=(0x00ff&GPIOC->IDR);                                         
  316.                                         FIFO_RCK_L;                                                
  317.                                         FIFO_RCK_H;                                                
  318.                                         t2=(0x00ff&GPIOC->IDR);
  319.                                         PIC[TrueLine][j]=t1;
  320.                                         }
  321.                     }
  322.                   TrueLine++;
  323.                 }
  324.                 else
  325.                 {          //否則跳過這些像素點(diǎn)
  326.                       for(j = 0; j < 320; j ++)
  327.                         {
  328.                                 FIFO_RCK_L;                                       
  329.                                 FIFO_RCK_H;                                                
  330.                                 t2=(0x00ff&GPIOC->IDR);                                         
  331.                                 FIFO_RCK_L;                                                
  332.                                 FIFO_RCK_H;                                                
  333.                                 t2=(0x00ff&GPIOC->IDR);
  334.                         }
  335.                 }
  336.         }
  337.         FIFO_OE_H;                           //禁止FIFO輸出
  338. }
  339. void Send_Pic(void)
  340. {
  341.         u8 i;
  342.         u8 j;
  343.         USART_ClearFlag(USART1, USART_FLAG_TC);
  344.         USART_SendData(USART1,0xff);
  345.           while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  346.         for(i=0;i<40;i++)
  347.         {
  348.                 for(j=0;j<160;j++)
  349.                 {
  350.                         USART_ClearFlag(USART1, USART_FLAG_TC);
  351.                           USART_SendData(USART1,PIC[i][j]);
  352.                           while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  353.                 }
  354.         }
  355. }

  356. void I2C_Configuration(void)
  357. {
  358.         GPIO_InitTypeDef I2C;
  359.         /*開漏輸出,速度50MHZ*/        
  360.         I2C.GPIO_Speed=GPIO_Speed_50MHz;
  361.         /*必須設(shè)置成開漏模式*/
  362.         I2C.GPIO_Mode=GPIO_Mode_Out_OD;
  363.         //I2C SDA
  364.         RCC_APB2PeriphClockCmd(SDA_Clock,ENABLE);
  365.         I2C.GPIO_Pin=SDA_Pin;
  366.         GPIO_Init(SDA_Port,&I2C);
  367.         //I2C SCL
  368.         RCC_APB2PeriphClockCmd(SCL_Clock,ENABLE);
  369.         I2C.GPIO_Pin=SCL_Pin;
  370.         GPIO_Init(SCL_Port,&I2C);
  371.         SCL_H;
  372.         SDA_H;
  373. }
  374. /*
  375. *********************************************************************************************************
  376. *        函數(shù)名稱:I2C_Start()
  377. *        函數(shù)功能:I2C開始序列
  378. *        輸入形參:
  379. *        返回值:
  380. *        函數(shù)說明:當(dāng)SCL高電平時(shí),SDA出現(xiàn)一個(gè)下跳沿表示I2C總線啟動信號
  381. *********************************************************************************************************
  382. */

  383. void I2C_Start(void)
  384. {
  385.            SDA_H;
  386.         delay_us(100);
  387.         SCL_H;//延時(shí)5us 等待電平穩(wěn)定
  388.         delay_us(100);
  389.         SDA_L;
  390.         delay_us(100);
  391.         SCL_L;        
  392.         delay_us(100);
  393.         
  394. }

  395. /*
  396. *********************************************************************************************************
  397. *        函數(shù)名稱:I2C_Stop(void)
  398. *        函數(shù)功能:發(fā)送I2C總線停止信號
  399. *        輸入形參:無
  400. *        返回值:  無
  401. *        函數(shù)說明:當(dāng)SCL高電平時(shí),SDA出現(xiàn)一個(gè)上跳沿表示I2C總線停止信號
  402. *********************************************************************************************************
  403. */

  404. void I2C_Stop(void)
  405. {
  406.         SDA_L;
  407.         delay_us(100);
  408.         SCL_H;
  409.         delay_us(100);
  410.         SDA_H;
  411.         delay_us(100);

  412. }

  413. /*
  414. *********************************************************************************************************
  415. *        函 數(shù) 名: i2c_SendByte
  416. *        功能說明: CPU向I2C總線設(shè)備發(fā)送8bit數(shù)據(jù)
  417. *        形    參:_ucByte : 等待發(fā)送的字節(jié)
  418. *        返 回 值: 無
  419. *********************************************************************************************************
  420. */

  421. void I2C_SendByte(uint8_t _ucByte)
  422. {
  423.         uint8_t i;
  424.         SCL_L;//發(fā)送之前先拉低
  425.         for (i = 0; i < 8; i++)
  426.         {               
  427.                 if (_ucByte & 0x80)
  428.                 {
  429.                         SDA_H;
  430.                 }
  431.                 else
  432.                 {
  433.                         SDA_L;
  434.                 }
  435.                 _ucByte <<= 1;        /* 左移一個(gè)bit */
  436.                 delay_us(100);
  437.                 SCL_H;//高電平采集數(shù)據(jù)
  438.                 delay_us(100);
  439.                 SCL_L;
  440.                 delay_us(100);
  441.                 if (i == 7)
  442.                 {
  443.                          SDA_H; // 釋放總線
  444.                 }        
  445.         }
  446. }

  447. /*
  448. *********************************************************************************************************
  449. *        函 數(shù) 名: i2c_ReadByte
  450. *        功能說明: CPU從I2C總線設(shè)備讀取8bit數(shù)據(jù)
  451. *        形    參:無
  452. *        返 回 值: 讀到的數(shù)據(jù)
  453. *********************************************************************************************************
  454. */

  455. uint8_t I2C_ReadByte(void)
  456. {
  457.         uint8_t i;
  458.         uint8_t value;
  459.         /* 讀到第1個(gè)bit為數(shù)據(jù)的bit7 */
  460.         value = 0;
  461.         SCL_L;

  462.         for (i = 0; i < 8; i++)
  463.         {
  464.                 value <<= 1;
  465.                 SCL_H;
  466.                 delay_us(100);
  467.                 if (I2C_SDA_READ())
  468.                 {
  469.                         value++;
  470.                 }
  471.                 else
  472.                 {
  473.                
  474.                 }
  475.                 SCL_L;
  476.                 delay_us(100);
  477.         }
  478.         return value;
  479. }

  480. /*
  481. *********************************************************************************************************
  482. *        函 數(shù) 名: i2c_WaitAck
  483. *        功能說明: CPU產(chǎn)生一個(gè)時(shí)鐘,并讀取器件的ACK應(yīng)答信號
  484. *        形    參:無
  485. *        返 回 值: 返回0表示正確應(yīng)答,1表示無器件響應(yīng)
  486. *********************************************************************************************************
  487. */

  488. uint8_t I2C_WaitAck(void)
  489. {
  490.         uint8_t re=0;
  491.         SCL_L;
  492.         SDA_H;        /* CPU釋放SDA總線 */        
  493.         SCL_H;        /* CPU驅(qū)動SCL = 1, 此時(shí)器件會返回ACK應(yīng)答 */
  494.         delay_us(100);
  495.         if(I2C_SDA_READ())
  496.         {
  497.                  re=1;                 
  498.         }
  499.         else
  500.         {
  501.                 re=0;
  502.         }  
  503.         SCL_L;
  504.         delay_us(100);
  505.         return re;
  506. }

  507. /*
  508. *********************************************************************************************************
  509. *        函 數(shù) 名: i2c_Ack
  510. *        功能說明: CPU產(chǎn)生一個(gè)ACK信號
  511. *        形    參:無
  512. *        返 回 值: 無
  513. *********************************************************************************************************
  514. */

  515. void I2C_Ack(void)
  516. {
  517.         /* CPU驅(qū)動SDA = 0 */
  518.         SCL_L;
  519.         delay_us(10);
  520.         SDA_L;
  521.         delay_us(10);        
  522.         /* CPU產(chǎn)生1個(gè)時(shí)鐘 */
  523.         SCL_H;
  524.         delay_us(10);        
  525.         SCL_L;
  526.         delay_us(10);
  527. }

  528. /*
  529. *********************************************************************************************************
  530. *        函 數(shù) 名: i2c_NAck
  531. *        功能說明: CPU產(chǎn)生1個(gè)NACK信號
  532. *        形    參:無
  533. *        返 回 值: 無
  534. *********************************************************************************************************
  535. */
  536. void I2C_NAck(void)
  537. {
  538.         /* CPU驅(qū)動SDA = 1 */
  539.         SDA_H;
  540.         delay_us(100);        
  541.         /* CPU產(chǎn)生1個(gè)時(shí)鐘 */
  542.         SCL_H;
  543.         delay_us(100);        
  544.         SCL_L;
  545.         delay_us(100);
  546.         SDA_H;
  547.         delay_us(100);

  548. }
  549. /*******************************************************************************
  550. * Function Name  : I2C_WriteByte
  551. * Description    : 寫一字節(jié)數(shù)據(jù)
  552. * Input          : - WriteAddress: 待寫入地址
  553. *                      - SendByte: 待寫入數(shù)據(jù)
  554. *                  - DeviceAddress: 器件類型
  555. * Output         : None
  556. * Return         : 返回為:=1成功寫入,=0失敗
  557. * Attention                 : None
  558. *******************************************************************************/
  559. int I2C_WriteByte( uint16_t WriteAddress , uint8_t SendByte )
  560. {
  561.         I2C_Start();
  562.         delay_us(100);
  563.         //發(fā)送器件地址
  564.         I2C_SendByte(ADDR_OV7670);
  565.         //如果器件沒有應(yīng)答,那么就發(fā)送停止信號
  566.         if(I2C_WaitAck()==1)
  567.         {
  568.                 I2C_Stop();
  569.                 printf("器件沒有應(yīng)答\n"); //調(diào)試使用
  570.                 return 0;
  571.         }
  572.         delay_us(5);
  573.     I2C_SendByte((uint8_t)(WriteAddress & 0x00FF));   /* 設(shè)置低起始地址 */  
  574.         //如果器件沒有應(yīng)答,那么就發(fā)送停止信號
  575.         if(I2C_WaitAck()==1)
  576.         {
  577.                 I2C_Stop();
  578.                 printf("寫寄存器地址失敗\n"); //調(diào)試使用
  579.                 return 0;
  580.         }
  581.         I2C_SendByte(SendByte);   /* 設(shè)置低起始地址寫寄存器數(shù)據(jù) */  
  582.         //如果器件沒有應(yīng)答,那么就發(fā)送停止信號
  583.         if(I2C_WaitAck()==1)
  584.         {
  585.                 I2C_Stop();
  586.                 printf("寫寄存器內(nèi)容失敗\n"); //調(diào)試使用
  587.                 return 0;
  588.         }
  589.         I2C_Stop();
  590.         return 1;

  591. }
  592. //讀書菊
  593. uint8_t I2C_ReadOneByte(uint8_t Address)
  594. {
  595.         uint8_t  temp;
  596.         I2C_Start();
  597.         delay_us(100);
  598.         //        寫器件地址
  599.         I2C_SendByte(ADDR_OV7670);
  600.         //如果器件沒有應(yīng)答,那么就發(fā)送停止信號
  601.         if(I2C_WaitAck()==1)
  602.         {
  603.                 I2C_Stop();
  604.                 printf("器件沒有應(yīng)答\n"); //調(diào)試使用
  605.                 return 0;
  606.         }
  607.         delay_us(5);
  608.         I2C_SendByte(Address);
  609.         //如果器件沒有應(yīng)答,那么就發(fā)送停止信號
  610.         if(I2C_WaitAck()==1)
  611.         {
  612.                 I2C_Stop();
  613.                 printf("寫寄存器地址失敗\n"); //調(diào)試使用
  614.                 return 0;
  615.         }
  616.         I2C_Stop();
  617.         delay_us(500);
  618.         //開始讀
  619.         I2C_Start();
  620.         //發(fā)送讀命令
  621.         I2C_SendByte(ADDR_OV7670|0x01);
  622.         if(I2C_WaitAck()==1)
  623.         {
  624.                 I2C_Stop();
  625.                 printf("讀失敗\n"); //調(diào)試使用
  626.                 return 0;
  627.         }
  628.         delay_us(100);
  629.         temp=I2C_ReadByte();
  630.            I2C_NAck();
  631.         I2C_Stop();
  632.         return temp;
  633. }

  634. int main(void)
  635. {
  636.         /*硬件初始化*/
  637.         Board_Init();
  638.         /*應(yīng)用函數(shù)*/
  639.         Application();
  640.         /*正常情況下不會執(zhí)行到這一步*/
  641.         return 0;
  642. }
復(fù)制代碼

AL422b.pdf

254.28 KB, 下載次數(shù): 4, 下載積分: 黑幣 -5

CMOS_FIFO電路.pdf

55.08 KB, 下載次數(shù): 8, 下載積分: 黑幣 -5

FIFO尺寸圖.pdf

163.14 KB, 下載次數(shù): 6, 下載積分: 黑幣 -5

OmniVision_ProductGuide[1].pdf

674.09 KB, 下載次數(shù): 4, 下載積分: 黑幣 -5

OV7670_DS_(1_4).pdf

738.26 KB, 下載次數(shù): 4, 下載積分: 黑幣 -5

OV7670帶FIFO的CMOS攝像頭使用說明.pdf

2.75 MB, 下載次數(shù): 8, 下載積分: 黑幣 -5

OV7670照相模組硬件應(yīng)用指南1.01 OVT.pdf

892.67 KB, 下載次數(shù): 9, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费看片国产 | 欧美激情欧美激情在线五月 | 亚洲精品国产第一综合99久久 | 亚欧洲精品在线视频免费观看 | 欧美h视频 | 久久国产精品久久久久久久久久 | 九九热免费视频在线观看 | 欧美激情一区 | 精品三级在线观看 | 国产精品theporn | 一区二区三区视频在线观看 | 日韩精品一区二区三区 | 免费一区| 在线观看视频一区 | 无码日韩精品一区二区免费 | 欧美a级成人淫片免费看 | 国产精品视频一区二区三 | 精品久久久久久久久久久下田 | 精品亚洲一区二区三区 | 久久精品中文字幕 | 欧美日韩国产在线 | 成年女人免费v片 | 久久久久久免费毛片精品 | 日韩精品在线网站 | 在线播放中文字幕 | 国产精品自拍视频网站 | 国产激情91久久精品导航 | xxx国产精品视频 | 中文字幕av在线一二三区 | 国产高清在线视频 | 国产色99精品9i | 福利视频亚洲 | 亚洲视频在线一区 | 中文字幕日韩三级 | 99爱视频| 国产xxxx搡xxxxx搡麻豆 | 国产精品成人一区二区三区 | 色综合天天天天做夜夜夜夜做 | 老头搡老女人毛片视频在线看 | 日韩三级 | 在线观看视频一区 |