I2C的实现以及对接收信号的解析
- 格式:doc
- 大小:230.00 KB
- 文档页数:4
i2c协议详解
I2C(Inter-Integrated Circuit)协议是一种双向串行总线,也称作IIC、TWI(Two-Wire Interface)或SMBus(System Management Bus),由Philips公司于1982年开发,用来连接多个微处理器和其它通信芯片。
I2C协议有两根线,分别是SCL(时钟线)和SDA(数据线),使用双线的好处就是只要两根线就可以完成数据传输,而不需要增加额外的线路,能够大大减少系统所需要的线路,减少系统的复杂度和成本。
I2C协议需要一个主控制器来控制整个系统,主控制器通过SCL线来发送时钟,并通过SDA线来发送和接收数据,从控制器则只负责接收数据。
I2C协议有7个基本信号,START、STOP、ACK、NACK、READ、WRITE和REPEAT START,START在传输数据前发出,STOP则在传输结束后发出,ACK和NACK则用来表示接收方是否正确接收到数据,READ和WRITE则用来指示当前传输的数据是读数据还是写数据,REPEAT START则用来重新开始新一轮的传输。
I2C协议的最大优点是简单、易用,而且可以支持多个从控制器,不过它的缺点也是显而易见的,它的传输速度相对较慢,而且它的传输距离也有限,约在50cm左右。
I2C详解1、基本概念主机初始化发送,产⽣时钟信号和终⽌发送的器件从机被主机寻址的器件发送器发送数据到总线的器件接收器从总线接收数据的器件多主机同时有多于⼀个主机尝试控制总线但不破坏报⽂仲裁是⼀个在有多个主机同时尝试控制总线,但只允许其中⼀个控制总线并使报⽂不被破坏的过程同步两个或多个器件同步时钟信号的过程2、硬件结构每⼀个I2C总线器件内部的SDA、SCL引脚电路结构都是⼀样的,引脚的输出驱动与输⼊缓冲连在⼀起。
其中输出为漏极开路的场效应管、输⼊缓冲为⼀只⾼输⼊阻抗的同相器。
这种电路具有两个特点:(1)由于SDA、SCL 为漏极开路结构,借助于外部的上拉电阻实现了信号的“线与”逻辑;(2)引脚在输出信号的同时还将引脚上的电平进⾏检测,检测是否与刚才输出⼀致。
为“时钟同步”和“总线仲裁”提供硬件基础。
3、时钟同步如果从机希望主机降低传送速度可以通过将SCL主动拉低延长其低电平时间的⽅法来通知主机,当主机在准备下⼀次传送发现SCL的电平被拉低时就进⾏等待,直⾄从机完成操作并释放SCL线的控制控制权。
这样以来,主机实际上受到从机的时钟同步控制。
可见SCL 线上的低电平是由时钟低电平最长的器件决定;⾼电平的时间由⾼电平时间最短的器件决定。
这就是时钟同步,它解决了I2C总线的速度同步问题。
4、主机发送数据流程(1)主机在检测到总线为“空闲状态”(即SDA、SCL 线均为⾼电平)时,发送⼀个启动信号“S”,开始⼀次通信的开始(2)主机接着发送⼀个命令字节。
该字节由7 位的外围器件地址和1 位读写控制位R/W 组成(此时R/W=0)(3)相对应的从机收到命令字节后向主机回馈应答信号ACK(ACK=0)(4)主机收到从机的应答信号后开始发送第⼀个字节的数据(5)从机收到数据后返回⼀个应答信号ACK(6)主机收到应答信号后再发送下⼀个数据字节(7)当主机发送最后⼀个数据字节并收到从机的ACK 后,通过向从机发送⼀个停⽌信号P结束本次通信并释放总线。
I2C总线原理及应用实例I2C总线是一种串行通信总线,全称为Inter-Integrated Circuit,是Philips(飞利浦)公司在1982年推出的一种通信协议。
它可以用于连接各种集成电路(Integrated Circuits,ICs),如处理器、传感器、存储器等。
I2C总线的原理是基于主从架构。
主设备(Master)负责生成时钟信号,并发送和接收数据,从设备(Slave)通过地址识别和响应主设备的命令。
I2C总线使用两根线来传输数据,一根是时钟线(SCL),用于主设备生成的时钟信号;另一根是数据线(SDA),用于双向传输数据。
1. 主设备发送起始位(Start)信号,将SDA线从高电平拉低;然后通过SCL线发送时钟信号,用于同步通信。
2.主设备发送从设备的地址,从设备通过地址识别确定是否响应。
3.主设备发送要传输的数据到从设备,从设备响应确认信号。
4. 主设备可以继续发送数据,或者发送停止位(Stop)信号结束通信。
停止位是将SDA线从低电平拉高。
1.温度监测器:I2C总线可以连接到温度传感器上,通过读取传感器的输出数据,进行温度的监测和控制。
主设备可以设置警报阈值,当温度超过阈值时,可以触发相应的措施。
2.显示屏:很多智能设备上的显示屏都采用了I2C总线,如液晶显示屏(LCD)或有机发光二极管(OLED)等。
主设备通过I2C总线发送要显示的信息,并控制显示效果,如亮度、对比度、清晰度等参数。
3.扩展存储器:I2C总线可以用于连接外部存储器,如电子存储器(EEPROM)。
通过I2C总线,可以读取和写入存储器中的数据,实现数据的存储和传输。
4.触摸屏控制器:许多触摸屏控制器也使用了I2C总线,主要用于将触摸信号传输给主设备,并接收主设备的命令。
通过I2C总线,可以实现对触摸屏的操作,如单击、滑动、缩放等。
5.电源管理器:一些电源管理器也采用了I2C总线,用于控制和监测电池电量、充电状态、电压、电流等参数。
I2C通信原理及程序详细讲解I2C(Inter-Integrated Circuit)是一种串行通信协议,常用于连接微控制器、传感器和其他外部设备。
I2C通信协议由荷兰飞利浦公司于1982年开发,它使用两根信号线(SDA和SCL)进行数据传输。
I2C通信协议采用主从结构,一个主设备(如微控制器)可以连接多个从设备(如传感器)。
主从设备之间通过SDA和SCL线进行数据传输。
SDA线是双向数据线,用于传输数据,SCL线是时钟线,用于同步数据传输。
I2C通信协议中,设备的地址是一个重要概念。
每个设备都有一个唯一的地址,通过该地址可以选择和通信特定的设备。
地址由7个位组成,其中最高位是固定的,并取决于设备是主设备还是从设备。
如果最高位为0,则表示该设备是主设备;如果最高位为1,则表示该设备是从设备。
通过以下步骤,让我们详细了解如何在I2C总线上进行通信。
1.初始化I2C总线:在程序开始时,需要初始化I2C总线。
这通常包括初始化SDA和SCL引脚,设置时钟频率等。
具体的初始化步骤取决于使用的硬件和软件环境。
2.发送开始信号:开始信号表示I2C数据传输的开始。
它由主设备发送,并且SDA线从高电平转为低电平时发出。
发送开始信号后,SDA线上的数据将被解释为地址数据。
3.发送设备地址:主设备发送一个包含设备地址和读/写位(R/W)的数据字节。
设备地址是唯一的,并且由主设备选择。
读/写位指示从设备是要读取数据还是写入数据。
4.等待从设备响应:主设备发送设备地址后,会等待从设备的响应。
从设备将响应一个应答位(ACK)来确认地址接收成功。
如果收到ACK位,则继续进行下一步,否则可能是设备未连接或通信错误。
5.发送数据:主设备发送数据给从设备。
数据可以是命令、配置或实际数据,具体取决于应用场景。
发送数据的方式是将每个数据字节传输到SDA线上,并在每个数据字节后发送一个ACK位。
6.接收数据:从设备将数据发送给主设备。
数据可以是传感器读数、存储器数据等。
i2c通信的详细讲解I2C(Inter-IntegratedCircuit,又名“两线制”)是一种开源的连接性协议,只需要两根线,一条用于连接数据(SDA),另一条用于传输时钟信号(SCL),另外无须任何外部设备,就能构建一个灵活的和可扩展的系统。
I2C的主要特性在于,他可以让多个芯片之间运行在同一总线上,开销较少、高效,是用来连接主机和外围设备,特别是嵌入式系统的一个常用的接口技术。
I2C的原理是什么?I2C工作的原理是,它仅有两个线,一条传输时钟信号(SCL),一条传输数据(SDA),当设备要发出数据时,它发出一个信号,信号告诉另外一个设备,双方之间有了一个连接,此时设备可以给另一设备传输信息,如果不需要进行跨流程的传输,可以省略时钟信号和失能信号,两设备之间的数据传输是相互独立的,每当一设备发送完成后,还需要发出一个复位信号,来进行重新启动。
I2C协议规定,有7种信号类型:START和STOP,ACK和NACK,SDA和SCL,失能信号(DISABLE),每种信号都有自己的特定用途。
当一个设备要发出或接收数据时,一定先发出一个START信号,当发送完成后要发出一个STOP信号,ACK和NACK用于检测接受成功与否,SDA和SCL分别用来传输数据和传输时钟信号,失能信号用于切断设备之间的通信。
I2C协议规定,主设备可以接收从设备的信息,而从设备则只能给主设备发送信息,在通信的过程中,主设备可以控制传输的方向,并且在发送完一条信息后,要检查是否收到另一个设备的回复,当另一个设备收到主设备发送的信息时,必须迅速进行回复,或者发出一个ACK或者NACK,来接受或拒绝信息。
总的来说,I2C通信协议非常简单而有效,只需要两根线,就可以在多个设备之间进行高速通信,并且可以进行大范围的扩展,使用I2C可以实现两个设备之间的双向通信,从而实现两个设备的同步通信。
此外,由于I2C协议数据传输的灵活性和可靠性,也是嵌入式系统开发的主要技术之一。
I2C 通信:起始条件:SCL为高电平,SDA电平从高变低,这一变化即完成了通信的起始条件。
起始条件和数据通信间,通常会有延时要求具体的指标见设备说明。
数据传输阶段:一字节需要9个时钟周期;且每一位需要一个时钟周期;如上图所示,ADDRESS为目标设备的地址,R/ w为通信的的方向位;"1"时表示读,即后续的数据由目标设备发出,主机进行接收;"0"时表示写,即后续的数据由主机发出目标设备进行接收。
当ACK信号为"0"时,说明接收成功;为"1"时,说明接收失败。
每个字节的传输都是由高位(MSB)到低位(LSB)依次进行传输。
在数据通信过程中,总是由数据接收方发出ACK信号。
终止阶段:当主机完成数据通信,并终止本次传输时会发出终止信号。
当SCL 是高电平时,SDA电平由低变高,这个变化意味着传输终止。
注:每个时钟周期的高电平期间,SDA的数据状态达到稳定。
下面给出了模拟I2C总线进行读写的伪代码,用以说明如何使用GPIO 实现I2C通信:int i2c_start() /* I2C起始条件*/{//初始化GPIO口set_gpio_direction(SDA, OUTP); //设置SDA方向为输出set_gpio_direction (SCL, OUTP); //设置SCL方向为输出set_gpio_value(SDA, 1); //设置SDA为高电平set_gpio_value(SCL, 1); //设置SCL为高电平delay(); //延时//起始条件set_gpio_value(SDA, 0); //SCL为高电平时,SDA由高变低delay(); //适当延时}void i2c_stop() /* I2C终止条件*/{set_gpio_value(SCL, 1);set_gpio_direction(SDA, OUTP);set_gpio_value(SDA, 0);delay();set_gpio_value(SDA, 1); //SCL高电平时,SDA由低变高}/* I2C读取ACK信号(写数据时使用)返回值:0表示ACK信号有效;非0表示ACK信号无效*/unsigned char i2c_read_ack(){unsigned char r;set_gpio_direction(SDA, INP); //设置SDA方向为输入set_gpio_value(SCL,0); // SCL变低r = get_gpio_value(SDA); //读取ACK信号delay();set_gpio_value(SCL,1); // SCL变高delay();return r;}/* I2C发出ACK信号(读数据时使用) */int i2c_send_ack(){set_gpio_direction(SDA, OUTP); //设置SDA方向为输出set_gpio_value(SCL,0); // SCL变低set_gpio_value(SDA, 0); //发出ACK信号delay();set_gpio_value(SCL,1); // SCL变高delay();}void i2c_write_byte(unsigned char b) /* I2C字节写*/{int i;set_gpio_direction(SDA, OUTP); //设置SDA方向为输出for (i=7; i>=0; i--){set_gpio_value(SCL, 0); // SCL变低delay();set_gpio_value(SDA, b & (1<<i)); //从高位到低位依次发送数据set_gpio_value(SCL, 1); // SCL变高delay();}i2c_read_ack(); //检查目标设备的ACK信号}/* I2C字节读*/unsigned char i2c_read_byte(){int i;unsigned char r = 0;set_gpio_direction(SDA, INP); //设置SDA方向为输入for (i=7; i>=0; i--){set_gpio_value(SCL, 0); // SCL变低delay();r = (r <<1) | get_gpio_value(SDA); //高位到低位依次数据读取set_gpio_value(SCL, 1); // SCL变高delay();}i2c_send_ack(); //向目标设备发送ACK信号return r;}/* I2C读操作addr:目标设备地址buf:读缓冲区len:读入字节的长度*/void i2c_read(unsigned char addr, unsigned char* buf, int len){int i;unsigned char t;i2c_start(); //起始条件,开始数据通信//发送地址和数据读写方向t = (addr << 1) | 1; //低位为1,表示读数据i2c_write_byte(t);//读入数据for (i=0; i<len; i++)buf[i] = i2c_read_byte();i2c_stop(); //终止条件,结束数据通信}/* I2C写操作addr:目标设备地址buf:写缓冲区len:写入字节的长度*/void i2c_write (unsigned char addr, unsigned char* buf, int len){int i;unsigned char t;i2c_start(); //起始条件,开始数据通信//发送地址和数据读写方向t = (addr << 1) | 0; //低位为0,表示写数据i2c_write_byte(t);//写入数据for (i=0; i<len; i++)i2c_write_byte(buf[i]);i2c_stop(); //终止条件,结束数据通信}。
i2c通信的详细讲解I2C(全称Inter-IntegratedCircuit)是一种基于两线式总线系统,可以利用它让一台机器和另一台机器或者一个器件与另一个器件之间建立通信连接。
它由一个多晶片系统(Multi-Chip System)所创造出来,可以减少实现多晶片系统的内部连接的数量,从而减少印制电路板的体积。
它允许多达127个从设备以最低物理开销(Low Physical Overhead)与一个主设备连接,具有低成本和高可靠性,现已成为很多类型的微控制器(Microcontroller)和处理器(Processors)的标准总线,应用非常广泛。
1. I2C概述I2C从最初的Philips经过20多年的发展,已经成为一种横跨多个行业的解决方案。
它可以在不同的系统上提供高性能片上系统(System-on-a-Chip,SoC)间的通信和协调,支持多达127的电子设备连接。
主要由两条信号线,称为SDA(Data Line)和SCL(Clock Line)构成,它们分别连接电子设备的数据和时钟,每个设备还有一个物理上的地址,用于标识彼此来进行通信。
I2C总线具有速度快、低功耗、简单易用等优点,现在已经被应用在系统和高速处理器、传感器、可编程逻辑器件(PLD)、多媒体设备、电源管理、液晶/LED等多个行业中。
2. I2C通信原理I2C通信可以说是一种异步通信方式,它是一种时钟控制的异步通信方式,发送一个字节,都要经过下面几个步骤:(1)发送起始条件:S(Start):该条件由SDA和SCL电平组合构成,SDA在SCL电平为高时从高电平变低电平。
(2)发送设备地址:在I2C总线上,设备都会有自己的地址,每个设备可以收发多个字节,这样就可以确定设备的身份。
(3)发送控制位:也称命令位,它用于确定主设备发送的是某种命令,比如写入数据,读取数据,还是其它的控制信息。
(4)发送数据:数据由SDA高低电平传输,而SDA电平的变化必须在SCL的上升沿才能有效。
单片机I2C通信实现在单片机中,I2C通信是一种常见的通信协议。
它是一种串行通信协议,用于在集成电路(IC)之间传输数据。
I2C通信协议简化了IC之间的通信过程,使得多个IC可以通过两根信号线进行通信。
本文将详细介绍单片机中的I2C通信实现。
一、I2C通信协议简介I2C(Inter-Integrated Circuit)通信协议由Philips(现在的NXP)公司开发,旨在简化数字集成电路的通信过程。
它使用两根信号线,分别为串行数据线(SDA)和串行时钟线(SCL)。
通过不同的电平状态和时钟脉冲,IC之间可以进行数据传输和控制信号的交换。
二、I2C通信的基本原理在I2C通信协议中,数据的传输是基于主从模式的。
主机(Master)控制整个通信过程,而从机(Slave)被动地接收和发送数据。
主机通过发送起始位和终止位来标识通信的开始和结束。
从机在接收到地址位后,根据地址的匹配情况决定是进行读操作还是写操作。
三、I2C通信的硬件连接为了实现I2C通信,我们需要通过硬件连接将单片机与其他IC连接起来。
首先,我们需要将单片机的SDA引脚连接到其他IC的SDA引脚,用于数据的传输。
其次,我们需要将单片机的SCL引脚连接到其他IC的SCL引脚,用于时钟的同步。
此外,还需要为SDA和SCL引脚添加上拉电阻,以确保信号的正常传输。
四、I2C通信的程序实现在单片机中,我们可以通过编写相应的程序实现I2C通信功能。
以C语言为例,以下是一个简单的I2C通信实现的程序框架:'''#include <reg51.h>// 定义I2C的起始地址和操作码#define I2C_ADDRESS 0x50#define WRITE 0x00#define READ 0x01// 初始化I2C通信void I2C_Init() {// 对应的初始化操作}// 启动I2C通信void I2C_Start() {// 对应的启动操作}// 停止I2C通信void I2C_Stop() {// 对应的停止操作}// 发送一个字节的数据void I2C_SendByte(unsigned char data) { // 对应的发送操作}// 接收一个字节的数据unsigned char I2C_ReceiveByte() {// 对应的接收操作return data;}// 主机发送数据void I2C_MasterSend(unsigned char data) { // 对应的发送操作}// 主机接收数据unsigned char I2C_MasterReceive() {// 对应的接收操作return data;}// 从机发送确认信号void I2C_Acknowledge() {// 对应的确认操作}'''使用上述程序框架,我们可以根据具体的需求进行相关的I2C通信操作。
上图为应答信号时序图在单片机系统中,单片机和24c02是互为发送端和接收端的。
首先关于发送端和接收端的定义得明确一下:发送端:往I2C总线上送数据的设备接收端:从I2C总线上获取数据的设备时序图上,能看出来,发送端在发送数据后,要在SCL第9个脉冲来临前把SDA拉高,以等待接收端发来ACK信号,接收端在接收到数据后,会向发送端发出ACK信号,也就是图上标的ACKNOWLEDGE1、当单片机向2402写数据的时候,会向I2C总线发送数据,这时单片机作为发送端。
2、24c02作为接收端。
反过来,读取24c02的数据时,单片机就成了接收端,2402成了发送端。
一、单片机作为发送端时,当它发送完一字节的数据后,需要执行的语句是:/**************************************接收应答信号(写数据时)检测24c02,是否产生应答信号,若24c02,接收完一字节数据,则产生应答信号。
告诉单片机已接收到数据。
若24c02,没接收到一字节数据,则产生非应答信号。
告诉单片机没接收到完整的数据。
此时可根据程序重复发送。
**************************************/void recv_ack(){uchar i; //声明i变量,不应答时延时sda=1delay(); //释放SDA,等待24c02发送ACK应答信号while((sda==1)&&(i<250))i++;// 一、若24c02发送ACK应答信号,即SDA=0,时序图的ACKNOWLEDGE信号二、若24c02没发送ACK应答信号,即SDA=1,时序图的NOT ACKNOWLEDGE信号,则延时到I>250,默认已应答。
scl=1;delay();scl=0;delay(); //确认接收到应答信号SCL=H>L}二、当单片机作为接收端时,如果接收多个数据,那么,在每接收完一字节的数据后,都要执行以下语句:/**************************************发送应答信号(读数据时)产生应答信号即已读完一字节入口参数:ack (0:ACK 1:NAK)**************************************/void send_ack(bit ack) //发送DATE后,接收端SDA=L,后发送端SCL=H>L{sda=ack; //ack=0应答ack=1不应答,即向24c02发送ACK应答信号,说明已接收到8位数据,使24C02地址自己加1 scl=1;delay();scl=0;delay(); //产生应答信号SCL=H>L delay()>=4.7us}如果只接受一个字节的数据,那么就不发送ACK,这个时候,要发送非应答信号即SDA=1,时序图的NOT ACKNOWLEDGE信号就要把SDA置高,即执行语句:SDA=1把ACK置1,后产生STOP信号,告诉24C02单片机停止接收数据,不用再发送了……。
1.what is I2C?简单讲就是用来传输数据的两根线:一根数据线(SDA)一根时钟线(SCL)2.I2C怎么传输的?(1)基本过程:1.主机发出开始信号2.主机接着发出一字节的从机地址信息,其中最低位为读写控制码(1为读、0为写)高七位为从机器件地址3.从机发出认可信号4.主机开始发送信号,每发完一字节后,从机发出认可信号给主机5.主机发出停止信号(2)对以上信号的具体说明:开始信号:在时钟线为高电平期间,数据线由高变低,将产生一个开始信号停止信号:在时钟线为高电平期间,数据线由低变高,将产生一个停止信号应答信号:即认可信号,主机写从机时,每写完一个字节,如果正确从机将在下一个时钟周期将数据线拉低,以告诉主机操作有效。
在主机读从机的时候,正确读完一个字节后,主机在下一个时钟周期同样也要将数据线拉低,发出认可信号,告诉从机所发数据已经收妥(注:读从机时主机在最后一个字节数据接收完后,不发应答,直接发停止信号)注意:任何在时钟线为高电平期间的数据线上的电平改变都被认为是起始和停止信号,所以数据改变必须要在时钟为低电平时改变。
(3)数据格式:I2C支持两种数据格式:7bit/10bit寻址数据格式7bit/10bit寻址和重复开始信号的格式从设备地址:总线上每个设备都有自己的一个addr,共7个bit,广播地址全0.系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。
硬件结构:每一个I2C总线器件内部的SDA、SCL引脚电路结构都是一样的,引脚的输出驱动与输入缓冲连在一起。
其中输出为漏极开路的场效应管、输入缓冲为一只高输入阻抗的同相器。
这种电路具有两个特点:(1)由于 SDA、SCL 为漏极开路结构,借助于外部的上拉电阻实现了信号的“线与”逻辑;(2)引脚在输出信号的同时还将引脚上的电平进行检测,检测是否与刚才输出一致。
为“时钟同步”和“总线仲裁”提供硬件基础。
C
I2的实现以及对接收信号的解析
一、C
I2的简单介绍
C
I2只有两条总线线路,一条是串行数据线(SDL),一条是串行时钟线(SCL)。
它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁,防止数据被破坏。
串行8位双向数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,在高速模式下可达3.4Mbit/s。
连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。
二、C
I2总线的协议定义
只有在总线处在“非忙”的状态时,数据传输才能开始。
当在“非忙”状态时,数据线(SCL)与时钟线(SDL)都为高电平。
在数据传输期间,只要时钟线为高电平,数据线都必须保持稳定,否则数据线上的任何变化都被视作“启动”或“停止”信号。
当时钟线(SCL)为高的时候数据线(SDL)由高变低表示“启动”,在时钟线(SCL)为高的时候数据线(SDL)由低到高表示“终止”。
所以数据传输要在时钟线(SCL)为低的时候进行。
表1是C
I2总线术语的定义:
表1
I2是一个多主机的总线,为了避免发生产生混乱,发展出一个仲裁的过程。
C
I2总线的时钟信号主要由主机来负责,当在总机上传输数据的时候,每个主机产
C
生自己的时钟信号。
三、C
I2总线的地址格式
C
I2总显得地址格式分为7位和10位。
7位:在起始条件后,发送了一个从机地址。
这个地址共有七位,紧接着的是第八位数R/),…1‟表示请求数据(读),…0‟表示写数据(写)。
数据传输一般由主机产据方向位(W
生停止位(P)。
但是,如果主机仍希望在总线上通讯,它可以产生重复起始条件…Sr‟和寻址另一个从机,而不是首先产生一个停止条件,在这种传输中,可能有不同的读/写格式结合。
起始条件后的第一个字节如图1:
图1
四、配置模式
在实际中我们应用的是七位的地址模式,由于我们要根据DSP的配置来完成从机,所以我们要根据DSP给定的时序来实现其功能,图2和图3为DSP的写与读的时序:
图2 写时序
图3读时序
在写代码的时候我们要求读和写在一个模块中实现,而不是分开的,图2中SA表示给定的从机地址,因为我们做的是从机,所以地址可以由我们来定义,W表示写,R表示读。
ACK表示的一种反馈信号。
图2中的“模块”表示的定义的模块名,8bit构成。
“offset”表示的是偏移地址。
“模块”和“offset”我们可以理解为命令。
接下来发送的就是数据。
数据以每次8位的形式发送,每发送完成一次从机反馈一个ACK信号。
发送四次共计32bit.
五,解析过程
图3所示:
图3
收来的数据暂存,存到8bit 发送一次, offset 的数据构成RAM 的地址,数据存储到RAM 里,宽带是32bit 。
由model 决定片选(CS),发送到DECIDE WHICH MODEL BE SELECTED.由这个模块来决定片选的值。
根据片选(CS )把数据送到所需要的模块。
片选信息见表2。
表2为片选配置表:
表2
如下图所示:IIC解析模块输出时序图,8位偏移地址addra_out,32位数据dout,读写信号wr_rd,对应两个模块的片选信号。