/*!
* 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通信协议的更多相关文章

  1. OV摄像头图像采集基础知识总结

    目前FPGA用于图像采集 传输 处理 显示应用越来越多,主要原因是图像处理领域的火热以及FPGA强大的并行处理能力.本文以OV7725为例,对摄像头使用方面的基础知识做个小的总结,为后续做个铺垫. 下 ...

  2. 摄像头驱动0V7725学习笔记连载(三):0V7725 SCCB时序的实现

    上一篇博客主要是讲解了关于需要配置的重要寄存器,那么接下来就是要通过SCCB接口实现对OV7725的配置.参考<OmniVision Serial Camera Control Bus (SCC ...

  3. 摄像头驱动OV7725学习笔记连载(二):0V7725 SCCB时序的实现之寄存器配置

    上一篇博客主要介绍了OV7725的电气特性以及SCCB接口的时序和输出一帧图像的时序图以及数据的拼接.输出一帧图像与输出时钟PCLK有关. 上图是OV7725实现的整体框架,有点丑.FPGA描述SCC ...

  4. 解决OV系列摄像头寄存器读数据无法收到的问题

    最近工作中接了一款OV7725的sensor,由于平台已经接过很多的家的sensor也就没有太当回事.问题出现的很奇怪,再看了 register map后基本确定了要尽心register  R/W测试 ...

  5. 摄像头驱动OV7725学习笔记连载(一):OV7725 电器特性和时序图

    OV(豪威科技)已经被中国财团收购.这个昔日的大佬,最终走下神坛. 关于OVsensor的资料包括,OV7725的简介(OmniVsion_OV7725),OV7725的数据手册(OV7725_Dat ...

  6. 协议——SCCB与IIC的区别

    SCCB(Serial Camera Control Bus,串行摄像头控制总线)是由OV(OmniVision的简称)公司定义和发展的三线式串行总线,该总线控制着摄像头大部分的功能,包括图像数据格式 ...

  7. 人工智能"眼睛"——摄像头

    摄像头机器视觉人工智能的"眼睛",其重要性在嵌入式领域不言而喻.但是如何理解和使用摄像头却是一个非常棘手的问题.本文主要针对调试摄像头过程中遇到的问题,对摄像头的基本原理及概述进行 ...

  8. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

  9. SLAM+语音机器人DIY系列:(三)感知与大脑——4.音响麦克风与摄像头

    摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...

随机推荐

  1. 换行符\r \n LF

    前言:在对照PSR-2规范时,看到文件结尾必须要以Unix LF(linefeed)结尾,不懂查~ 来源于:http://www.cppblog.com/prayer/archive/2009/08/ ...

  2. UVA - 247 Calling Circles Floyd判圈

    思路:利用的Floyd判圈,如果i能到j,j也能到i说明i和j在同一个圈里.每个人的名字可用map编号.最后DFS打印答案即可. AC代码 #include <cstdio> #inclu ...

  3. Luogu P1747 好奇怪的游戏

    题目背景 <爱与愁的故事第三弹·shopping>娱乐章. 调调口味来道水题. 题目描述 爱与愁大神坐在公交车上无聊,于是玩起了手机.一款奇怪的游戏进入了爱与愁大神的眼帘:***(游戏名被 ...

  4. Flex中的FusionCharts 2D柱形图

    1.2D柱形图源码 <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:f ...

  5. R语言︱文本挖掘套餐包之——XML+SnowballC+tm包

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- R语言︱文本挖掘套餐包之--XML+tm+Sn ...

  6. Flex中的FusionCharts 2D面积图

    Flex中的FusionCharts 2D面积图 1.源码 <?xml version="1.0" encoding="utf-8"?> <s ...

  7. org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir

    1.错误描述 org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir svn: Co ...

  8. VxWorks启动过程详解(上)

    vxworks有三种映像: VxWorks Image的文件类型有三种 Loadable Images:由Boot-ROM引导通过网口或串口下载到RAM ROM-based Images(压缩/没有压 ...

  9. org.hibernate.MappingException:Unknown entity:java.util.ArrayList

    1.错误描述 [CQ] ERROR [http-apr-8888-exec-3] com.opensymphony.xwork2.util.logging.commons.CommonsLogger. ...

  10. 前端框架Vue入门

    1.Vue简介 Vue是一套构建用户界面的渐进性框架.Vue采用自底向上增量开发的设计,其关注点在图层,与angular的区别就在这里,它关注的是图层,而angular注释的是数据. 2.与React ...