当前位置: 首页 > news >正文

模拟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启动器&#xff0c;可以将安卓手机桌面变成iOS样子&#xff0c;还有iOS的开机动画和景深效果&#xff01; 下载链接&#xff1a;【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、不用交叉验证的情况&#xff1a; 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&#xff0c;并完成路径配置。 &#xff08;本文提供了gitee下载&#xff0c;国外的Github下载较慢。&#xff09;...

MyBatis - DAO 接口(Mapper.xml)支持方法重载吗?

方法重载&#xff08;Method Overloading&#xff09;是指在同一个类中定义多个方法&#xff0c;它们具有相同的方法名但参数列表不同。 Dao 在 MyBatis 的 DAO 层接口中&#xff0c;是允许方法重载的。 在 DAO 层接口中&#xff0c;可以根据不同的需求和条件定义多个方法&am…...

SAP PI之Rest adapter

一&#xff0c;简介 REST风格接口是以http为传输协议&#xff0c;以xml或json或text为有效负载。下图展示了REST到XI再返回的一个过程&#xff0c;一个REST接口包含的信息有&#xff1a;服务URL、URL中带的参数、http方法(post/get/put等)、http头部、body部分的有效载荷。而X…...

推荐几个Github高星GoLang管理系统

在Web开发领域&#xff0c;Go语言&#xff08;Golang&#xff09;以其高效、简洁、高并发等特性逐渐成为许多开发者的首选语言。有许多优秀的Go语言Web后台管理系统&#xff0c;这些项目星星众多&#xff0c;提供了丰富的功能和良好的代码质量。本文将介绍一些GitHub高星的GoLa…...

生成式对抗网络GAN

Generative Adversarial Nets由伊恩古德费洛&#xff08;Ian J.Goodfellow&#xff09;等人于2014年发表在Conference on Neural Information Processing Systems (NeurIPS)上。NeurIPS是机器学习和计算神经科学领域的顶级国际学术会议之一。 1. GAN在哪些领域大放异彩 图像生…...

Python如何使用Excel文件

使用Python操作Office——EXCEL 首先介绍下office win32 com接口&#xff0c;这个是MS为自动化提供的操作接口&#xff0c;比如我们打开一个EXCEL文档&#xff0c;就可以在里面编辑VB脚本&#xff0c;实现我们自己的效果。对于这种一本万利的买卖&#xff0c;Python怎么能放过…...

前端基础:回顾es6相关知识

Author note(题记)&#xff1a; ECMAscript is international standard of javascript。 ECMA 是 js的国际标准版语言。 let and const 为什么之前用var现在需要用let&#xff0c;const呢&#xff1f; 其实就是因为规范作用域的问题。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换为十六进制&#xff1a;xid printf "%x \n" 6036 根据16进制格式的线程ID查找线程堆栈信息 jstack 60355 |grep ebcb -A…...

RXJS中Subject, BehaviorSubject, ReplaySubject, AsyncSubject的区别?

在RxJS&#xff08;Reactive Extensions for JavaScript&#xff09;中&#xff0c;Subject、BehaviorSubject、ReplaySubject和AsyncSubject都是Observable的变体&#xff0c;它们用于处理观察者模式中的不同场景。以下是它们之间的主要区别&#xff1a; 1、Subject: 是一种特…...

【算法题】55. 跳跃游戏

题目 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff…...

工业企业能源管理平台,可以帮助企业解决哪些方面的能源问题?

随着全球工业化进程的加快&#xff0c;工业企业在生产经营过程中消耗的能源也越来越庞大。能源成本的上升和环境保护的压力使得工业企业对能源管理的重要性有了深刻的认识。为了提高能源利用效率、降低能源消耗、减少环境污染&#xff0c;工业企业在能源管理方面迫切需要一套规…...

LLM:Training Compute-Optimal Large Language Models

论文&#xff1a;https://arxiv.org/pdf/2203.15556.pdf 发表&#xff1a;2022 前文回顾&#xff1a; OpenAI在2020年提出《Scaling Laws for Neural Language Models》&#xff1a;Scaling Laws(缩放法则&#xff09;也一直影响了后续大模型的训练。其给出的结论是最佳计算效…...

http跟https有什么区别?

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和HTTPS&#xff08;HTTP Secure&#xff09;是两种不同的通信协议&#xff0c;它们在数据传输的安全性方面有明显的区别&#xff1a; 1. 安全性&#xff1a; - HTTP&#xff1a;是一种明文传输协议&#xff0c;数…...

python flask学生管理系统

预览 前端 jquery css html bootstrap: 4.x 后端 python: 3.6.x flask: 2.0.x 数据库 mysql: 5.7 学生管理模块 登录、退出查看个人信息、修改个人信息成绩查询查看已选课程选课、取消选课搜索课程课程列表分页功能 教师模块 登录、退出查看个人信息、修改个人信息录入…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...