模拟IIC通信
模拟IIC通信
IIC
- 模拟IIC通信
- 底层接口
- 时间控制(通信速度)
- 功能实现
- 对外接口
- EEPROM相关
底层接口
device是可以用来增加多个IIC设备管理的
void I2C_SET_SCL(unsigned char device, unsigned char bit_value)
{bit_value ? MCU_SCL_H() : MCU_SCL_L();
}void I2C_SET_SDA(unsigned char device, unsigned char bit_value)
{bit_value ? MCU_SDA_H() : MCU_SDA_L();
}void I2C_SDA_OUT(unsigned char device)
{MCU_SDA_OUT();
}void I2C_SDA_IN(unsigned char device)
{MCU_SDA_IN();
}bool I2C_SDA_DATA(unsigned char device)
{bool boolDat = 0;boolDat = MCU_SDA_DATA();return boolDat;
}
时间控制(通信速度)
void i2c_delay_us(unsigned int us)
{unsigned int i, j;for (i = 0; i <= us; i++){for (j = 0; j <= 20; j++);}
}
功能实现
/* I2C CODE */
#define i2c_speed_time1 40
#define i2c_speed_time2 20
#define i2c_speed_time3 20void I2C_Start(unsigned char device)
{I2C_SDA_OUT(device);I2C_SET_SDA(device, 1);I2C_SET_SCL(device, 1);i2c_delay_us(i2c_speed_time1);I2C_SET_SDA(device, 0);i2c_delay_us(i2c_speed_time1);I2C_SET_SCL(device, 0);I2C_SET_SCL(device, 0);
}void I2C_Stop(unsigned char device)
{I2C_SDA_OUT(device);I2C_SET_SCL(device, 0);I2C_SET_SDA(device, 0);i2c_delay_us(i2c_speed_time1);I2C_SET_SCL(device, 1);I2C_SET_SDA(device, 1);i2c_delay_us(i2c_speed_time1);
}unsigned char I2C_Wait_Ack(unsigned char device)
{unsigned char ucErrTime = 0;I2C_SDA_IN(device);i2c_delay_us(i2c_speed_time2);I2C_SET_SCL(device, 1);i2c_delay_us(i2c_speed_time2);while(I2C_SDA_DATA(device)){ucErrTime++;if(ucErrTime>250){I2C_Stop(device);return 1;}}I2C_SET_SCL(device, 0);return 0;
}void I2C_Ack(unsigned char device)
{I2C_SET_SCL(device, 0);I2C_SDA_OUT(device);I2C_SET_SDA(device, 0);i2c_delay_us(i2c_speed_time3);I2C_SET_SCL(device, 1);i2c_delay_us(i2c_speed_time3);I2C_SET_SCL(device, 0);
}void I2C_NAck(unsigned char device)
{I2C_SET_SCL(device, 0);I2C_SDA_OUT(device);I2C_SET_SDA(device, 1);i2c_delay_us(i2c_speed_time3);I2C_SET_SCL(device, 1);i2c_delay_us(i2c_speed_time3);I2C_SET_SCL(device, 0);
}void I2C_Send_Byte(unsigned char device, unsigned char txd)
{unsigned char t;I2C_SDA_OUT(device);I2C_SET_SCL(device, 0);for(t=0; t<8; t++){if(txd & 0x80){I2C_SET_SDA(device, 1);}else{I2C_SET_SDA(device, 0);}txd <<= 1;i2c_delay_us(i2c_speed_time3);I2C_SET_SCL(device, 1);i2c_delay_us(i2c_speed_time3);I2C_SET_SCL(device, 0);i2c_delay_us(i2c_speed_time3);}
}unsigned char I2C_Read_Byte(unsigned char device, unsigned char ack)
{unsigned char i,receive=0;I2C_SDA_IN(device);for(i=0; i<8; i++){I2C_SET_SCL(device, 0);i2c_delay_us(i2c_speed_time3);I2C_SET_SCL(device, 1);receive <<= 1;if(I2C_SDA_DATA(device)){receive++;}i2c_delay_us(i2c_speed_time3);}if(!ack){I2C_NAck(device);}else{I2C_Ack(device);}return receive;
}
对外接口
unsigned char i2c_write_byte(unsigned char addr, unsigned char offset, unsigned char len, unsigned char *pdata, unsigned char device)
{unsigned char i;I2C_Start(device);I2C_Send_Byte(device, addr);I2C_Wait_Ack(device);I2C_Send_Byte(device, offset);I2C_Wait_Ack(device);for (i=0; i<len-1; i++){I2C_Send_Byte(device, *pdata);I2C_Wait_Ack(device);pdata++;}I2C_Send_Byte(device, *pdata);I2C_Wait_Ack(device);I2C_Stop(device);return 1;
}unsigned char i2c_read_byte(unsigned char addr, unsigned char offset, unsigned char len, unsigned char *pdata,unsigned char ack,unsigned char device)
{unsigned char i;I2C_Start(device);I2C_Send_Byte(device, addr);I2C_Wait_Ack(device);I2C_Send_Byte(device, offset);I2C_Wait_Ack(device);I2C_Start(device);I2C_Send_Byte(device, addr|0x01);I2C_Wait_Ack(device);for (i=0; i<len-1; i++){*pdata = I2C_Read_Byte(device, ack);pdata++;}*pdata = I2C_Read_Byte(device, 0);I2C_Stop(device);return 1;
}/* 连续读,无应答 */
void I2C_ReadBurst_Ack(unsigned char addr,unsigned char offset,unsigned char len,unsigned char* pdata,unsigned char device)
{i2c_read_byte( addr, offset, len, pdata, 0, device);
}/* 连续读,有应答 */
void I2C_ReadBurst_NAck(unsigned char addr,unsigned char offset,unsigned char len,unsigned char* pdata,unsigned char device)
{i2c_read_byte( addr, offset, len, pdata, 1, device );
}/* 连续写 */
void I2C_WriteBurst(unsigned char addr,unsigned char offset,unsigned char len,unsigned char* pdata,unsigned char device)
{i2c_write_byte( addr, offset, len, pdata, device );
}/* 单个读 */
unsigned char I2C_ReadByte(unsigned char addr, unsigned char offset,unsigned char device)
{unsigned char u8RdData;i2c_read_byte( addr, offset, 1, &u8RdData, 0, device );return u8RdData;
}/* 单个写 */
void I2C_WriteByte(unsigned char addr, unsigned char offset, unsigned char u8Data,unsigned char device)
{i2c_write_byte( addr, offset, 1, &u8Data, device );
}
EEPROM相关
/* EEPROM */
unsigned char EEPROM_ReadByte(unsigned short int addr, unsigned char device)
{unsigned char temp = 0;I2C_Start(device);I2C_Send_Byte(device, 0XA0);I2C_Wait_Ack(device);I2C_Send_Byte(device, addr);I2C_Wait_Ack(device);I2C_Start(device);I2C_Send_Byte(device, 0XA1);I2C_Wait_Ack(device);temp = I2C_Read_Byte(device, 0);I2C_Stop(device);return temp;
}void EEPROM_WriteByte(unsigned char addr, unsigned char dat, unsigned char device)
{i2c_delay_us(2);I2C_Start(device);I2C_Send_Byte(device, 0XA0);I2C_Wait_Ack(device);I2C_Send_Byte(device, addr);I2C_Wait_Ack(device);I2C_Send_Byte(device, dat);I2C_Wait_Ack(device);I2C_Stop(device);delay_ms(5); // 延时
}void EEROM_WriteNByte(const unsigned char *pbuf, unsigned char device)
{int iCurNum, iCur8ByteNum ;for (iCurNum = 0; iCurNum < 32; iCurNum ++ ){I2C_Start(device);I2C_Send_Byte(device, 0XA0);I2C_Wait_Ack(device);I2C_Send_Byte(device, iCurNum * 8);I2C_Wait_Ack(device);for (iCur8ByteNum = 0; iCur8ByteNum < 8; iCur8ByteNum ++){I2C_Send_Byte(device, pbuf[iCurNum * 8+iCur8ByteNum]);I2C_Wait_Ack(device);}I2C_Stop(device);}
}相关文章:
模拟IIC通信
模拟IIC通信 IIC 模拟IIC通信底层接口时间控制(通信速度)功能实现对外接口EEPROM相关 底层接口 device是可以用来增加多个IIC设备管理的 void I2C_SET_SCL(unsigned char device, unsigned char bit_value) {bit_value ? MCU_SCL_H() : MCU_SCL_L(); }void I2C_SET_SDA(uns…...
安卓手机变iOS!
Launcher iOS 16 - 安卓手机秒变iOS Launcher iOS 16 是一款iOS启动器,可以将安卓手机桌面变成iOS样子,还有iOS的开机动画和景深效果! 下载链接:【Launcher iOS 16】 ...
Spring使用注解管理Bean
引入lib包 Spring对Bean管理的常用注解 Component组件(作用在类上) Spring中提供了Component的三个衍生注解:(功能在目前为止是一致的) Controller WEB层 Service 业务层 Repository 持久层 属性注入的注解:(使用注解注入的方式,可以不用提供set方法) Value 用于注入普…...
弟12章 网络编程
文章目录 网络协议概述 p164TCP协议与UDP协议的区别 p165TCP服务器端代码的编写 p166TCP服务器端流程 TCP客户端代码的编写 p167TCP客户端流程主机和客户端的通信流程 tcp多次通信服务器端代码 p168TCP多次通信客户端代码 p169UDP的一次双向通信 p170udp通信模型udp接收方代码u…...
【sklearn练习】模型评估
一、交叉验证 cross_val_score 的使用 1、不用交叉验证的情况: from __future__ import print_function from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifieriris…...
Gazebo的模型下载。
git clone zouxu634866/gazebo_modelshttps://gitee.com/zouxu6348660/gazebo_models.git,并完成路径配置。 (本文提供了gitee下载,国外的Github下载较慢。)...
MyBatis - DAO 接口(Mapper.xml)支持方法重载吗?
方法重载(Method Overloading)是指在同一个类中定义多个方法,它们具有相同的方法名但参数列表不同。 Dao 在 MyBatis 的 DAO 层接口中,是允许方法重载的。 在 DAO 层接口中,可以根据不同的需求和条件定义多个方法&am…...
SAP PI之Rest adapter
一,简介 REST风格接口是以http为传输协议,以xml或json或text为有效负载。下图展示了REST到XI再返回的一个过程,一个REST接口包含的信息有:服务URL、URL中带的参数、http方法(post/get/put等)、http头部、body部分的有效载荷。而X…...
推荐几个Github高星GoLang管理系统
在Web开发领域,Go语言(Golang)以其高效、简洁、高并发等特性逐渐成为许多开发者的首选语言。有许多优秀的Go语言Web后台管理系统,这些项目星星众多,提供了丰富的功能和良好的代码质量。本文将介绍一些GitHub高星的GoLa…...
生成式对抗网络GAN
Generative Adversarial Nets由伊恩古德费洛(Ian J.Goodfellow)等人于2014年发表在Conference on Neural Information Processing Systems (NeurIPS)上。NeurIPS是机器学习和计算神经科学领域的顶级国际学术会议之一。 1. GAN在哪些领域大放异彩 图像生…...
Python如何使用Excel文件
使用Python操作Office——EXCEL 首先介绍下office win32 com接口,这个是MS为自动化提供的操作接口,比如我们打开一个EXCEL文档,就可以在里面编辑VB脚本,实现我们自己的效果。对于这种一本万利的买卖,Python怎么能放过…...
前端基础:回顾es6相关知识
Author note(题记): ECMAscript is international standard of javascript。 ECMA 是 js的国际标准版语言。 let and const 为什么之前用var现在需要用let,const呢? 其实就是因为规范作用域的问题。var的作用域无块级 for (var i 0; i <…...
Hive条件函数详细讲解
Hive 中的条件函数允许你在查询中基于某些条件执行逻辑操作。以下是你提到的条件函数的详细讲解,包括案例和使用注意事项: IF() 功能:根据条件返回两个表达式中的一个。语法:IF(boolean_test, value_if_true, value_if_false)案例:SELECT IF(1=1, true, false); 结果为 tr…...
java应用CPU过高查找原因
用top查到占用cpu最高的进程pid 根据进程ID找到占用CPU高的线程 ps -mp 60355 -o THREAD,tid | sort -r 用 printf "%x \n" 将tid换为十六进制:xid printf "%x \n" 6036 根据16进制格式的线程ID查找线程堆栈信息 jstack 60355 |grep ebcb -A…...
RXJS中Subject, BehaviorSubject, ReplaySubject, AsyncSubject的区别?
在RxJS(Reactive Extensions for JavaScript)中,Subject、BehaviorSubject、ReplaySubject和AsyncSubject都是Observable的变体,它们用于处理观察者模式中的不同场景。以下是它们之间的主要区别: 1、Subject: 是一种特…...
【算法题】55. 跳跃游戏
题目 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例 1ÿ…...
工业企业能源管理平台,可以帮助企业解决哪些方面的能源问题?
随着全球工业化进程的加快,工业企业在生产经营过程中消耗的能源也越来越庞大。能源成本的上升和环境保护的压力使得工业企业对能源管理的重要性有了深刻的认识。为了提高能源利用效率、降低能源消耗、减少环境污染,工业企业在能源管理方面迫切需要一套规…...
LLM:Training Compute-Optimal Large Language Models
论文:https://arxiv.org/pdf/2203.15556.pdf 发表:2022 前文回顾: OpenAI在2020年提出《Scaling Laws for Neural Language Models》:Scaling Laws(缩放法则)也一直影响了后续大模型的训练。其给出的结论是最佳计算效…...
http跟https有什么区别?
HTTP(Hypertext Transfer Protocol)和HTTPS(HTTP Secure)是两种不同的通信协议,它们在数据传输的安全性方面有明显的区别: 1. 安全性: - HTTP:是一种明文传输协议,数…...
python flask学生管理系统
预览 前端 jquery css html bootstrap: 4.x 后端 python: 3.6.x flask: 2.0.x 数据库 mysql: 5.7 学生管理模块 登录、退出查看个人信息、修改个人信息成绩查询查看已选课程选课、取消选课搜索课程课程列表分页功能 教师模块 登录、退出查看个人信息、修改个人信息录入…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
