305

帖子

0

TA的资源

一粒金砂(高级)

21
 
旺宝电子 发表于 2015-3-24 10:56
五、 SCCB通讯协议

1 I2C 总线I2C总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。I2C 总线支持任何IC 生产过程(CMOS、双极性)。通过串行数据(SDA)线和串行时钟 (SCL)线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别(无论是微控制器——MCU、LCD 驱动器、存储器或键盘接口),而且都可以作为一个发送器或接收器(由器件的功能决定)。LCD 驱动器只能作为接收器,而存储器则既可以接收又可以发送数据。除了发送器和接收器外,器件在执行数据传输时也可以被看作是主机或从机。主机是初始化总线的数据传输并产生允许传输的时钟信号 的器件。此时,任何被寻址的器件都被认为是从机。 2 SCCB总线SCCB是OmniVision公司定制的串行摄像头控制总线,用于对摄像头的寄存器进行读写,以达到对摄像头输出图像的控制。两线制SCCB 与I2C 总线类似,是一种双向二线制同步串行总线。SCCB 的数据传输由主器件控制,主器件能够发出数据传输启动信号、时钟信号以及传送结束时的停止信号。通常主器件都是微处理器,它寻址访问的设备称为从器件。为了进行通讯,每个接到SCCB 的设备都有一个唯一的地址( ID) ,使用软件来识别总线上的从器件,省去了从器件的片选。因此,只需要两根线(串行时钟线SIO_C 和串行数据线SIO_D) ,挂接到总线上的器件就能相互进行信息传递。组成SCCB的SIO_C和SIO_D必须经过上拉电阻RP接到正电源上,连接到总线的器件的输出级必需为“开漏”或“开集”的形式,以便在多个主或从需求仲裁的况下完成线与的功能。
在SCCB 协议中定义开始和停止条件如下:开始条件:在SIO_C为高电平时,SIO_D 出现一个下降则SCCB 开始传输;停止条件:在SIO_C 为高电平时,SIO_D 出现一个上升沿,则SCCB 停止传输。 除了开始和停止状态,在数据传输时,当SIO_C为高电平时,必需保证SIO_D上的数据的稳定,也就是说,SIO_D上的数据只能在SIO_C 为低电平时改变。与I2C总线类似,SCCB的基本传输格式如图3所示,完整的数据传输包括两个或三个阶段。每一阶段包中含9 位二进制数据,其中高8 位为所要传输的8 位数据,最低位根据主器件的数据传输是读操作还是写操作而确定。在进行主器件写操作时,全部阶段的最低位均是无关位(低或高电平均可) ;读操作时,第一阶段的最低位是无关位,第二阶段的最低位位NA ———主器件驱动为高电平有效。






在SCCB 协议定义了两种写操作,即三相写操作和两相写操作。三相写操作是往从器件的目的寄存器中写入数据。在三相写操作中,第一阶段写从器件的8 位IDW 和无关位,第二阶段写从器件目标寄存器的8 位地址和无关位,第三阶段写要求写入寄存器的8 位数据和无关位;两相写操作只有三相写操作的前两个阶段。两相写操作的目的是
为了确定读操作中的从器件地址,这是因为两相读操作不能提供所要求读取的寄存器的地址。SCCB 协议定义了两读操作,它用于读取从器件目的寄存器中的数据。在第一阶段中写从器件读操作8 位IDR 和无关位,在第二阶段中读取寄
存器中的8 位数据和写NA bit 。在两阶段读循环操作前,必需有一个两相或三相的写循环操作,以提供读操作中的寄存器地址。

