i2c

raspberry pi cm3+的i2c使用的问题调试 本文是在树莓派上面使用i2c时候,运行时间太长就会随机出现错误:bcm2835 3f205000.i2c: Got unexpected interrupt (from firmware?) 调试解决方法。 之前有介绍到cm3的i2c:https://blog.youkuaiyun.com/u010299133/article/details/107006090?ops_request_misc=%257B%2522request%255Fid%2522%253A%25221601207611191952466.. 阅读详情

#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);
}

【I2C】通用驱动i2c-dev分析 前面分析i2c-tool测试工具就是基于驱动来实现的。i2c-dev驱动在加载时会遍历所有的I2C总线()上所有注册的adapter/dev/i2c-0/dev/i2c-1/dev/i2c-2等。应用程序通过open打开对应的i2c字符设备,通过ioctl来收发数据。 阅读详情

相关推荐

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设...

JT同学的博客 1825

关于树莓派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 ...

weixin_46145842的博客 1万+

关于树莓派4B两个I2C通道(I2C0、I2C1)的总结

通过以下链接了解到smbus.SMBus(0)是对I2C接口的调用。并且从中了解到树莓派4B拥有两个I2C接口,分别为I2C0和I2C1。最近在使用JY901九轴陀螺仪,使用到了I2C通信。

