OV摄像头SCCB通信协议
- /*!
- * COPYRIGHT NOTICE
- * Copyright (c) 2013,山外科技
- * All rights reserved.
- * 技术讨论:山外论坛 http://www.vcan123.com
- *
- * 除注明出处外,以下所有内容版权均属山外科技所有,未经允许,不得用于商业用途,
- * 修改内容时必须保留山外科技的版权声明。
- *
- * @file VCAN_SCCB.c
- * @brief OV摄像头配置总线SCCB函数库
- * @author 山外科技
- * @version v5.0
- * @date 2013-09-01
- */
- #include "common.h"
- #include "MK60_gpio.h"
- #include "VCAN_SCCB.h"
- static void SCCB_delay(uint16 i);
- /*!
- * @brief SCCB延迟函数
- * @param time 延时时间
- * @since v5.0
- */
- static void SCCB_delay(volatile uint16 time)
- {
- while(time)
- {
- time--;
- }
- }
- /*!
- * @brief SCCB管脚配置
- * @since v5.0
- */
- void SCCB_GPIO_init(void)
- {
- gpio_init (SCCB_SCL, GPO, ); //初始化SCL
- gpio_init (SCCB_SDA, GPO, ); //初始化SDA
- port_init_NoALT(SCCB_SCL,ODO | PULLUP);
- port_init_NoALT(SCCB_SDA,ODO | PULLUP);
- }
- /*!
- * @brief SCCB起始信号
- * @since v5.0
- */
- static uint8 SCCB_Start(void)
- {
- SDA_H();
- SCL_H();
- SCCB_DELAY();
- SDA_DDR_IN();
- if(!SDA_IN())
- {
- SDA_DDR_OUT();
- return ; /* SDA线为低电平则总线忙,退出 */
- }
- SDA_DDR_OUT();
- SDA_L();
- SCCB_DELAY();
- SCL_L();
- if(SDA_IN())
- {
- SDA_DDR_OUT();
- return ; /* SDA线为高电平则总线出错,退出 */
- }
- //SDA_DDR_OUT();
- //SDA_L();
- //SCCB_delay();
- return ;
- }
- /*!
- * @brief SCCB停止信号
- * @since v5.0
- */
- static void SCCB_Stop(void)
- {
- SCL_L();
- //SCCB_DELAY();
- SDA_L();
- SCCB_DELAY();
- SCL_H();
- SCCB_DELAY();
- SDA_H();
- SCCB_DELAY();
- }
- /*!
- * @brief SCCB应答信号
- * @since v5.0
- */
- static void SCCB_Ack(void)
- {
- SCL_L();
- SCCB_DELAY();
- SDA_L();
- SCCB_DELAY();
- SCL_H();
- SCCB_DELAY();
- SCL_L();
- SCCB_DELAY();
- }
- /*!
- * @brief SCCB无应答信号
- * @since v5.0
- */
- static void SCCB_NoAck(void)
- {
- SCL_L();
- SCCB_DELAY();
- SDA_H();
- SCCB_DELAY();
- SCL_H();
- SCCB_DELAY();
- SCL_L();
- SCCB_DELAY();
- }
- /*!
- * @brief SCCB 等待应答
- * @return 应答结果(0表示无应答,1表示有应答)
- * @since v5.0
- */
- static int SCCB_WaitAck(void)
- {
- SCL_L();
- //SDA_H();
- SDA_DDR_IN();
- SCCB_DELAY();
- SCL_H();
- SCCB_DELAY();
- if(SDA_IN()) //应答为高电平,异常,通信失败
- {
- SDA_DDR_OUT();
- SCL_L();
- return ;
- }
- SDA_DDR_OUT();
- SCL_L();
- return ;
- }
- /*!
- * @brief SCCB 发送的数据
- * @param SendByte 需要发送的数据
- * @since v5.0
- */
- static void SCCB_SendByte(uint8 SendByte)
- {
- uint8 i = ;
- while(i--)
- {
- if(SendByte & 0x80) //SDA 输出数据
- {
- SDA_H();
- }
- else
- {
- SDA_L();
- }
- SendByte <<= ;
- SCCB_DELAY();
- SCL_H(); //SCL 拉高,采集信号
- SCCB_DELAY();
- SCL_L(); //SCL 时钟线拉低
- //SCCB_DELAY();
- }
- //SCL_L();
- }
- /*!
- * @brief 接收SCCB总线的数据
- * @return 接收到的数据
- * @since v5.0
- */
- static int SCCB_ReceiveByte(void)
- {
- uint8 i = ;
- uint8 ReceiveByte = ;
- //SDA_H();
- //SCCB_DELAY();
- SDA_DDR_IN();
- while(i--)
- {
- ReceiveByte <<= ;
- SCL_L();
- SCCB_DELAY();
- SCL_H();
- SCCB_DELAY();
- if(SDA_IN())
- {
- ReceiveByte |= 0x01;
- }
- }
- SDA_DDR_OUT();
- SCL_L();
- return ReceiveByte;
- }
- /*****************************************************************************************
- * 函数名:SCCB_WriteByte
- * 描述 :写一字节数据
- * 输入 :- WriteAddress: 待写入地址 - SendByte: 待写入数据 - DeviceAddress: 器件类型
- * 输出 :返回为:=1成功写入,=0失败
- * 注意 :无
- *****************************************************************************************/
- static int SCCB_WriteByte_one( uint16 WriteAddress , uint8 SendByte );
- int SCCB_WriteByte( uint16 WriteAddress , uint8 SendByte ) //考虑到用sccb的管脚模拟,比较容易失败,因此多试几次
- {
- uint8 i = ;
- while( == SCCB_WriteByte_one ( WriteAddress, SendByte ) )
- {
- i++;
- if(i == )
- {
- return ;
- }
- }
- return ;
- }
- int SCCB_WriteByte_one( uint16 WriteAddress , uint8 SendByte )
- {
- if(!SCCB_Start())
- {
- return ;
- }
- SCCB_SendByte( DEV_ADR ); /* 器件地址 */
- if( !SCCB_WaitAck() )
- {
- SCCB_Stop();
- return ;
- }
- SCCB_SendByte((uint8)(WriteAddress & 0x00FF)); /* 设置低起始地址 */
- SCCB_WaitAck();
- SCCB_SendByte(SendByte);
- SCCB_WaitAck();
- SCCB_Stop();
- return ;
- }
- /******************************************************************************************************************
- * 函数名:SCCB_ReadByte
- * 描述 :读取一串数据
- * 输入 :- pBuffer: 存放读出数据 - length: 待读出长度 - ReadAddress: 待读出地址 - DeviceAddress: 器件类型
- * 输出 :返回为:=1成功读入,=0失败
- * 注意 :无
- **********************************************************************************************************************/
- static int SCCB_ReadByte_one(uint8 *pBuffer, uint16 length, uint8 ReadAddress);
- int SCCB_ReadByte(uint8 *pBuffer, uint16 length, uint8 ReadAddress)
- {
- uint8 i = ;
- while( == SCCB_ReadByte_one(pBuffer, length, ReadAddress) )
- {
- i++;
- if(i == )
- {
- return ;
- }
- }
- return ;
- }
- int SCCB_ReadByte_one(uint8 *pBuffer, uint16 length, uint8 ReadAddress)
- {
- if(!SCCB_Start())
- {
- return ;
- }
- SCCB_SendByte( DEV_ADR ); /* 器件地址 */
- if( !SCCB_WaitAck() )
- {
- SCCB_Stop();
- return ;
- }
- SCCB_SendByte( ReadAddress ); /* 设置低起始地址 */
- SCCB_WaitAck();
- SCCB_Stop();
- if(!SCCB_Start())
- {
- return ;
- }
- SCCB_SendByte( DEV_ADR + ); /* 器件地址 */
- if(!SCCB_WaitAck())
- {
- SCCB_Stop();
- return ;
- }
- while(length)
- {
- *pBuffer = SCCB_ReceiveByte();
- if(length == )
- {
- SCCB_NoAck();
- }
- else
- {
- SCCB_Ack();
- }
- pBuffer++;
- length--;
- }
- SCCB_Stop();
- return ;
- }
OV摄像头SCCB通信协议的更多相关文章
- OV摄像头图像采集基础知识总结
目前FPGA用于图像采集 传输 处理 显示应用越来越多,主要原因是图像处理领域的火热以及FPGA强大的并行处理能力.本文以OV7725为例,对摄像头使用方面的基础知识做个小的总结,为后续做个铺垫. 下 ...
- 摄像头驱动0V7725学习笔记连载(三):0V7725 SCCB时序的实现
上一篇博客主要是讲解了关于需要配置的重要寄存器,那么接下来就是要通过SCCB接口实现对OV7725的配置.参考<OmniVision Serial Camera Control Bus (SCC ...
- 摄像头驱动OV7725学习笔记连载(二):0V7725 SCCB时序的实现之寄存器配置
上一篇博客主要介绍了OV7725的电气特性以及SCCB接口的时序和输出一帧图像的时序图以及数据的拼接.输出一帧图像与输出时钟PCLK有关. 上图是OV7725实现的整体框架,有点丑.FPGA描述SCC ...
- 解决OV系列摄像头寄存器读数据无法收到的问题
最近工作中接了一款OV7725的sensor,由于平台已经接过很多的家的sensor也就没有太当回事.问题出现的很奇怪,再看了 register map后基本确定了要尽心register R/W测试 ...
- 摄像头驱动OV7725学习笔记连载(一):OV7725 电器特性和时序图
OV(豪威科技)已经被中国财团收购.这个昔日的大佬,最终走下神坛. 关于OVsensor的资料包括,OV7725的简介(OmniVsion_OV7725),OV7725的数据手册(OV7725_Dat ...
- 协议——SCCB与IIC的区别
SCCB(Serial Camera Control Bus,串行摄像头控制总线)是由OV(OmniVision的简称)公司定义和发展的三线式串行总线,该总线控制着摄像头大部分的功能,包括图像数据格式 ...
- 人工智能"眼睛"——摄像头
摄像头机器视觉人工智能的"眼睛",其重要性在嵌入式领域不言而喻.但是如何理解和使用摄像头却是一个非常棘手的问题.本文主要针对调试摄像头过程中遇到的问题,对摄像头的基本原理及概述进行 ...
- IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习
相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...
- SLAM+语音机器人DIY系列:(三)感知与大脑——4.音响麦克风与摄像头
摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...
随机推荐
- IE兼容swiper
swiper3能完美运用在移动端,但是运用在PC端,特别是IE浏览器上不能兼容,没有效果,要使IE兼容Swiper的话必须使用swiper2,也就是idangerous.swiper.js, 下载地址 ...
- C# 使用AngleSharp 爬虫图片
AngleSharp 简介 AngleSharp是基于.NET(C#)开发的专门解析HTML源码的DLL组件.根据HTML的DOM结构操作HTML,整个DOM已传输到逻辑类结构中.这种结构可以更好的操 ...
- 搭建VUE项目的准备(利用vue-cli来构建项目)
首先需要明确的是:Vue.js 不支持 IE8 及其以下 IE 版本,一般用与移动端,基础:开启最高权限的DOS命令(否则会出现意外的错误提示) 注意:个人小推荐如果我们不知道如何才能开启最高权限 ...
- Spring Boot 2.0(二):Spring Boot 2.0尝鲜-动态 Banner
Spring Boot 2.0 提供了很多新特性,其中就有一个小彩蛋:动态 Banner,今天我们就先拿这个来尝尝鲜. 配置依赖 使用 Spring Boot 2.0 首先需要将项目依赖包替换为刚刚发 ...
- soj3129: windy和水星 -- 水星数学家 2
注意int的范围:-2147483648-2147483647 如果输入会出现溢出,这题应该就是卡的这里.其使用long long就不用考虑这个. 加深:如果输入的数是很多位,直接当做字符串处理即可. ...
- 小程序中曾经遇到的坑(1)----canvas画布
目前正在开发小程序,在开发过程中,总会遇到一些坑,而这些坑并不会有很多开发者遇到而说出来.这里先记录一条我开发过程中遇到的问题,以便后人在开发中能够更容易的解决问题!!! 首先,小程序在canvas画 ...
- 2_Add Two Numbers --LeetCode
原题如下: 思路:在一个while中遍历两个链表,直到最长的链表为空,或者没有进位.每一步获取两个链表对应的结点的值a,b,然后相加a+b.如果上一步又进位,那就加a+b+1,若由于进位加1后还产生进 ...
- JavaScript函数的柯里化(currying)
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/currying.html 什么是js函数的currying /柯里化? 说到js的柯里化,相信很多朋友都会头大.或 ...
- ActiveMQ安装及启动
最近项目组遇到MQ的问题(项目组用的IBM MQ),突然想回来看看MQ.本来就不是太熟练,闲来无事写写看看. 不多说,首先是安转ActiveMQ,官方网址:http://activemq.apache ...
- PHP_保留两位小数并且四舍五入_保留两位小数并且不四舍五入
php保留两位小数并且四舍五入 $num = 123213.666666; echo sprintf("%.2f", $num); php保留两位小数并且不四舍五入 php进一法取 ...