六、 应用编程
1 硬件连接图
2 软件设计2.1 系统初始化(SystemInit
对系统设备进行初始化设置,初始化完成后所有设备都处于正常工作状态,这时可以进行图像采集和LCD输出显示。
以下为金龙107的参考代码:
Init_KEY();                                        //初始化按键
Init_Usart();                                        //初始化串口
Usart_Configuration(115200);        //配置波特率
Printf("串口初始化完成\r\n");
LCD_Init();                                        //初始化显示屏
LCD_Clear(0x0000);                        //显示黑色背景
Init_OV7670();                                //初始化Sensor
LCD_WindowMax(0,0,240,320);        //设置显示窗口大小
while(1)
{
图像采集过程
}
2.2 OV7670初始化过程
摄像头初始化包括SCCB总线端口配置、ID号检测和寄存器初始化列表配置。
uint8_t Init_OV7670(void)
{
        GPIO_SCCB();                         //SCCB总线端口配置
Init_XCLK_ON();                         //OV7670的输入时钟配置
wrOV7670Reg(0x12, 0x80);        //复位SCCB总线
(……)                                //检测OV7670芯片ID
(……)                                //OV7670初始化列表配置
GPIO_OV7670();                        //初始化FIFO和中断引脚
set_qvga();                                //设置Sensor图像输出格式为QVGA
}
2.2.1 SCCB总线端口配置
GPIO_SCCB();        //这是函数名,以下为函数内容
GPIO_InitTypeDef  GPIO_InitStructure;                                                  //定义初始化结构变量
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC, ENABLE); //启用SCCBIO口时钟
GPIO_InitStructure        .GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;                  //定义SCCB总线IO
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置IO口输出模式为复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;          //配置SCCB输出速率为50赫兹
GPIO_Init (GPIOC, &GPIO_InitStructure);                                  //初始化SCCB总线IO
2.2.2 OV7670的输入时钟配置
OV7670要正常工作必须外部提供一个时钟信号MCLKMCLK可以通过配置IO口提供一个时钟源,也可以通过外部晶振提供时钟源。当OV7670完成初始化之后会产生一个数据输出的同步时钟PCLKPCLK是通过OV7670内部寄存器配置产生,可以配置想要的频率输出,这个频率会直接影响OV7670的图像输出帧率。
Init_XCLK_ON();        //这是函数名,以下为函数内容
GPIO_InitTypeDef  GPIO_InitStructure;                                                  //定义初始化结构变量
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE);//启用摄像头IO口时钟
GPIO_InitStructure        .GPIO_Pin = OV7670_XCLK_BIT;                 //定义摄像头输入时钟IO
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置IO口输出模式为复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //配置时钟输出速率为50赫兹
GPIO_Init (GPIOA, &GPIO_InitStructure);                                  //初始化时钟输出IO
RCC_MCOConfig( RCC_MCO_HSE);                                          //使能外部晶振作为OV7670时钟
2.2.3 检测OV7670芯片ID
wrOV7670Reg(0x12, temp);                                                //复位SCCB
rdOV7660Reg(0x0a, &ovidmsb);                                        //读产品的高位序列号
if(ovidmsb !=0x76)  return 0;                                        //检测ID值,OV7670的高位ID值是0x76
rdOV7660Reg(0x0b, &ovidlsb );                                         //读产品的低位序列号
if(ovidlsb !=0x73)  return 0;                                         //检测ID值,OV7670的低位ID值是0x73
2.2.4 OV7670初始化列表配置
初始化摄像头主要就是把配置列表的地址和值填写到OV7670对应的寄存器地址和寄存器值。填写完OV7670的寄存器后,OV7670就会按寄存器配置列表的配置模式进行工作。
CHANGE_REG_NUM:指定配置寄存器列表有多少组
change_reg[CHANGE_REG_NUM][2]:OV7670寄存器初始化列表
每一组数据都是由寄存器地址和寄存器值构成,通过FOR循环把所有数组的寄存器值填写到OV7670对应的寄存器里面,看下面代码:
        for(i=0;i
        {
                if( 0 == wrOV7670Reg(change_reg[0],change_reg[1]))//填写寄存器值
                {
                        return 0;                                                                                 //错误反回0
                }
        }
2.2.5 初始化FIFO和中断引脚
void GPIO_OV7670(void)
{
        GPIO_FIFO();                  //AL422缓存引脚配置
        EXTI_OV7670();                //摄像头帧同步信号中断引脚配置 VSYNC
}

此帖出自stm32/stm8论坛
个人签名http://openmcu.taobao.com]77[/url]
 

回复

305

帖子

0

TA的资源

一粒金砂(高级)

22
 
六、 应用编程
1 硬件连接图
2 软件设计2.1 系统初始化(SystemInit
对系统设备进行初始化设置,初始化完成后所有设备都处于正常工作状态,这时可以进行图像采集和LCD输出显示。
以下为金龙107的参考代码:
Init_KEY();                                        //初始化按键
Init_Usart();                                        //初始化串口
Usart_Configuration(115200);        //配置波特率
Printf("串口初始化完成\r\n");
LCD_Init();                                        //初始化显示屏
LCD_Clear(0x0000);                        //显示黑色背景
Init_OV7670();                                //初始化Sensor
LCD_WindowMax(0,0,240,320);        //设置显示窗口大小
while(1)
{
图像采集过程
}
2.2 OV7670初始化过程
摄像头初始化包括SCCB总线端口配置、ID号检测和寄存器初始化列表配置。
uint8_t Init_OV7670(void)
{
        GPIO_SCCB();                         //SCCB总线端口配置
Init_XCLK_ON();                         //OV7670的输入时钟配置
wrOV7670Reg(0x12, 0x80);        //复位SCCB总线
(……)                                //检测OV7670芯片ID
(……)                                //OV7670初始化列表配置
GPIO_OV7670();                        //初始化FIFO和中断引脚
set_qvga();                                //设置Sensor图像输出格式为QVGA
}
2.2.1 SCCB总线端口配置
GPIO_SCCB();        //这是函数名,以下为函数内容
GPIO_InitTypeDef  GPIO_InitStructure;                                                  //定义初始化结构变量
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC, ENABLE); //启用SCCBIO口时钟
GPIO_InitStructure        .GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;                  //定义SCCB总线IO
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置IO口输出模式为复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;          //配置SCCB输出速率为50赫兹
GPIO_Init (GPIOC, &GPIO_InitStructure);                                  //初始化SCCB总线IO
2.2.2 OV7670的输入时钟配置
OV7670要正常工作必须外部提供一个时钟信号MCLKMCLK可以通过配置IO口提供一个时钟源,也可以通过外部晶振提供时钟源。当OV7670完成初始化之后会产生一个数据输出的同步时钟PCLKPCLK是通过OV7670内部寄存器配置产生,可以配置想要的频率输出,这个频率会直接影响OV7670的图像输出帧率。
Init_XCLK_ON();        //这是函数名,以下为函数内容
GPIO_InitTypeDef  GPIO_InitStructure;                                                  //定义初始化结构变量
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE);//启用摄像头IO口时钟
GPIO_InitStructure        .GPIO_Pin = OV7670_XCLK_BIT;                 //定义摄像头输入时钟IO
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置IO口输出模式为复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //配置时钟输出速率为50赫兹
GPIO_Init (GPIOA, &GPIO_InitStructure);                                  //初始化时钟输出IO
RCC_MCOConfig( RCC_MCO_HSE);                                          //使能外部晶振作为OV7670时钟
2.2.3 检测OV7670芯片ID
wrOV7670Reg(0x12, temp);                                                //复位SCCB
rdOV7660Reg(0x0a, &ovidmsb);                                        //读产品的高位序列号
if(ovidmsb !=0x76)  return 0;                                        //检测ID值,OV7670的高位ID值是0x76
rdOV7660Reg(0x0b, &ovidlsb );                                         //读产品的低位序列号
if(ovidlsb !=0x73)  return 0;                                         //检测ID值,OV7670的低位ID值是0x73
2.2.4 OV7670初始化列表配置
初始化摄像头主要就是把配置列表的地址和值填写到OV7670对应的寄存器地址和寄存器值。填写完OV7670的寄存器后,OV7670就会按寄存器配置列表的配置模式进行工作。
CHANGE_REG_NUM:指定配置寄存器列表有多少组
change_reg[CHANGE_REG_NUM][2]:OV7670寄存器初始化列表
每一组数据都是由寄存器地址和寄存器值构成,通过FOR循环把所有数组的寄存器值填写到OV7670对应的寄存器里面,看下面代码:
        for(i=0;i
        {
                if( 0 == wrOV7670Reg(change_reg[0],change_reg[1]))//填写寄存器值
                {
                        return 0;                                                                                 //错误反回0
                }
        }
2.2.5 初始化FIFO和中断引脚
void GPIO_OV7670(void)
{
        GPIO_FIFO();                  //AL422缓存引脚配置
        EXTI_OV7670();                //摄像头帧同步信号中断引脚配置 VSYNC
}
2.2.6 设置OV7670图像输出格式
void set_qvga(void)        //设置QVGA输出
{   
        while(1!= wrOV7670Reg(0x12, 0x14));//设置输出格式RAW,大小QVGA
        wrOV7670Reg(0x17, 0x16);//HSTART,输出格式-行频开始高八位(低三位在HREF[2:0])
        wrOV7670Reg(0x18, 0x04);        //HSTOP,输出格式-行频结束高八位(低三位在HREF[5:3])
        wrOV7670Reg(0x19, 0x03); //VSTRT 输出格式-场频开始高八位(低二位在VREF[1:0])
        wrOV7670Reg(0x1A, 0x7B); //VSTOP,输出格式-场频结束高八位(低二位在VREF[3:2])
        wrOV7670Reg(0x03, 0x0a);        //VREF        位[3:2]VREF结束的低两位(高八位见VSTOP[7:0])
                                                                        位[1:0]VREF开始的低两位(高八位见VSTOP[7:0])
        wrOV7670Reg(0x70, 0x35);        //SCALING_XSC,水平缩放系数
        wrOV7670Reg(0x71, 0x3a);         //SCALING_YSC,垂直缩放系数
        wrOV7670Reg(0x72, 0x11);        //SCALING_DCWCTR,DCW控制
        wrOV7670Reg(0x73, 0xF7);        //SCALING_PC,旁路DSP缩放时钟分频控制
        wrOV7670Reg(0xA2, 0x02);        //SCALING_PCLK_DELAY,像素始终延迟
        wrOV7670Reg(0xac, 0x0);        //亮度
}
void set_cif(void)                //设置CIF输出
{      
        while(1!= wrOV7670Reg(0x12, 0x24)); //设置输出格式RAW,大小CIF
        wrOV7670Reg(0x17, 0x15);//HSTART,输出格式-行频开始高八位(低三位在HREF[2:0])
        wrOV7670Reg(0x18, 0x0B);        //HSTOP,输出格式-行频结束高八位(低三位在HREF[5:3])
        wrOV7670Reg(0x19, 0x03); //VSTRT 输出格式-场频开始高八位(低二位在VREF[1:0])
        wrOV7670Reg(0x1A, 0x7b); //VSTOP,输出格式-场频结束高八位(低二位在VREF[3:2]);
        wrOV7670Reg(0x03, 0x0a);        //VREF        位[3:2]VREF结束的低两位(高八位见VSTOP[7:0])
                                                                        位[1:0]VREF开始的低两位(高八位见VSTOP[7:0])
        wrOV7670Reg(0x32, 0xb6);        //HREF,HREF控制
[7:6]:HREF沿距数据输出的偏移
[5:3]:HREF结束的低3(8位在HSTOP)
[2:0]:HREF开始的低3(8位在HSTOP)
        wrOV7670Reg(0x70, 0x3A); //SCALING_XSC,水平缩放系数
        wrOV7670Reg(0x71, 0x35); //SCALING_YSC,垂直缩放系数
        wrOV7670Reg(0x72, 0x11); //SCALING_DCWCTR,DCW控制
        wrOV7670Reg(0x73, 0xF2);        //SCALING_PC,旁路DSP缩放时钟分频控制
        wrOV7670Reg(0xA2, 0x03); //SCALING_PCLK_DELAY,像素始终延迟
}
void set_light(unsigned char i)        //设置亮度
{
        wrOV7670Reg(0x55, i);                //BRIGHT,亮度控制
}

此帖出自stm32/stm8论坛
 
个人签名http://openmcu.taobao.com]77[/url]
 

回复

272

帖子

0

TA的资源

一粒金砂(初级)

23
 
牛牛顶顶顶
此帖出自stm32/stm8论坛
 
 

回复

305

帖子

0

TA的资源

一粒金砂(高级)

24
 
2.3 图像采集过程2.3.1 采集思路
图像采集就是从FIFO缓冲器AL422B读取一帧图像,然后在LCD屏上显示出来。
(1) 检测当前一帧是否被读取过,如果被读取过就直接跳过,等待下一帧新的图像;
(2) 按照AL422B的工作时序读取一帧图像数据;
一个FOR循环读两次,一次读8位,两次就刚好一个16RGB565的像素点。
一帧图像宽高是320×240=76800个像素点,循环76800次读完一帧图像。
(3) 等待读取下一帧新的图像数据,也就是下一次While(1) 循环的开始。
2.3.2 代码分析:
While(1)                //循环扫描图像,一个循环显示一帧图像。
{
if(Frame_Writed)                        //检测当前一帧图像地否被读取过
{                                                //如果是新的一帧图像,就进行图像采集
        Frame_Write_Status=1;        //标记图像采集状态
        FIFO_RCLK_L;                 //数据在上升沿输出,下面可直接给一个上升沿
        LCD_WR_REG(0x22);
        LCD_RD(1);                        //读使能
        LCD_CS(0);
        LCD_RS(1);                        //1表示数据
        for(index = 0; index <76800; index++)        //320*240=76800个像素点
        {                                                                //读一帧图像,在屏上显示
                FIFO_RCLK_H;         //数据在上升沿输出
                FIFO_RCLK_L;
                Dat=FIFO_DATA_PIN<<8;        //读取高8位数据到Dat
FIFO_RCLK_H;         //数据在上升沿输出
                FIFO_RCLK_L;
                GPIOE->ODR=(Dat|(FIFO_DATA_PIN));        //读取低8位数据到Dat
//从PE口输出16位数据Dat
                GPIOD->BRR = (1<<14);//0x4000;        // LCD_WR(PD14)置0
                GPIOD->BSRR = (1<<14);//0x4000;        //LCD_WR(PD14)置1
//显示16位数据图像
        }
        LCD_CS(1);       
        Frame_Write_Status=0; //清除图像采集状态
        Frame_Writed=0;                //标记当前一帧图像已经被读取过
        while(Frame_Writed);         //等待下一帧图像数据
}
}

此帖出自stm32/stm8论坛
 
个人签名http://openmcu.taobao.com]77[/url]
 
 

回复

305

帖子

0

TA的资源

一粒金砂(高级)

25
 
 
个人签名http://openmcu.taobao.com]77[/url]
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

26
 
文档在哪里下载
此帖出自stm32/stm8论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

27
 
顶楼主。学习下
此帖出自stm32/stm8论坛
 
 
 

回复

45

帖子

0

TA的资源

一粒金砂(中级)

28
 
哈哈,虽然网上零零散散的文档很多,这个资料写得够详细。
此帖出自stm32/stm8论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

29
 

fifo只能用来拍照,做图像就显得累赘,107没有dcmi,差点意思

此帖出自stm32/stm8论坛
 
 
 

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

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【有奖直播】2025是德科技数字月-数字新品来助阵
直播时间:3月19日(周三)14:00
直播奖励:小米口红充电宝、倍思充电线、是德科技十周年鼠标垫

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表