/*!*     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, 1); //初始化SCLgpio_init  (SCCB_SDA, GPO, 1); //初始化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 0;   /* SDA线为低电平则总线忙,退出 */}SDA_DDR_OUT();SDA_L();SCCB_DELAY();SCL_L();if(SDA_IN()){SDA_DDR_OUT();return 0;   /* SDA线为高电平则总线出错,退出 */}//SDA_DDR_OUT();//SDA_L();//SCCB_delay();return 1;
}/*!*  @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 0;}SDA_DDR_OUT();SCL_L();return 1;
}/*!*  @brief      SCCB 发送的数据*  @param      SendByte    需要发送的数据*  @since      v5.0*/
static void SCCB_SendByte(uint8 SendByte)
{uint8 i = 8;while(i--){if(SendByte & 0x80)     //SDA 输出数据
        {SDA_H();}else{SDA_L();}SendByte <<= 1;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 = 8;uint8 ReceiveByte = 0;//SDA_H();//SCCB_DELAY();
    SDA_DDR_IN();while(i--){ReceiveByte <<= 1;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 = 0;while( 0 == SCCB_WriteByte_one ( WriteAddress, SendByte ) ){i++;if(i == 20){return 0 ;}}return 1;
}int SCCB_WriteByte_one( uint16 WriteAddress , uint8 SendByte )
{if(!SCCB_Start()){return 0;}SCCB_SendByte( DEV_ADR );                    /* 器件地址 */if( !SCCB_WaitAck() ){SCCB_Stop();return 0;}SCCB_SendByte((uint8)(WriteAddress & 0x00FF));   /* 设置低起始地址 */SCCB_WaitAck();SCCB_SendByte(SendByte);SCCB_WaitAck();SCCB_Stop();return 1;
}/******************************************************************************************************************* 函数名: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 = 0;while( 0 == SCCB_ReadByte_one(pBuffer, length, ReadAddress) ){i++;if(i == 30){return 0 ;}}return 1;
}int SCCB_ReadByte_one(uint8 *pBuffer,   uint16 length,   uint8 ReadAddress)
{if(!SCCB_Start()){return 0;}SCCB_SendByte( DEV_ADR );         /* 器件地址 */if( !SCCB_WaitAck() ){SCCB_Stop();return 0;}SCCB_SendByte( ReadAddress );           /* 设置低起始地址 */SCCB_WaitAck();SCCB_Stop();if(!SCCB_Start()){return 0;}SCCB_SendByte( DEV_ADR + 1 );               /* 器件地址 */if(!SCCB_WaitAck()){SCCB_Stop();return 0;}while(length){*pBuffer = SCCB_ReceiveByte();if(length == 1){SCCB_NoAck();}else{SCCB_Ack();}pBuffer++;length--;}SCCB_Stop();return 1;
}

转载于:https://www.cnblogs.com/scrazy/p/8316266.html

OV摄像头SCCB通信协议相关推荐

  1. 【FPGA】SCCB通信协议

    文章目录 一. 什么是SCCB协议? 二. SCCB时序分析 1. 起始信号 2. 停止信号 3. 数据传输 3.1 三相写传输 3.2 两相写传输:读数据第一阶段 3.3 两相读传输:读数据第二阶段 ...

  2. SCCB协议 verilog状态机定时器

    OV系列摄像头的模块采用Serial Camera Control Bus (SCCB)总线 写进行配置ov摄像头 1,SCCB有START 和STOP条件,和I2C非常类似. 2,写一寄存器分成三个 ...

  3. ”WinForm上位机+OV7670摄像头+STM32+蓝牙“图像采集系统(一)STM32驱动CMOS摄像头OV7670

    初衷:将摄像头放在防盗门猫眼位置,访客到来时,给访客拍个照,然后传到房主端显示. 现在只完成了蓝牙传输,和WinForm窗体显示,后面时间来得及的话会陆续完成WiFi传输,和手机端APK显示. 常规思 ...

  4. 【物联网智能网关-02】获取摄像头数据+显示

    在上一篇文章<通过AD采集获取温湿度>我们介绍了物联网智能网关的AD端口的使用情况,AD接口是.NET Micro Framework标准库函数之一,只要底层BSP支持就可以直接使用.但是 ...

  5. 手指静脉图像采集终端的设计和实现

    手指静脉图像采集终端的设计和实现 摘要 手指静脉识别是新兴的生物特征识别技术,以其独特的优势得到了国内外生物特征识别领域研究人员的广泛关注.本文针对手指静脉识别中的图像采集,优化图像质量等难点问题,自 ...

  6. 秉火OV7725驱动日志 第一天

    一.管脚作用 1.ov7725 SCL,SDA:OV7725的控制寄存器,通过SCL和SDA引脚写入,使用SCCB通信协议. PCLK:像素同步时钟.是由OV7725输出的信号 HREF:行同步信号 ...

  7. 基于stm32f407vet开发板的人脸识别

    这是跟小组成员一起做的单片机课程设计,下面是我们小组的报告           基于STM32的人脸识别                         摘    要   此设计以STM32F407单 ...

  8. STM32F4驱动OV7670总结

    前言:之前因为贪图便宜买了一个7块钱的ov7670摄像头,然后想用我的stm32开发板驱动起来结合rtthread做个小项目出来,但是一路上遇到了许多问题,最终没能成功,在此记录一下用stm32驱动o ...

  9. OV7670带FIFO入坑指南

    本文针对带FIFO的OV7670摄像头模块进行说明. 对于新手入坑OV7670摄像头的小白来说,入坑之路漫漫,最坑爹的是不知道入口在哪里~~下面就来简单的说一下我这几天的实验心得. 什么是带FIFO的 ...

最新文章

  1. 春节礼品:iPhone 11 抱回家
  2. mysqlshow命令的用法介绍
  3. python3 类实例化流程
  4. 一文详解微服务架构的数据设计
  5. 测试范围不统一,引发的冲突问题
  6. server xcode 云服务器_SRT推流测试及服务器搭建
  7. 转载 OAuth认证协议原理分析及使用方法
  8. php wordpress乱码,PHP問題:基于WordPress的CMS网站在文章摘要末尾出现乱码
  9. 【C语言数据结构】双向循环链表
  10. 【Advanced控制理论】Robust Control鲁棒控制(附Simulink程序)
  11. 虚拟打印机如何打印Text
  12. Linux版本查看及PS1配置
  13. ClickHouse遇见RoaringBitmap
  14. 《上古卷轴5:天际》控制台代码之配料药剂
  15. 计算营业额python_告诉你怎么用Python进行企业营运分析!盈利这么多?
  16. 三大功能护航,Amazfit跃我 PowerBuds Pro正式发售
  17. mysql decimal、numeric数据类型
  18. python生成热图_用Python生成热图
  19. 当年赫赫有名的“四大工学院”,如今都发展得怎样?依然牛气冲天!
  20. 登录企业邮箱入口,查看你不知道的企业公共邮箱优惠

热门文章

  1. 【操作系统笔记】中断和异常
  2. fps200多正常不_AMD处理器扬眉吐气,腾讯游戏不再A黑!LOL最高FPS459平均200多
  3. 24有几种封装尺寸_mmWave设备的封装应该如何处理
  4. 2021 年百度之星·程序设计大赛 - 复赛 1002 Add or Multiply 1(第2类斯特林数)
  5. C++奥赛一本通递推题解
  6. 2013蓝桥杯C++B:高斯日记;马虎的算式(2种解法)
  7. 2018年c++B:换零钞;激光样式(递归法和暴力破解)
  8. bzoj 2431: [HAOI2009]逆序对数列
  9. scipy.misc.imresize
  10. 图像椒盐噪声和高斯噪声