工具准备 调试IIC过程中,需要准备示波器或逻辑分析仪,需要通过示波器查看波形确定硬件连接是否正确,不然出现问题,软件再怎么调试,都是枉然...., 自己解析IIC波形, 相比示波器,方便许多。...用户空间操作I2C I2C设备驱动有两种模式:一种是用户层操作驱动设备,另一种是普通的设备驱动,应用层使用的时候像读写文件一样....示例代码 两个重要的数据结构 struct i2c_rdwr_ioctl_data结构体 /inclue/linux/i2c-dev.h /* This is the structure as used...参考 i2c驱动之调用ioctl函数进行读写at24c08 Android/linux 平台下使用 i2c-tools调试IIC方法 树莓派学习笔记——I2C Tools 学习笔记 7位,8位和10位IIC
上一节 我们学习了: IIC接口下的24C02 驱动分析 接下来本节, 学习Linux下如何利用linux下I2C驱动体系结构来操作24C02 1....i2c_msg,写操作需要一个i2c_msg,是因为读IIC设备是两个流程 在上一节IIC接口下的24C02 驱动分析: http://www.cnblogs.com/lifexy/p/7793686....html里就已经分析到了, 只要发送一个S起始信号则就是一个i2c_msg,如下两个读写操作图所示: ?.../kernel.h> #include linux/init.h> #include linux/module.h> #include linux/slab.h> #include linux/...jiffies.h> #include linux/i2c.h> #include linux/mutex.h> #include linux/fs.h> #include <asm/uaccess.h
每一块BLSP对应六位,每一位对应一个GPIO,每一位的GPIO都可以作为UART、SPI、IIC的链接线 2.
1.I2C体系结构分析 1.1首先进入linux内核的driver/i2c目录下,如下图所示: 其中重要的文件介绍如下: 1)algos文件夹(algorithms) 里面保存I2C的通信方面的算法...从设备地址值,并回应ACK } 通过上面的代码和注释,发现主要是写入IIC从设备地址,然后发送起始信号+IIC从设备地址值,并回应ACK 显然IIC总线驱动i2c-s3c2410.c,主要设置适配器...#include linux/kernel.h> #include linux/init.h> #include linux/module.h> #include linux/slab.h> #...include linux/jiffies.h> #include linux/i2c.h> #include linux/mutex.h> #include linux/fs.h> #include...= 1; /* 地址=1 byte */ msg[0].flags = 0; /* 表示写 */ /* 然后启动读操作
I2C设备器件发送的数据 IIC硬件连接结构图 ? IIC硬件连接主要包括IIIC主机、IIC从机、IC总线及上拉电阻。...IIC主机:一条总线中一般只会有一个IIC主机,一般为可编程芯片。通过软件编程控制主机连接在IIC总线上的GPIO电平,生成符合IIC总线协议的时序。...IIC从机:具备IIC接口的设备器件(例如AT24C02)。硬件连接好后,等待IIC总线访问。 IIC总线协议 ?...IIC总线上所有的IIC从机设备对应一个唯一的地址。...在前一个读/写操作完毕后,传输起始位信号代替停止位信号,使交互继续执行。 - END -
下图是一个嵌入式系统中处理器仅通过2根线的IIC总线控制多个IIC外设的典型应用图 ?...IIC 通信协议 IIC 串行总线一般有两根信号线,一根是双向的数据线 SDA ,另一根是时钟线 SCL ,其时钟信号是由主控器件产生。...所有接到 IIC 总线设备上的串行数据 SDA 都接到总线的 SDA 上,各设备的时钟线 SCL 接到总线的 SCL 上。对于并联在一条总线上的每个 IIC 都有唯一的地址。...IIC 总线操作 对 IIC 总线的操作实际就是主从设备之间的读写操作。大致可分为以下三种操作情况: 主设备往从设备中写数据 数据包括从机寄存器地址和需要写入寄存器的数据data ?...第三种操作在单个主设备系统中,重复的开启起始条件机制要比用STOP终止传输后又再次开启总线更有效率 FPGA 程序实现 物理层源码 -----------------------------------
c.IIC是真正的多主机总线,(而这个SPI在每次通信前都需要把主机定死,而IIC可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏。...一个典型的IIC接口如下图(1)所示 ? 图(1) (3)IIC的协议层 IIC的协议层才是掌握IIC的关键。...设备里写东西,然后再紧接着写入IIC设备里的寄存器地址,而我直接写入了0x68,导致出错},每次数据传送总是由主机产生的终止信号结束。...即使是含有IIC硬件的单片机(如stm32 103系列)也有一定的缺陷,所以一般也会模拟IIC的时序。现将具体时间截图如下: ?...I2C_SDA_H; //主机释放数据总线,等待从机产生应答信号 delay_us(1); I2C_SCL_H; delay_us(1); //等待从机对数据总线的操作
本文将从实测的IIC波形入手,带你看到真实的IIC样子,进而去理解IIC的通信原理。...但主设备也可以产生重复的开始信号去操作另一台从设备,而不发出结束标志。...所有的SDA 信号变化都要在SCL 时钟为低电平时进行,除了开始和结束标志 1.4 常用的数据收发方式(时序) 上面1.3小节是IIC的基础时序,在实际使用中,一般是对某个IIC器件的某个寄存器进行读写操作...,因此,对于寄存器的读写操作,还要遵循下面的组合时序逻辑。...4.3 配置从机寄存器(单字节写与多字节写) 对于寄存器的配置,也就是IIC的写寄存器操作,我就不放图了,参考上面的“常用的数据收发方式(时序)”以及上面的IIC读寄存器的真实波形,IIC的写寄存器的真实波形
IIC读写时序 先来回顾IIC的读写时序,首先记住两句话: ①时钟SCL低,数据SDA发生变化; ②时钟SCL高,数据SDA保持稳定; S 器件地址+0 A 写入首地址 A DATA1 A ··· DATAn...程序用伪代码表示: 读字节: u8 IIC_readbyte() { IIC_start();//起始信号 IIC_putbyte();//器件地址 IIC_Putbyte();...//首地址 IIC_stop(); IIC_start(); IIC_Putbyte();//器件地址+1 for( i = 0 ; i < length; i++)...} u8 IIC_writebyte() { IIC_start();//起始信号 IIC_putbyte();//器件地址 IIC_Putbyte();//写入首地址...for(i=0;i<length;i++) IIC_putbyte();//写入数据 IIC_stop(); } START 器件地址+0 A 读出首地址 A 器件地址
******************/ MRS R0, cpsr ;将状态寄存器cpsr中的值读到R0中 ORR R0, R0, #0xc0 ;将R0与(1100 0000)进行或操作...12) + (U_PDIV << 4) + U_SDIV)加载到R1中 ;Fin=12MHz, Fout=48MHz STR R1, [R0] ;进行设定 NOP ;NOP为空操作伪指令...,NOP伪指令在汇编时将会被代替成ARM中的空操作,比如 MOV R0,R0 NOP NOP NOP NOP NOP NOP LDR R0, =MPLLCON ;MPLL...MRS R0, cpsr ;cpsr加载到R0中 BIC R0, R0, #0x80 ;BIC将R0中的第7位置0,(将R0跟(1000 0000)的反码(0111 1111)进行与操作...16) - 1 = 658 rULCON0 = (0操作
摘要 本篇笔记主要记录在恩智浦MPC5744p系列上IIC通信遇到的问题,这个片子本身没有硬件IIC,如果要使用I2C接口,需要软件模拟。...系列是恩智浦针对汽车行业的用量比较大的一颗料,本身没有硬件I2C接口,如需使用I2C接口需要使用GPIO口来模拟,因为我本身也是第一次使用这颗料,所以想借助SDK快速来评估样机功能,就详细阅览了SDK的结构和代码,发现IIC
IIC 通信协议 I2C(IIC,Inter-Integrated Circuit),数据线SDA(data)和时钟SCL(clock)构成的串行总线,双向传送。...高速IIC总线一般可达400kbps以上。 IIC是半双工通信方式。 时序图 主机:起始信号—–>第一位——>第二位———> …….....——–>第八位———> 等待应答信号——->停止信号 大致的一个数据传输流程是:主机向SDA线上发送一个起始信号,表示有信号进行传输,此时所有连接到IIC总线上的芯片都处于接收状态,接下来,主机发送想要与其进行数据传输的从机地址信号
前言 Linux的IIC驱动想必大家都耳熟能详,网上也有很多相关的教程。 网上的教程总结,比如: 方法问题描述Linux 3.X.X版本之后,设备树+驱动此方法是比较符合linux驱动的写法的。...他将会操作多个文件 上面的做法都有些困难及弊端存在,经过摸索了一遍Linux的I2C驱动框架,我发现可以很精简的写一个I2C设备的设备驱动。...分析I2C总线驱动说明 I2C总线驱动的代码在linux的源码中--i2c-dev.c中。 在代码中可以看到他提供一套文件操作接口,open,read,write,close接口。...i2cdev_ioctl_rdwr()接口是i2c总线驱动对从设备操作的进一步封装,我们进一步看一下这个函数。...,如果为读操作,将i2c_transfer接口接收回来的数据拷贝到用户态。
老师说下课(停止) 我们就使用这个简单的例子,来解释一下IIC的传输协议。...老师说注意了,表示开始信号(start) 老师告诉某个学生,表示发送地址(address) 老师发球/接球,表示数据的传输 老师/学生收到球,回应表示:回应信号(ACK) 老师说下课,表示IIC传输接受...特性3:多主机 IIC是真正的多主机总线,( IIC可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏。 ...,主要有读和写两个操作码。...其他寄存器和操作我们在上面已经都讲解过。
IIC总线有主从之分,从设备可以是多个,这个是由硬件电路与协议决定的,一般来说总线上扩展的器件数量主要由电容负载来决定。...硬件调试方法: 下面简单说下IIC总线设备的调试方法。 第一,请正确给出从设备的地址,一般有pin可以给你自己配置,也有的是IC固定下来的,请务必保证总线上所有的地址都不冲突。
–>iic总线协议: 1】起始和结束信号总是由主设备产生。
I2C 操作中途被打断,或受到脉冲干扰,SCL, SDA 可能被拉低锁死。尝试用 SCL 产生 9 个时钟脉冲让从器件或主控制器释放总线。这种方法可以解决掉绝大部分问题。
图2 10 24LC04 的写操作(主机视角) IIC 总线的时序,感觉上一组完成的操作宛如是一堆拼图。...如图2 10所示,那是 24LC04的写操作,时序先填上为起始位,再来是设备地址,余下是应答位,随之是数据地址,然后又是应答位,接着是写如数据,再一次应答位,最后挂上结束位以示一次性的写操作已经完成。...由于此刻是写操作,所以设备地址的访问方向是“写”,所以访问方向位设置为 0。 ? ...图2 11 24LC04 的读操作(主机视角) 图2 11是 24LC04 的读时序,同样它也是由一堆“拼图”组合而成。相较写操作,读操作不仅多了许多“拼图”,而且途中也改变访问方向。...那么,读操作的经过如下所示: (一) 主机发送起始位; (二) 主机发送设备地址(写); (三) 等待从机应答; (四) 主机发送数据地址; (五) 主机发送起始位; (六) 主机发送设备地址(读);
2.1 IIC协议的FPGA实现 2.1.2 IIC协议的FPGA实现 图2 13 IIC模块的建模图 图2 13是 IIC 储存模块的建模图,左边是顶层信号,右边则是沟通用的问答信号...IIC 总线的起始位也就类似串口或者 PS/2 等传输协议的起始位,然而不同的是, IIC 总线的起始位是 SCL 拉高 TR + TSU_STA + THD_STA + TF 之久,换之 SDA 则是拉高...图2 15 结束位 图2 15是结束位的时序图, IIC 设备的操作好坏一般都取决结束位。...主机发送结束位以示结束操作,然而主机持续拉高 SCL 信号与SDA 信号 TBUF 以示总线释放。...图2 21 第二次起始位 知道主机向从机读取数据的时候,它必须改变设备地址的方向,因此读操作又第二次起始位。
IIC写时序 ?...IIC读时序 ?...IIC协议在读写数据时,总是要发送器件地址,这里需要注意的是,不是主机给从机发送地址,而是主机给地址总线上发送地址,挂IIC总线上的所有从机都能收到地址,如果发过来的地址和自己的地址匹配上了,从机就会给主机一个应答...所以我在想,如果从机的器件是完全一样的,那么IIC协议就可以同时给多个从机,即对多个器件进行配置。...即IIC协议一次只能和一个设备/器件进行通讯。 IIC读写时序补充 双字节地址写时序,写入器件地址,写入寄存器地址高位、低位,然后写数据。 ?
领取专属 10元无门槛券
手把手带您无忧上云