#ifndef IIC_H
#define IIC_H
#include <CommonType.h>
#include <Delay.h>
#define IIC_BITSEQHL 0
#define IIC_BITSEQLH 1
typedef void (*PFNIICSetPin)(BIT btValue);
typedef BIT (*PFNIICGetPin)(void);
typedef struct tagFNIIC
{
BIT btIIC_LL; /*正逻辑或负逻辑*/
BIT btIIC_HH;
INT8U nIICBitSeq;
PFNIICSetPin pfnSetIICSDA;
PFNIICGetPin pfnGetIICSDA;
PFNIICSetPin pfnSetIICSCL;
PFNIICGetPin pfnGetIICSCL;
}FNIIC, *PFNIIC;
/*****************函数声明*****************/
void IICStart(PFNIIC pfnIIC);
void IICStop(PFNIIC pfnIIC);
void IICSendBit(PFNIIC pfnIIC, BIT btValue);
BOOL IICSendAckBit(PFNIIC pfnIIC, BIT btValue);
BOOL IICReceiveAckBit(PFNIIC pfnIIC, BIT btCompare);
INT8U IICReceiveBits8(PFNIIC pfnIIC, INT8U nBitsNumber);
void IICSendBits8(PFNIIC pfnIIC, INT8U nValue, INT8U nBitsNumber);
BYTE IICReceiveByte(PFNIIC pfnIIC);
void IICSendByte(PFNIIC pfnIIC, BYTE byValue);
#endif /*IIC_H*/
#include <IIC.h>
void IICStart(PFNIIC pfnIIC)
{
pfnIIC->pfnSetIICSDA(pfnIIC->btIIC_HH);
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_HH);
pfnIIC->pfnSetIICSDA(pfnIIC->btIIC_LL);
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_LL);
}
void IICStop(PFNIIC pfnIIC)
{
pfnIIC->pfnSetIICSDA(pfnIIC->btIIC_LL);
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_HH);
pfnIIC->pfnSetIICSDA(pfnIIC->btIIC_HH);
}
BIT IICReceiveBit(PFNIIC pfnIIC)
{
BIT btReturn = 0;
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_LL);
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_HH);
btReturn = pfnIIC->pfnGetIICSDA();
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_LL);
return btReturn;
}
void IICSendBit(PFNIIC pfnIIC, BIT btValue)
{
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_LL);
pfnIIC->pfnSetIICSDA(btValue);
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_HH);
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_LL);
}
BOOL IICSendAckBit(PFNIIC pfnIIC, BIT btValue)
{
INT8U i=0xff;
BIT btRet = 0;
while(i--)
{
IICSendBit(pfnIIC, btValue);
btRet = pfnIIC->pfnGetIICSDA();
if (btValue == btRet)
break;
}
return ((btValue == btRet)?TRUE:FALSE);
}
BOOL IICReceiveAckBit(PFNIIC pfnIIC, BIT btCompare)
{
INT8U i = 0xff;
BIT btRet = 0x00;
pfnIIC->pfnSetIICSDA(pfnIIC->btIIC_HH);
while(i--)
{
btRet = IICReceiveBit(pfnIIC);
if (btCompare == btRet)
break;
}
return ((btRet==btCompare)?TRUE:FALSE);
}
INT8U IICReceiveBits8(PFNIIC pfnIIC, INT8U nBitsNumber)
{
INT8U nResult = 0;
INT8U i = 0;
if (pfnIIC->nIICBitSeq == IIC_BITSEQHL)
{
for (i=0; i<nBitsNumber; i++)
nResult |= (IICReceiveBit(pfnIIC)<<(nBitsNumber-i-1));
}
else if (pfnIIC->nIICBitSeq == IIC_BITSEQLH)
{
for (i=0; i<nBitsNumber; i++)
nResult |= (IICReceiveBit(pfnIIC)<<(i));
}
return nResult;
}
void IICSendBits8(PFNIIC pfnIIC, INT8U nValue, INT8U nBitsNumber)
{
INT8U i = 0;
if (pfnIIC->nIICBitSeq == IIC_BITSEQHL)
{
for (i=0; i<nBitsNumber; i++)
IICSendBit(pfnIIC, TOBIT(nValue>>(nBitsNumber-i-1)));
}
else if (pfnIIC->nIICBitSeq == IIC_BITSEQLH)
{
for (i=0; i<nBitsNumber; i++)
IICSendBit(pfnIIC, TOBIT(nValue>>(i)));
}
}
BYTE IICReceiveByte(PFNIIC pfnIIC)
{
return IICReceiveBits8(pfnIIC, 8);
}
void IICSendByte(PFNIIC pfnIIC, BYTE byValue)
{
IICSendBits8(pfnIIC, byValue, 8);
}
相关推荐
Linux I2C总线(一)I2C驱动框架
Linux I2C总线 Linux I2C总线(一)I2C驱动框架 Linux I2C总线(二)I2C设备驱动编写方法 Linux I2C总线(一)I2C驱动框架 文章目录Linux I2C总线(一)I2C驱动框架一、Linux I2C驱动的主要对象1.1 I2C总线1.2 I2C设备1.3 I2C驱动1.4 I2C适配器二、Linux I2C驱动框架三、I2C驱动框架源码剖析3.1 注册I2C设...
关于树莓派4B两个i2c通道的理解(SDA.0以及SCL.0或者SDA.1以及SCL.1无法使用问题)
树莓派学习笔记: 关于树莓派4B两个i2c通道的使用和理解(SDA.0以及SCL.0如何使用问题) 在做项目的时候需要用到AD/DA转换,选用了PCF8591转换芯片,但是在实际使用中,发现打开了 https://www.raspberrypi.org/forums/viewtopic.php?t=105138 https://www.raspberrypi.org/documentation/configuration/device-tree.md ...
关于树莓派4B两个I2C通道(I2C0、I2C1)的总结
通过以下链接了解到smbus.SMBus(0)是对I2C接口的调用。并且从中了解到树莓派4B拥有两个I2C接口,分别为I2C0和I2C1。最近在使用JY901九轴陀螺仪,使用到了I2C通信。
IIC概述(一)
概述: I²C 是Inter-Integrated Circuit的缩写,发音为"eye-squared cee" or "eye-two-cee" , 它是一种两线接口。 I²C 只是用两条双向的线,一条 Serial Data Line (SDA) ,另一条Serial Clock (SCL)。 SCL:上升沿将数据输入到每个EEPROM器件中;下降沿驱动EEPROM器件输出数据。(边沿
Linux I2C(二) - I2C软硬件架构
i2c软硬件架构
I2C子系统
串行、半双工总线,主要用于低速、近距离的芯片之间的通信。
硬件I2C与模拟I2C
硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C;一般也较为稳定,但是程序较为繁琐。硬件(固件)I2C是直接调用内部寄存器进行配置;而软件I2C是没有寄存器这个概念的。 软件I2C一般是使用GPIO管脚,用软件控制SCL,SDA线输出高低电平,模拟i2c协议的时序。 例如下面这段I2C的开始和结束信号,我们使用GPI...
三维视觉智能焊接系统:免示教技术的工业应用实践
本文深入探讨了三维视觉智能焊接系统中免示教技术的工业应用实践。该系统通过三维视觉相机实时扫描工件,自动识别焊缝并生成轨迹,将产线换型时间从数小时缩短至几分钟,显著提升了生产柔性。文章详细解析了其核心硬件、算法及工厂部署流程,并展望了与数字孪生、工艺智能化融合的未来趋势。
I2C相关结构体讲解:i2c_adapter、i2c_algorithm、i2c_msg
在Linux中,I2C框架包含多个关键结构,负责操作系统与I2C设备之间的通信。i2c_adapter代表物理I2C控制器,并定义了访问I2C总线的算法。i2c_algorithm结构提供了master_xfer等方法用于I2C数据传输,以及用于SMBus协议处理的smbus_xfer方法。i2c_msg结构描述了一次I2C传输,包括从设备地址、数据缓冲区和传输标志。这些组件共同确保内核与I2C设备之间的通信顺畅,支持不同的传输协议和模式。
U盘文件变exe?3步教你用火绒+批处理脚本恢复隐藏文档(附注册表修复)
本文详细解析了U盘文件被病毒隐藏并伪装成exe文件的原理,并提供了三步解决方案:首先使用火绒安全软件进行全盘查杀清除病毒;其次通过批处理脚本批量恢复被隐藏的文件属性;最后修复被篡改的注册表设置,彻底解决文件无法显示的问题,帮助用户安全找回数据并加固系统防护。
【SPSS实战】手动实现Quade非参数协方差分析:从数据准备到结果解读
本文详细介绍了在SPSS中手动实现Quade非参数协方差分析的实战方法。当数据不满足正态分布等参数检验假设时,通过将协变量和因变量转换为秩,并利用秩回归残差进行Kruskal-Wallis组间比较,提供了一种清晰、可操作的近似解决方案。该方法有效解决了非正态数据的协变量调整问题,适用于实验研究和调查数据分析。
I2C通信——I2C通信的理论介绍
以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除 。
基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的田间杂草检测系统(深度学习模型+UI界面+Python代码+训练数据集)
精准农业是现代农业发展的核心方向,其中杂草的实时、准确检测是减少除草剂滥用、实现变量喷施的关键技术瓶颈。本文详细阐述了一套完整的、基于YOLO(You Only Look Once)系列目标检测算法的田间杂草检测系统。系统覆盖从模型对比选型(YOLOv5, YOLOv6, YOLOv7, YOLOv8)、自定义数据集构建与标注、模型训练与优化,到最终构建基于PyQt5/FastAPI/Gradio的可视化UI界面的全流程。本文提供了完整的Python代码、项目结构、训练技巧及公开数据集指引,旨在为农
Linux之I2C驱动
在 Linux 内核中 I2C 的体系结构分为 3 个部分:①: I2C 核心提供了I2C 总线驱动和设备驱动的注册、 注销方法②: I2C 总线驱动是对I2C 硬件体系结构中适配器端的实现, 适配器可由CPU 控制, 甚至可以直接集成在 CPU 内部。I2C 总线驱动就是 SOC 的,也叫做。③: I2C 设备驱动是对,设备一般挂接在受 CPU 控制的 I2C 适配器上, 通过 I2C 适配器与 CPU 交换数据。
SwinTransformer改进(5):与CBAM结合的视觉模型
这个模型的核心思想是将Swin Transformer的强大特征提取能力与CBAM的注意力机制相结合,以提升模型对重要特征的关注度。CBAM模块:包含通道注意力和空间注意力两个子模块Swin Transformer主干网络:作为基础特征提取器集成结构:在Swin Transformer的不同阶段插入CBAM模块使用移动窗口(Moving Window)机制减少计算量层次化设计,特征图逐渐缩小,通道数逐渐增加在不同阶段使用Patch Merging进行下采样。
支付宝个人年度账单爬虫实战:从扫码登录到数据解析的全链路解析
作为一名数据爱好者或量化分析师,获取自己的支付宝年度账单不仅是对个人消费行为的深度复盘,更是实现"数据自主权"的第一步。print(f"{row['year']}年: 收入{row['total_income']:.2f} | 支出{row['total_expense']:.2f} | 结余{row['net_savings']:.2f}"){"category": "餐饮", "amount": 12000, "count": 345},"""打开登录页,等待用户扫码,返回Cookie字典"""
【I2C】Linux使用GPIO模拟I2C
在Linux项目中,如果出现硬件硬件I2C不够用的情况下,我们就可以通过GPIO模拟I2C来解决。Lnux内核的i2c-gpio是使用GPIO模拟I2C协议的驱动,在内核中已经实现了,我们要做的只需要配置2个GPIO(SDA和SCL)即可。i2c-gpioi2c-gpio.c解析设备树中的引脚配置信息提供GPIO SDA和SCL引脚配置接口。向I2C Core注册一个adapter提供I2C通信时的算法,然后通过i2c-gpio.c提供GPIO配置接口来收发数据。注册成功后,
【ACP】2025-最新-疑难题解析- 练习二汇总
全球加速是优化公网访问的,负载均衡是分发流量的,公网 NAT 网关是处理公网 IP 的,高速通道是建私网连接但不直接提供固定私网地址功能。C 是客户端加密方式,D 是 ECS 云盘加密,都不属于 OSS 服务器端加密。某企业想使用云服务器 ECS + 负载均衡 SLB + 弹性伸缩 (Auto Scaling) 的架构搭建一个企业级门户网站,技术负责人对于负载均衡和弹性伸缩配合使用没有经验,于是将他理解的两种产品配合使用的一些技术细节列成了一个表单,并请作为架构师的您帮他做一下鉴别,以下哪些项是正确的?
I2C产生死锁的原因是什么、避免、解决I2C死锁
本文简述的是关于I2C在实际使用中产生死锁的问题, 本片文章会介绍如下内容, 什么是死锁, I2C产生死锁的原因, 导致的后果、以及如何解决。
MATLAB算法实战应用案例精讲-【数模应用】梯度提升决策树(GDBT)(附python代码)
GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,它在被提出之初就和SVM一起被认为是泛化能力(generalization)较强的算法。近些年更因为被用于搜索排序的机器学习模型而引起大家关注。.........
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
I2C协议——I2C框图和I2C通信过程
1.软件模拟和硬件模拟的概念 所谓软件模拟,即直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平。如控制产生 I2C 的起始信号时,见图 24-5,先控制作为 SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL线切换为低电平,这样就输出了一个标准的 I2C起始信号。 &n
锂电池充电器电路设计 里面有电路
锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。
硬件I2C和软件I2C的区别
硬件I2C(Inter-Integrated Circuit)是STM32等微控制器内置的串行通信接口,采用**同步、半双工**方式,通过**SCL(时钟线)**和**SDA(数据线)**两根信号线与外部设备通信。- **主模式(Master Mode)**:在这种模式下,STM32充当总线主机,负责发起通信并生成时钟信号(SCL),可以作为发送端或接收端。- **从设备地址固定**:通常由硬件引脚(A0~A2)设置,例如AT24C02的默认地址为**0xA0**(写)/ **0xA1**(读);
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
Linux的i2c驱动详解
1 简介 I2C 总线仅仅使用 SCL 、 SDA 两根信号线就实现了设备之间的数据交互,极大地简化对硬件资源和 PCB 板布线空间的占用。因此, I2C 总线被非常广泛地应用在 EEPROM 、实时钟、小型 LCD 等设备与 CPU 的接口中。 Lin
【彻底搞懂I2C总线(一)什么是I2C?什么是I2C总线?什么是I2C规范】
【彻底搞懂I2C总线(一)什么是I2C?什么是I2C总线?什么是I2C规范】
I2C驱动实例详解
I2C驱动框架 Linux的I2C体系结构分为3个组成部分,分别是I2C核心、I2C总线驱动和I2C设备驱动。 I2C控制器的驱动程序称为总线驱动(包含两部分,硬件相关、硬件无关),将I2C设备的驱动程序称为设备驱动(包含两部分,IIC设备匹配相关、I2C设备操作方法集)。 I2C驱动设计过程简述: I2C设备注册: 首先要向I2C核心层注册一个I2C设备,I2C总线会将其添加到总线的设备链表中,然后遍历总线上的驱动链表,查看二者是否匹配,如果匹配就调用驱动的probe函数。 I2C驱动注册: 注册I2C
STM32F103,HAL实现软件I2C,与硬件I2C
1,硬件I2C HAL_I2C_Mem_Write(&hi2c1,0x88,0,I2C_MEMADD_SIZE_8BIT,0,0,0X10);//写 HAL_I2C_Master_Receive(&hi2c1,0x89,(uint8_t*)datatemp,4,0x10);//读 2软件I2C #ifndef __MYI2C_H__ #define __MYI2C...
1825



被折叠的 条评论
为什么被折叠?



