《I2C_SPI_单总线协议》由会员分享,可在线阅读,更多相关《I2C_SPI_单总线协议(41页珍藏版)》请在金锄头文库上搜索。
1、6.5.1 I2C串行总线的组成及工作原理串行总线的组成及工作原理v采用串行总线技术可以使系统的硬件设计采用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。大大简化、系统的体积减小、可靠性提高。同时,系统的更改和扩充极为容易。同时,系统的更改和扩充极为容易。v常用的串行扩展总线有:常用的串行扩展总线有: I2C (Inter IC BUS)总线、)总线、单总线单总线(1WIRE BUS)、)、SPI(Serial Peripheral Interface)总线及)总线及Microwire/PLUS等。等。 I2C串行总线概述串行总线概述 I2C总线是总线是PHLIPS公司
2、推出的一种串行总线,是具备多公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。性能串行总线。 I2C总线只有两根双向信号线。一根是数据线总线只有两根双向信号线。一根是数据线SDA,另,另一根是时钟线一根是时钟线SCL。6.5.2、总线的寻址总线的寻址 I2C总线协议有明确的规定:采用总线协议有明确的规定:采用7位的寻址字节位的寻址字节(寻址字节是起始信号后的第一个字节)。(寻址字节是起始信号后的第一个字节)。 (1)寻址字节的位定义)寻址字节的位定义 D7D1位组成从机的地址。位组成从机的地址。D0
3、位是数据位是数据传送方向位,为传送方向位,为“0”时表示主机向从机写数时表示主机向从机写数据,为据,为“1”时表示主机由从机读数据。时表示主机由从机读数据。v主机发送地址主机发送地址时,总线上的每个从机都将这时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据则认为自己正被主机寻址,根据R/位将自己确位将自己确定为发送器或接收器定为发送器或接收器。v从机的地址从机的地址由固定部分和可编程部分组成。由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机,在一个系统中可能希望接入多个相同的从机,从机地址
4、中可编程部分决定了可接入总线该类从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机的器件的最大数目。如一个从机的7位寻址位有位寻址位有4位是固定位,位是固定位,3位是可编程位,这时仅能寻址位是可编程位,这时仅能寻址8个同样的器件,即可以有个同样的器件,即可以有8个同样的器件接入个同样的器件接入到该到该I2C总线系统中总线系统中。(2)寻址字节中的特殊地址)寻址字节中的特殊地址 固定地址编号固定地址编号0000和和1111已被保留作为特已被保留作为特殊用途。殊用途。 I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连
5、到总线上的任一器件输出的低电平,都将使总线为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的的信号变低,即各器件的SDA及及SCL都是线都是线“与与”关系关系。I2C总线接口的电气结构总线接口的电气结构 每个接到每个接到I2C总线上的器件都有唯一的地总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为为发送器。由总线上接收数据的器件则为接收器接收器。 在多主机系统中,可能同时有几个主机企图启在多主机系统中,可能同时有几
6、个主机企图启动总线传送数据。为了避免混乱,动总线传送数据。为了避免混乱, I2C总线要通总线要通过总线仲裁,以决定由哪一台主机控制总线。过总线仲裁,以决定由哪一台主机控制总线。 在在80C51单片机应用系统的串行总线扩展中,单片机应用系统的串行总线扩展中,我们经常遇到的是以我们经常遇到的是以80C51单片机为主机,其它单片机为主机,其它接口器件为从机的单主机情况。接口器件为从机的单主机情况。 一、数据位的有效性规定一、数据位的有效性规定 I2C总线进行数据传送时,总线进行数据传送时,时钟信号为高电平期间时钟信号为高电平期间,数据,数据线上的数据必须保持稳定,只有在线上的数据必须保持稳定,只有在
7、时钟线上的信号为低电平时钟线上的信号为低电平期间期间,数据线上的高电平或低电平状态才允许变化。,数据线上的高电平或低电平状态才允许变化。6.5.4 I2C总线的数据传送总线的数据传送二、起始和终止信号二、起始和终止信号 SCL线为高电平期间,线为高电平期间,SDA线由高电平向低电线由高电平向低电平的变化表示起始信号;平的变化表示起始信号;SCL线为高电平期间,线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。线由低电平向高电平的变化表示终止信号。 起始和终止信号都是由起始和终止信号都是由主机主机发出的,在起始信发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就
8、处于被占用的状态;在终止信号产生后,总线就处于空闲状态。号产生后,总线就处于空闲状态。 连接到连接到I2C总线上的器件,若具有总线上的器件,若具有I2C总线的硬件接口,则总线的硬件接口,则很容易检测到起始和终止信号。对于不具备很容易检测到起始和终止信号。对于不具备I2C总线硬件接总线硬件接口的有些单片机来说,为了检测起始和终止信号,必须保证口的有些单片机来说,为了检测起始和终止信号,必须保证在每个时钟周期内对数据线在每个时钟周期内对数据线SDA采样两次采样两次。 接收器件收到一个完整的数据字节后,有可能需要完成接收器件收到一个完整的数据字节后,有可能需要完成一些其它工作,如处理内部中断服务等,
9、可能无法立刻接收一些其它工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将下一个字节,这时接收器件可以将SCL线拉成低电平,从而线拉成低电平,从而使主机处于等待状态。直到接收器件准备好接收下一个字节使主机处于等待状态。直到接收器件准备好接收下一个字节时,再释放时,再释放SCL线使之为高电平,从而使数据传送可以继续线使之为高电平,从而使数据传送可以继续进行。进行。 三、数据传送格式三、数据传送格式(1)字节传送与应答)字节传送与应答 每一个字节必须保证是每一个字节必须保证是8位长度。数据传送时,先传位长度。数据传送时,先传送最高位(送最高位(MSB),每一个被传送的字节后
10、面都必须跟),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有随一位应答位(即一帧共有9位)。位)。 由于某种原因从机不对主机寻址信号应答时(如从机由于某种原因从机不对主机寻址信号应答时(如从机正在进行实时性的处理工作而无法接收总线上的数据),正在进行实时性的处理工作而无法接收总线上的数据),它必须将数据线置于高电平,而由主机产生一个终止信号它必须将数据线置于高电平,而由主机产生一个终止信号以结束总线的数据传送。以结束总线的数据传送。 如果从机对主机进行了应答,但在数据传送一段时间后如果从机对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的无法继续
11、接收更多的数据时,从机可以通过对无法接收的第一个数据字节的第一个数据字节的“非应答非应答”通知主机,主机则应发出终通知主机,主机则应发出终止信号以结束数据的继续传送。止信号以结束数据的继续传送。 当主机接收数据时,它收到最后一个数据字节后,必须当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由对从机的向从机发出一个结束传送的信号。这个信号是由对从机的“非应答非应答”来实现的。然后,从机释放来实现的。然后,从机释放SDA线,以允许主线,以允许主机产生终止信号。机产生终止信号。(2)数据帧格式)数据帧格式 I2C总线上传送的数据信号是广义的,既包括地址总线上
12、传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。信号,又包括真正的数据信号。 在总线的一次数据传送过程中,可以有以下几种在总线的一次数据传送过程中,可以有以下几种组合方式:组合方式: 按照按照I2C总线规范,总线规范, 起始信号表明一次数据起始信号表明一次数据传送的开始,传送的开始, 其后为寻址字节,其后为寻址字节, 在寻址字节在寻址字节后是按指定读、后是按指定读、 写操作的数据字节与应答位。写操作的数据字节与应答位。 在数据传送完成后,在数据传送完成后, 主器件必须发送停止信主器件必须发送停止信号。号。 在起始信号与停止信号之间传输的数据在起始信号与停止信号之间传输的数据字节数
13、由单片机决定。字节数由单片机决定。 a、主器件的写操作、主器件的写操作: 主器件向被寻址的从器件发主器件向被寻址的从器件发送送n个数据字节,个数据字节, 整个传送过程中数据传送方向整个传送过程中数据传送方向不变。不变。 其数据传送格式如下其数据传送格式如下: Data(n-1)ADatan ApsSlaw AData1AData2A 其中: SLA W为寻址字节(写), Data1Data n为写入从器件的n个数据字节。 b、主机主器件的读操作、主机主器件的读操作: 主器件读出来自从器主器件读出来自从器件的件的n个字节,个字节, 整个传送过程中除寻址字节外,整个传送过程中除寻址字节外, 都是从
14、器件发送、都是从器件发送、 主器件接收的过程。主器件接收的过程。 c、 主器件的读、主器件的读、 写操作写操作: 在一次数据传输在一次数据传输过程中需要改变传送方向的操作,过程中需要改变传送方向的操作, 此时起始此时起始位和寻址字节都会重复一次,位和寻址字节都会重复一次, 但两次读、但两次读、 写方向正好相反。写方向正好相反。 6.6、 80C51单单片机片机I2C串行总线器件的接口串行总线器件的接口1)、单片机与、单片机与I2C总线的硬件连接总线的硬件连接 用不带用不带I2C接口的接口的51单片机控制单片机控制I2C总线总线时,时, 利用软件进行模拟,利用软件进行模拟, 需在两条需在两条I/
15、O线上形线上形成成SCL和和SDA, 与与I2C总线的总线的SCL和和SDA直接直接相连,相连, 再加上拉电阻再加上拉电阻(5.1 k)即可。即可。 : 6.6.1 6.6.1 单单片机与片机与I2C总线总线的硬件的硬件连连接接 2) 单片机对I2C总线的控制程序 硬件选用P1.6和P1.7作为时钟线SCL和数据线SDA, 晶振采用6 MHz。 软件提供一组模拟程序, 包括启动(STA)、 停止(STOP)、 发送应答位(MACK)、 发送非应答位(NMACK)、 应答位检查(CACK)、 发送一字节数据(WRBYT)、 接收一字节数据(RDBYT)、 发送N字节数据和接收N字节数据(RDNB
16、YT)9个子程序。 有了这组模拟子程序, 即可实现I2C总线上的数据传输。 设计模拟子程序时, 需模拟I2C总线典型信号时序。 I2C总线数据传送时, 有起始(S)、 终止(P)、 发送0代表应答(A)、 发送1代表非应答(A)等信号。 按照典型I2C 总线传送速率的要求 6.6.2、典型信号模拟子程序、典型信号模拟子程序(1)启动位启动位I2C总线子程序总线子程序STA: SETBSDA SETB SCL NOP ; 起始条件建立时间大于4.7s NOP NOP CLR SDA NOP ; 起始条件锁定时间大于4.7s NOP NOP CLR SCL ; 钳住总线, 准备发送数据 RET(2
17、) 停止位I2C总线子程序STOP: vSTOP: CLR SDAvSETB SCL ; 发送停止条件的时钟信号发送停止条件的时钟信号vNOP ; 停止总线时间大于停止总线时间大于4.7svNOPvNOPvSETB SDA ; 停止总线停止总线NOPvNOPvNOPvCLR SDAvCLR SCLvRET(3) 发送应答位信号子程序发送应答位信号子程序MACK:MACK: CLR SDASETB SCLNOP ; 保持数据时间, 即SCL为高, 时间大于4.7sNOPNOPCLR SCLSETB SDARET(4) 发送非应答位信号子程序发送非应答位信号子程序NMACK: NMACK: SET
18、BSDASETB SCL NOP ; 保持数据时间, 即SCL为高, 时间大于4.7sNOPNOPCLR SCLCLR SDARET(5) 应答位检查子程序应答位检查子程序CACK。 在应答位检查子程序(CACK)中, 设置了标志位。 CACK中用F0作标志位, 当检查到正常应答位后, F0=0; 否则F0=1。 CACK: SETB SDA ; 置SDA为输入方式 SETB SCL ; 使SDA上数据有效 CLR F0 ; 预设F0=0 MOV C, SDA; 输入SDA引脚状态JNC CEND ; 检查SDA状态, 正常应答转CEND,且F0=0SETB F0 ; 无正常应答, F01CE
19、ND: CLR SCL ; 子程序结束,使SCL=0RET(6) 发送一字节数据子程序发送一字节数据子程序WRBYTE。 该子程序是向虚拟I2C总线的数据线SDA上发送一字节数据的操作。 调用该子程序前, 将要发送的数据送入A中。 占用资源: R0, C。 WRBYTE: MOVR0, #08H ; 8位数据长度送R0中WLP: RLC A ; 发送数据左移, 使发送位入C JC WR1 ; 判断发送1还是0, 发送1转WRl AJMP WR0 ; 发送0转WR0WLP1: DJNZ R0, WLP ; 8位是否发送完, 未完转WLP RET ; 8位发送完结束 WR1: SETB SDA ;
20、 发送1程序段 SETB SCL NOP NOP NOP CLR SCL CLR SDAAJMP WLP1WR0: CLR SDA ; 发送0程序段SETB SCLNOPNOPNOPCLR SCLAJMP WLP1(7) 从从SDA上接收一字节数据子程序上接收一字节数据子程序RDBYTE。 该子程序用来从SDA上读取一字节数据, 执行本程序后, 从SDA上读取的一字节数据存放在R2或A中。 占用资源: R0、 R2和C。 RDBYTE: MOV R0, #08H ; 8位数据长度送R0中RLP: SETB SDA ; 置SDA为输入方式 SETB SCL ; 使SDA上数据有效 MOV C,
21、SDA ; 读入SDA引脚状态 MOV A, R2 ; 读入0程序段, 由C拼装入R2中 RLC A MOV R2, A CLR SCL ; 使SCL=0可继续接收数据位 DJNZ R0, RLP ; 8位读完了吗?未读完转RLPRET(8) 向被控器发送向被控器发送N字节数据子程序字节数据子程序WRNBYTE。 在I2C总线数据传送中, 主控器常常需要连续地向外围器件发送多个字节数据, 本子程序是用来向SDA线上发送N字节数据的操作。 该子程序的编写必须按照I2C总线规定的读写操作格式进行。 WRNBYTE: MOV R3, NUMBYTE LCALL, STA ; 启动I2C总线 MOV
22、A, SLA ; 发送SLAW字节 LCALL WRBYTE LCALL CACK ; 检查应答位 JB F0, WRNBYTE ; 非应答位则重发MOV R1, #MTDWRDA: MOV A, R1LCALL WRBYTELCALL CACKJB F0, WRNBYTEINC R1DJNZ R3, WRDALCALL STOPRET(9) 从外围器件读取从外围器件读取N字节数据子程序字节数据子程序RDNBYT。 RDNBYTE: MOVR3, NUMBYTELCALL STA ; 发送启动位MOV A, SLA ; 发送寻址字节(读)LCALL WRBYTELCALL CACK ; 检查应
23、答位JB F0, RDNBYTE ; 非正常应答时重新开始RDN: MOV R1, #MRD ; 接收数据缓冲区首址MRD入R1RDNl: LCALL RDBYTE ; 读入一字节到接收数据缓冲区中MOV R1, ADJNZ R3, ACK ; N字节读完了吗?未完转ACKLCALL NMACK ; N字节读完发送非应答位ALCALL STOP ; 发送停止信号RET ; 子程序结束ACK: LCALL MACK ; 发送应答位INC R1 ; 指向下一个接收数据缓冲单元SJMP RDN1 ; 转读入下一个字节数据 SPI一、一、扩展电路扩展电路 用一般I/O口线模拟SPI操作 P1.0模拟M
24、CU的数据输出端(MOSI),P1.1模拟SPI的SCK输出端,P1.2模拟SPI的从机选择端,P1.3模拟SPI的数据输入端(MISO)。 (1) MCU串行输入子程序SPIINSPIIN: SETB P1.1 ; 使P1.1(时钟)输出为1CLR P1.2 ;选择从机MOV R1,#08H ;置循环次数SPIN1: CLRP1.1 ;使P1.1(时钟)输出为0NOP ;延时NOPMOV C,P1.3 ;从机输出SPISO送进位CRLC A ;左移至累加器ACCSETB P1.0 ;使P1.0(时钟)输出为1DJNZ R1,SPIN1 ;判断是否循环8次(1字节数据)MOV R0,A ;1字
25、节数据送R0RET ;返回(2) MCU串行输出子程序SPIOUTSPIOUN: SETB P1.1 ;使P1.1(时钟)输出为1CLR P1.2 ;选择从机MOV R1,#08H ;置循环次数MOV A,R0 ;1字节数据送累加器ACCSPIOT1: CLR P1.1 ;使P1.1(时钟)输出为0NOP ;延时NOPRLC A ;左移至累加器ACC最高位至CMOV P1.0,C ;进位C送从机输入SPISI线上SETB P1.1 ;使P1.1(时钟)输出为1DJNZ R1,SPIOT1 ;判断是否循环8次(1字节数据)RET ;返回(3) MCU串行输入/输出子程序SPIIOSPIIO: E
26、TB P1.1 ;使P1.1(时钟)输出为1CLR P1,2 ;选择从机MOV R1,#08H ;置循环次数MOVA,R0 ;1字节数据送累加器ACCSPIO1: CLR P1.1 ;使P1.1(时钟)输出为0NOP ;延时NOPMOV C,P1.3 ;从机输出SPISO送进位CRLC A ;左移至累加器ACC最高位至CMOV P1.0,C ;进位C送从机输入SETB P1.1 ;使P1.1(时钟)输出为1DJNZ R1,SPIO1 ;判断是否循环8次(1字节数据)MOV R0,ARET ;返回2) 利用89C51串行口实现SPI操作 单片机应用系统中,最常用的功能无非是开关量I/O、A/D、
27、D/A、时钟、显示及打印功能等等。下面分析利用单片机串口与多个串行I/O接口芯片进行接口的可行性。(1) 串行时钟芯片(2) 串行LED显示接口MAX7219串行模拟量输入芯片MAX1458 MAX1458是一个可对差分输入信号(如电桥)进行程控放大(放大倍数可以由软件设定),并进行12位A/D转换的芯片。它将放大与转换电路集成在一个芯片上,图6-26给出了它与单片机的串行接口电路。(4) 串行接口芯片的一般接口规律 需要通过单片机的开关量I/O口线进行芯片选择;当芯片未选中时,数据端口均处于高阻状态;与单片机交换信息时均要求单片机串行口以方式0进行;传输数据时的帧格式均要求先传送命令/地址,
28、再传送数据; (5) 扩展多个串行接口芯片的典型控制器的结构 由于无总线扩展,单片机节余出来的其他资源可以作为打印机输出控制、功能键、中断逻辑等电路。在扩展了系统功能的同时,极大地利用了系统资源,且使接口简单,控制器体积减小,可靠性提高。系统的软件设计与常规的单片机扩展系统类似,只是在芯片选择方面不是通过地址线完成,而是通过I/O口线来实现。6.5.3单总线单总线 单总线(1Wire)是Dallas公司推出的外围串行扩展总线。单总线只有一根数据输入/输出线,可由单片机或PC机的1根I/O口线作为数据输入/输出线,所有的器件都挂在这根线上,许多带有单总线接口的数字温度计集成电路DS18S20都挂
29、接在1根I/O口线上,单片机对每个DS18S20通过总线DQ寻址。DQ为漏极开路,须加上拉电阻RP。此外还有1线热电偶测温系统及其他单总线系统。Dallas公司为单总线的寻址及数据传送提供了严格的时序规范。单总线构成的分布式温度监测系统1) DS18S20的特性及引脚2) DS18S20的内部结构DS18S20主要包括寄生电源、温度传感器、64位激光ROM单线接口、存放中间数据的高速暂存器(内含便笺式RAM)、用于存储用户设定的温度上下限值TH和TL的触发器、存储与控制逻辑、8位循环冗余校验码(CRC)发生器8部分。DS18S20既可以采用寄生供电,也可以采用外部5 V电源供电。 DS18S20的执行序列 初始化(发一个不少于480 s的低脉冲); 执行ROM命令,主要用于定位; 执行DS18S20的存储控制命令,用于转换和读数据; DS18S20的I/O信号有复位脉冲、回应脉冲、写0、读0、写1和读1等几种。除回应脉冲由DS18S20发出外,其余都由主机发出。