qq_59449692的博客 1832

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器件输出数据。(边沿

u012781002的专栏 989

Linux I2C(二) - I2C软硬件架构

i2c软硬件架构

滴水藏海 1856

I2C子系统

串行、半双工总线,主要用于低速、近距离的芯片之间的通信。

HRad7282的博客 1323

硬件I2C与模拟I2C

硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C;一般也较为稳定,但是程序较为繁琐。硬件(固件)I2C是直接调用内部寄存器进行配置;而软件I2C是没有寄存器这个概念的。 软件I2C一般是使用GPIO管脚,用软件控制SCL,SDA线输出高低电平,模拟i2c协议的时序。 例如下面这段I2C的开始和结束信号,我们使用GPI...

Hsy的博客 1万+

【论文阅读】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...

florrie 2万+

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设备之间的通信顺畅,支持不同的传输协议和模式。

caiji0169的博客 3160

数字IC后端实现之快速获取innovus中drv violation的所有net list

数字IC后端设计实现之快速获取innovus中drv violation的所有net list

weixin_37584728的博客 3350

GD32F303定时器配置:实现两路互补PWM输出与相位控制

本文详细解析了基于GD32F303定时器实现两路互补PWM输出与精确相位控制的方法。通过配置TIMER2的中间对齐模式,结合REMAP功能解决引脚复用问题,从硬件层面稳定生成相位差180度的互补PWM信号,适用于电机驱动、开关电源等对时序要求苛刻的应用场景。

weixin_29182481的博客 305

I2C通信——I2C通信的理论介绍

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除 。

主要记录嵌入式学习与开发过程。 1万+

告别“为了写而写”:GJB438C-2021新规下,软件文档如何真正为项目服务?

本文深入解析GJB438C-2021新规如何重构软件文档的实战价值,通过文档体系瘦身、流程再造和敏捷化实践,显著提升军工软件项目的效率。新标准删除30%冗余文档,引入动态编制法和轻量化模板,使文档编制工作量降低37%,关键路径周期缩短15%。

weixin_30765577的博客 447

Linux之I2C驱动

在 Linux 内核中 I2C 的体系结构分为 3 个部分:①: I2C 核心提供了I2C 总线驱动和设备驱动的注册、 注销方法②: I2C 总线驱动是对I2C 硬件体系结构中适配器端的实现, 适配器可由CPU 控制, 甚至可以直接集成在 CPU 内部。I2C 总线驱动就是 SOC 的,也叫做。③: I2C 设备驱动是对,设备一般挂接在受 CPU 控制的 I2C 适配器上, 通过 I2C 适配器与 CPU 交换数据。

风间琉璃的博客 5678

纽扣电池供电系统优化:NBM5100A与STM32F745VG组合方案

在低功耗物联网设备设计中,能量管理是核心挑战之一。纽扣电池因其体积小、成本低被广泛采用,但瞬时大电流需求常导致电压骤降和寿命缩短。通过超级电容缓冲技术,可以实现能量的细水长流式存储与集中释放。NBM5100A电源管理IC与STM32F745VG微控制器的组合方案,采用双阶段能量管理架构,先以恒定小电流充电,再通过电容释放大电流。这种方案不仅能提升系统稳定性,还能延长电池寿命3-5倍,特别适合智能门锁、无线传感器等需要间歇性高功率输出的场景。

weixin_29194255的博客 257

Amazon SES 移出沙盒完整指南 & 高通过率模板

AWS SES沙盒模式转正式模式申请指南 申请正式模式需通过AWS审核,常见被拒原因包括邮件用途不清晰、缺少退订机制或发送量不合理。人工申诉需登录AWS Support Center提交服务限额提升请求,填写详细的公司信息、邮件用途及合规措施。 高通过率申诉模板需包含: 公司信息:名称、网址及与AWS的合作情况。 邮件规范:明确类型(交易/营销)、退订链接及退信处理机制。 发送计划:合理预估发送量,确保合规。 关键点:真实信息、用途清晰、退订机制完善、发送量合理。首次被拒可修改后重新提交。

xianyinsuifeng的博客 328

【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配置接口来收发数据。注册成功后,

ZHONGCAI0901的博客 8315

SAP公司间STO业务解析(包含主数据解析、后台配置解析、前台业务演示)

SAP公司间STO业务解析

ww114784的博客 1017

I2C产生死锁的原因是什么、避免、解决I2C死锁

本文简述的是关于I2C在实际使用中产生死锁的问题, 本片文章会介绍如下内容, 什么是死锁, I2C产生死锁的原因, 导致的后果、以及如何解决。

m0_74976404的博客 7617

倍福---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、 飞拍的应用 在大多数场合,只能当被检测工件和相机都处于静止状态下才能进行拍照,拍照完成后,再移动工件或相机,进

weixin_41883890的博客 3742

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

I2C协议——I2C框图和I2C通信过程

1.软件模拟和硬件模拟的概念        所谓软件模拟,即直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平。如控制产生 I2C 的起始信号时,见图 24-5,先控制作为 SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL线切换为低电平,这样就输出了一个标准的 I2C起始信号。     &n

吴立赛的博客 4411

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

硬件I2C和软件I2C的区别

硬件I2C(Inter-Integrated Circuit)是STM32等微控制器内置的串行通信接口,采用**同步、半双工**方式,通过**SCL(时钟线)**和**SDA(数据线)**两根信号线与外部设备通信。- **主模式(Master Mode)**:在这种模式下,STM32充当总线主机,负责发起通信并生成时钟信号(SCL),可以作为发送端或接收端。- **从设备地址固定**:通常由硬件引脚(A0~A2)设置,例如AT24C02的默认地址为**0xA0**(写)/ **0xA1**(读);

weixin_63207510的博客 2666

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Linux的i2c驱动详解

1 简介  I2C 总线仅仅使用 SCL 、 SDA 两根信号线就实现了设备之间的数据交互,极大地简化对硬件资源和 PCB 板布线空间的占用。因此, I2C 总线被非常广泛地应用在 EEPROM 、实时钟、小型 LCD 等设备与 CPU 的接口中。 Lin

ylyuanlu的专栏 1万+

【彻底搞懂I2C总线(一)什么是I2C?什么是I2C总线?什么是I2C规范】

【彻底搞懂I2C总线(一)什么是I2C?什么是I2C总线?什么是I2C规范】

Sugar_wolf的博客 5017

I2C驱动实例详解

I2C驱动框架 Linux的I2C体系结构分为3个组成部分,分别是I2C核心、I2C总线驱动和I2C设备驱动。 I2C控制器的驱动程序称为总线驱动(包含两部分,硬件相关、硬件无关),将I2C设备的驱动程序称为设备驱动(包含两部分,IIC设备匹配相关、I2C设备操作方法集)。 I2C驱动设计过程简述: I2C设备注册: 首先要向I2C核心层注册一个I2C设备,I2C总线会将其添加到总线的设备链表中,然后遍历总线上的驱动链表,查看二者是否匹配,如果匹配就调用驱动的probe函数。 I2C驱动注册: 注册I2C

Luckiers的博客 6948

STM32F103,HAL实现软件I2C,与硬件I2C

1,硬件I2C HAL_I2C_Mem_Write(&amp;hi2c1,0x88,0,I2C_MEMADD_SIZE_8BIT,0,0,0X10);//写 HAL_I2C_Master_Receive(&amp;hi2c1,0x89,(uint8_t*)datatemp,4,0x10);//读 2软件I2C #ifndef __MYI2C_H__ #define __MYI2C...

wfjdemmye的博客 9090
上一篇: 51单片机 Keil C 延时程序的简单研究
下一篇: i2c
vcvbve
博客等级 码龄17年 5粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值