#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...
【论文阅读】LIME:Low-light Image Enhancement via Illumination Map Estimation(笔记最全篇)
文章目录AbstractIntroductionContributionMethodSpeed-up Method(1):ALM子问题 T子问题 G子问题 Z和μ\muμSpeed-up Method(2):权重变量实验conclusion 今天要整理的一篇论文是使用传统的方法解决低照度的问题,Guo等人于2016年发表在IEEE上,论文《LIME:Low-light Image Enhance...
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设备之间的通信顺畅,支持不同的传输协议和模式。
数字IC后端实现之快速获取innovus中drv violation的所有net list
数字IC后端设计实现之快速获取innovus中drv violation的所有net list
GD32F303定时器配置:实现两路互补PWM输出与相位控制
本文详细解析了基于GD32F303定时器实现两路互补PWM输出与精确相位控制的方法。通过配置TIMER2的中间对齐模式,结合REMAP功能解决引脚复用问题,从硬件层面稳定生成相位差180度的互补PWM信号,适用于电机驱动、开关电源等对时序要求苛刻的应用场景。
I2C通信——I2C通信的理论介绍
以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除 。
告别“为了写而写”:GJB438C-2021新规下,软件文档如何真正为项目服务?
本文深入解析GJB438C-2021新规如何重构软件文档的实战价值,通过文档体系瘦身、流程再造和敏捷化实践,显著提升军工软件项目的效率。新标准删除30%冗余文档,引入动态编制法和轻量化模板,使文档编制工作量降低37%,关键路径周期缩短15%。
Linux之I2C驱动
在 Linux 内核中 I2C 的体系结构分为 3 个部分:①: I2C 核心提供了I2C 总线驱动和设备驱动的注册、 注销方法②: I2C 总线驱动是对I2C 硬件体系结构中适配器端的实现, 适配器可由CPU 控制, 甚至可以直接集成在 CPU 内部。I2C 总线驱动就是 SOC 的,也叫做。③: I2C 设备驱动是对,设备一般挂接在受 CPU 控制的 I2C 适配器上, 通过 I2C 适配器与 CPU 交换数据。
纽扣电池供电系统优化:NBM5100A与STM32F745VG组合方案
在低功耗物联网设备设计中,能量管理是核心挑战之一。纽扣电池因其体积小、成本低被广泛采用,但瞬时大电流需求常导致电压骤降和寿命缩短。通过超级电容缓冲技术,可以实现能量的细水长流式存储与集中释放。NBM5100A电源管理IC与STM32F745VG微控制器的组合方案,采用双阶段能量管理架构,先以恒定小电流充电,再通过电容释放大电流。这种方案不仅能提升系统稳定性,还能延长电池寿命3-5倍,特别适合智能门锁、无线传感器等需要间歇性高功率输出的场景。
Amazon SES 移出沙盒完整指南 & 高通过率模板
AWS SES沙盒模式转正式模式申请指南 申请正式模式需通过AWS审核,常见被拒原因包括邮件用途不清晰、缺少退订机制或发送量不合理。人工申诉需登录AWS Support Center提交服务限额提升请求,填写详细的公司信息、邮件用途及合规措施。 高通过率申诉模板需包含: 公司信息:名称、网址及与AWS的合作情况。 邮件规范:明确类型(交易/营销)、退订链接及退信处理机制。 发送计划:合理预估发送量,确保合规。 关键点:真实信息、用途清晰、退订机制完善、发送量合理。首次被拒可修改后重新提交。
【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配置接口来收发数据。注册成功后,
SAP公司间STO业务解析(包含主数据解析、后台配置解析、前台业务演示)
SAP公司间STO业务解析
I2C产生死锁的原因是什么、避免、解决I2C死锁
本文简述的是关于I2C在实际使用中产生死锁的问题, 本片文章会介绍如下内容, 什么是死锁, I2C产生死锁的原因, 导致的后果、以及如何解决。
倍福---EL2262模块飞拍配置
控制器安装了twincat3,用EL2262实现相机飞拍功能。本文档只介绍如何通过EL2262实现飞拍的触发,并不涉及视觉方面的处理 参考文章: https://author.baidu.com/home?from=bjh_article&app_id=1669190598708386 https://mp.weixin.qq.com/s/r4Iq8kOP-o4_M8vCce5M9g 1、 飞拍的应用 在大多数场合,只能当被检测工件和相机都处于静止状态下才能进行拍照,拍照完成后,再移动工件或相机,进
文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况
主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。
I2C协议——I2C框图和I2C通信过程
1.软件模拟和硬件模拟的概念 所谓软件模拟,即直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平。如控制产生 I2C 的起始信号时,见图 24-5,先控制作为 SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL线切换为低电平,这样就输出了一个标准的 I2C起始信号。 &n
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
硬件I2C和软件I2C的区别
硬件I2C(Inter-Integrated Circuit)是STM32等微控制器内置的串行通信接口,采用**同步、半双工**方式,通过**SCL(时钟线)**和**SDA(数据线)**两根信号线与外部设备通信。- **主模式(Master Mode)**:在这种模式下,STM32充当总线主机,负责发起通信并生成时钟信号(SCL),可以作为发送端或接收端。- **从设备地址固定**:通常由硬件引脚(A0~A2)设置,例如AT24C02的默认地址为**0xA0**(写)/ **0xA1**(读);
廖雪峰Python教程[完整版]
廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白
假人有限元模型
假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用
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



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



