rt-thread开发之sccb通讯协议记录(用于ov7670)

头文件

/** Copyright (c) 2024-2024,shchl** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2024-3-26     shchl   first version*/#ifndef F4_OS_SCCB_H
#define F4_OS_SCCB_H#include "board.h"#define SCCB_ID             0X42     //OV7670的ID#define SCCB_SDA_PIN GET_PIN(D,7)
#define SCCB_SCL_PIN GET_PIN(D,6)
#define SCCB_READ_SDA rt_pin_read(SCCB_SDA_PIN)
///
void sccb_msp_init(void);uint8_t sccb_write_reg(uint8_t reg, uint8_t data);uint8_t sccb_read_reg(uint8_t reg);#endif //F4_OS_SCCB_H

源文件

/** Copyright (c) 2024-2024,shchl** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2024-3-26     shchl   first version*/#include "sccb.h"
/*------------------------------------根据对应的环境进行修改------------------------------------------------*/
#define SCCB_SCL_H rt_pin_write(SCCB_SCL_PIN, PIN_HIGH)
#define SCCB_SCL_L rt_pin_write(SCCB_SCL_PIN, PIN_LOW)
#define SCCB_SDA_H rt_pin_write(SCCB_SDA_PIN, PIN_HIGH)
#define SCCB_SDA_L rt_pin_write(SCCB_SDA_PIN, PIN_LOW)
#if 1 /*针对sda io 口 需要上拉的 情况*/
#define SCCB_SDA_OUT() rt_pin_mode(SCCB_SDA_PIN, PIN_MODE_OUTPUT)
#define SCCB_SDA_IN() rt_pin_mode(SCCB_SDA_PIN, PIN_MODE_INPUT_PULLUP)
#else
#define SCCB_SDA_OUT()
#define SCCB_SDA_IN() rt_pin_mode(SCCB_SDA_PIN,PIN_MODE_OUTPUT_OD)
#endif/*----------------------------------------------------------------------------------------------------*/
static inline void sccb_delay() {rt_hw_us_delay(50);
}//初始化SCCB接口
//CHECK OK
void sccb_msp_init(void) {SCCB_SDA_IN();rt_pin_mode(SCCB_SCL_PIN, PIN_MODE_OUTPUT);SCCB_SCL_H;SCCB_SDA_OUT();
}//SCCB起始信号
//当时钟为高的时候,数据线的高到低,为SCCB起始信号
//在激活状态下,SDA和SCL均为低电平
static void sccb_start(void) {SCCB_SDA_H;         //数据线高电平SCCB_SCL_H;        //在时钟线高的时候数据线由高至低sccb_delay();SCCB_SDA_L;sccb_delay();SCCB_SCL_L;        //数据线恢复低电平,单操作函数必要
}//SCCB停止信号
//当时钟为高的时候,数据线的低到高,为SCCB停止信号
//空闲状况下,SDA,SCL均为高电平
static void sccb_stop(void) {SCCB_SDA_L;sccb_delay();SCCB_SCL_H;sccb_delay();SCCB_SDA_H;sccb_delay();
}//产生NA信号
static void sccb_no_ack(void) {sccb_delay();SCCB_SDA_H;SCCB_SCL_H;sccb_delay();SCCB_SCL_L;sccb_delay();SCCB_SDA_L;sccb_delay();
}//SCCB,写入一个字节
//返回值:0,成功;1,失败. 
static uint8_t sccb_write_byte(uint8_t dat) {uint8_t j, res;for (j = 0; j < 8; j++) //循环8次发送数据{if (dat & 0x80)SCCB_SDA_H;elseSCCB_SDA_L;dat <<= 1;sccb_delay();SCCB_SCL_H;sccb_delay();SCCB_SCL_L;}SCCB_SDA_IN();        //设置SDA为输入sccb_delay();SCCB_SCL_H;            //接收第九位,以判断是否发送成功sccb_delay();if (SCCB_READ_SDA)res = 1;  //SDA=1发送失败,返回1else res = 0;         //SDA=0发送成功,返回0SCCB_SCL_L;SCCB_SDA_OUT();        //设置SDA为输出return res;
}//SCCB 读取一个字节
//在SCL的上升沿,数据锁存
//返回值:读到的数据
static uint8_t sccb_read_byte(void) {uint8_t temp = 0, j;SCCB_SDA_IN();        //设置SDA为输入for (j = 8; j > 0; j--)    //循环8次接收数据{sccb_delay();SCCB_SCL_H;temp = temp << 1;if (SCCB_READ_SDA)temp++;sccb_delay();SCCB_SCL_L;}SCCB_SDA_OUT();        //设置SDA为输出return temp;
}//写寄存器
//返回值:0,成功;1,失败.
uint8_t sccb_write_reg(uint8_t reg, uint8_t data) {uint8_t res = 0;sccb_start();                    //启动SCCB传输if (sccb_write_byte(SCCB_ID))res = 1;    //写器件IDsccb_delay();if (sccb_write_byte(reg))res = 1;        //写寄存器地址sccb_delay();if (sccb_write_byte(data))res = 1;    //写数据sccb_stop();return res;
}//读寄存器
//返回值:读到的寄存器值
uint8_t sccb_read_reg(uint8_t reg) {uint8_t val = 0;sccb_start();                //启动SCCB传输sccb_write_byte(SCCB_ID);        //写器件IDsccb_delay();sccb_write_byte(reg);            //写寄存器地址sccb_delay();sccb_stop();sccb_delay();//设置寄存器地址后,才是读sccb_start();sccb_write_byte(SCCB_ID | 0X01);    //发送读命令sccb_delay();val = sccb_read_byte();            //读取数据sccb_no_ack();sccb_stop();return val;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/772506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白学视觉 | 图像上的 OpenCV 算术运算

本文来源公众号“小白学视觉”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;图像上的 OpenCV 算术运算 1 OpenCV 简介 图像可以进行算术运算&#xff0c;例如加法、减法和按位运算&#xff08;AND、OR、NOT、XOR&#xff09;。…

电商系列之仓储发货

疫情3年&#xff0c;大多数人都将购买需求转移到了线上。同时由于暴涨的订单数量、还在恢复中的物流运输等因素&#xff0c;导致用户的收货时间缓慢甚至是发货时间、收货时间延后。那么笔者就从订单的仓库作业流程入手&#xff0c;分析了用户订单发货延后的原因。 受到最近疫情…

简历工具推荐

HR浏览一份简历也就25秒左右&#xff0c;如果你连「好简历」都没有&#xff0c;怎么能找到好工作呢&#xff1f; 以最简单的方式来写好简历&#xff0c;只需专注内容本身而无需关注排版。这样的效果才是我们想要的&#xff0c;这里推荐使用入职啦简历&#xff0c;这个工具最大的…

RuoYi-Vue-Plus(sa-token)

一、介绍 官网&#xff1a; Sa-Tokenhttps://sa-token.cc/index.html 特性&#xff1a; 登录与权限认证&#xff1a;支持用户登录和细粒度权限认证。会话管理&#xff1a;提供会话创建、维护和销毁功能。单点登录&#xff1a;支持单点登录&#xff0c;简化多应用登录流程。OAu…

npm安装yarn和pnpm

安装yarn&#xff1a; 首先&#xff0c;确保你的系统中已经安装了Node.js和npm。这是使用npm安装yarn的前提条件。打开命令行工具&#xff08;如终端或命令提示符&#xff09;。运行以下命令来全局安装yarn&#xff1a; npm install -g yarn 安装完成后&#xff0c;你可以通过…

聚类分析|基于层次的聚类方法及其Python实现

聚类分析|基于层次的聚类方法及其Python实现 0. 基于层次的聚类方法1. 簇间距离度量方法1.1 最小距离1.2 最大距离1.3 平均距离1.4 中心法1.5 离差平方和 2. 基于层次的聚类算法2.1 凝聚&#xff08;Agglomerative&#xff09;2.3 分裂&#xff08;Divisive&#xff09; 3. 基于…

spring boot3登录开发(整合jwt)

Spring Boot 3 整合 JWT&#xff08;JSON Web Tokens&#xff09;用于登录开发涉及多个步骤。JWT 是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于作为 JSON 对象在各方之间安全地传输信息。这些信息可以被验证和…

香港驾照好处 大陆驾驶证换香港驾照条件 大陆驾驶证换香港驾照流程

持有香港驾驶证的好处&#xff1a; 1、国际认可&#xff1a;香港驾驶证在国际上被广泛认可&#xff0c;持有该驾驶证可以在许多国家和地区自由驾驶。 2、多样性&#xff1a;香港驾驶证覆盖了多种车辆类型&#xff0c;包括轿车、摩托车、巴士、卡车等&#xff0c;持有该驾驶证…

【vue】computed和watch的区别和应用场景

Computed 和 Watch 是 Vue.js 中用于监视数据变化的两个不同特性&#xff0c;它们各自有不同的应用场景和功能。 Computed&#xff1a; 计算属性&#xff08;Computed properties&#xff09;用于声明基于其他数据属性的计算值。它具有缓存功能&#xff0c;只有在依赖的数…

GAMES Webinar 288-VR/AR专题-陆峰-混合现实中的多模态自然人机交互

感知交互增强智能 研究室虚拟现实技术与系统国家重点实验室&#xff0c;北京航空航天大学计算医学研究所&#xff0c;大数据精准医疗北京市高精尖创新中心 Perception & Hybrid Interaction (PHI) for Augmented & Affective Intelligence (A2I) We are working on v…

力扣56. 合并区间

Problem: 56. 合并区间 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.将数组按内部的一维数组的第一项按从小到大的顺序排序&#xff1b; 2.创建二维结果数组merged&#xff0c;并将排序后的数组中的第一个一维度数组存入到merged中&#xff1b; 3.从后面的一…

最长公共子序列力扣题

动态规划。 美团暑期面试题&#xff0c;没做过&#xff0c;不会啊。 这个问题的目标是找出两个字符串text1和text2的最长公共子序列的长度。 动态规划数组的初始化 首先&#xff0c;代码初始化了一个动态规划&#xff08;DP&#xff09;数组dp&#xff0c;其维度为(m 1) x …

九泰智库 | 医械周刊- Vol.17

⚖️ 法规动态 器审中心公示新一期医疗器械优先审批申请审核结果 3月22日&#xff0c;依据原国家食品药品监督管理总局《医疗器械优先审批程序》&#xff08;总局公告2016年168号&#xff09;&#xff0c;器审中心对申请优先审批的医疗器械注册申请进行了审核&#xff0c;对相关…

elasticsearch _cat/indices docs.count is different than <index>/_count

今天遇到一个问题&#xff0c;kibana中看到文档数与下面语句查询到的不同 GET /_cat/count/jiankunking_xxxxx_product_expand_test?v GET /jiankunking_xxxxx_product_expand_test/_search?track_total_hitstrue语句查询结果 epoch timestamp count 1711433785 06:16…

详解从ERP传到MES系统的数据

1、物料需求计划 MES系统提供的物料需求计划与传统BOM-MRP方式提供的物料需求计划有本质的不同。首先&#xff0c;满足产能约束、各种生产约束、优化生产调度、提高工作效率的要求。其次&#xff1a;它有详细的以分钟为单位的时间信息。将这些数据提供给ERP&#xff0c;可以大…

是德科技KEYSIGHT N9938A频谱分析仪

181/2461/8938产品概述&#xff1a; N9938A 是一款使用电池供电的便携式微波频谱分析仪&#xff1b;配置还包括全频段跟踪发生器和前置放大器、干扰分析仪、时间选通、VSWR 和反射测量、内置功率计。 N9938A FieldFox 手持式微波频谱分析仪 主要特性和功能 频率范围&#xff…

美团面试一面凉经

1.自我介绍 2.科研项目提问 没咋准备&#xff0c;说的有点没逻辑 3.问论坛项目 为什么用Redis实现登录&#xff1f;能不能用其他方式实现&#xff1f; 1、Redis 具备高性能 假如用户第一次访问 MySQL 中的某些数据。这个过程会比较慢&#xff0c;因为是从硬盘上读取的。将…

000_coolprop_in_matlab在Matlab中使用CoolProp

在Matlab中使用CoolProp 简介 CoolProp是一个开源的热力学性质库&#xff0c;可以计算多种流体的热力学性质。CoolProp支持多种编程语言&#xff0c;包括Python、C、Matlab等。本文将介绍如何在Matlab中使用CoolProp。 CoolProp官网 本文所使用的Matlab版本为R2021a。 在Ma…

每天一个数据分析题(二百二十九)

循环神经网络&#xff08;RNN&#xff09;是一种经典的神经网络。考虑到RNN的自然属性和结构&#xff0c;以下哪个任务RNN可能会比其他神经网络架构表现得更好&#xff1f; A. 从固定大小的图片中识别物体 B. 为未来几天的股票价格做时间序列预测 C. 在无标签数据上进行聚类…

C++基础--类和对象(上)--类与类成员及其成员函数

C基础--类和对象&#xff08;上&#xff09;--类与类成员及其成员函数 一、类的引入二、类的定义三、类的访问限定符及封装1、访问限定符2、封装 四、类的作用域五、类的实例化六、类的对象大小的计算七、类成员函数的 this 指针1、this指针的引出2、this指针的特性 八、总结 一…