单片机原理及应用系统设计第9章---同步通信课件_第1页
单片机原理及应用系统设计第9章---同步通信课件_第2页
单片机原理及应用系统设计第9章---同步通信课件_第3页
单片机原理及应用系统设计第9章---同步通信课件_第4页
单片机原理及应用系统设计第9章---同步通信课件_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第9章 同步通信1单片机原理及应用系统设计本章主要内容12SPI接口I2C通信技术9.1 SPI接口3 IAP15W4K58S4单片机集成了同步串行外设接口(Serial Periphral Interface),SPI)。SPI接口是一种全双工、高速、同步的通信总线,有两种操作模式:主模式和从模式。在主模式中支持高达3 Mbps的速度,还具有传输完成标志和写冲突标志保护。4当前常用的单片机与外设之间进行数据传输的串行总线主要有SPI和I2C总线。SPI总线是以同步串行三线方式进行通信(一条串行时钟线SCLK,一条主出从线MOSI,一条主入从出线MISO)I2C总线以同步串行二线方式进行通信(

2、一条时钟线CLK,一条数据线DATA)9.1 SPI接口5IAP15W4K58S4单片机集成了同步串行外设接口(Serial Periphral Interface),SPI)。SPI接口是 Motorola 公司推出的一 种同步串行接口技术,是一种全双工、高速、同步的通信总线。有两种操作模式:主模式和从模式。在主模式中支持高达3 Mbps的速度,还具有传输完成标志和写冲突标志保护。9.1.1 SPI的结构69.1.1 SPI的结构7SPI的核心是一个8位移位寄存器和数据缓冲器,数据可以同时发送和接收。在SPI数据的传输过程中,发送和接收的数据都存储在数据缓冲器中。对于主模式,若要发送一字节数

3、据,只需将这个数据写到SPDAT寄存器中。主模式下 信号不是必需的;但是在从模式下,必须在 信号变为有效并接收到合适时钟信号后,方可进行数据传输。在从模式下,如果一个字节传输完成后, 信号变为高电平,这个字节立即被硬性逻辑标志为接收完成,SPI接口准备接收下一个数据。9.1.2 SPI接口的引脚8MOSI(Master Out Slave In,主出从入):主器件的输出和从器件的输入,用于主器件到从器件的串行数据传输。当SPI作为主器件时,该信号是输出;当SPI作为从器件时,该信号是输入。数据传输时最高位在先,低位在后。根据SPI规范,多个从机共享一根MOSI信号线。在时钟边界的前半周期,主机

4、将数据放在MOSI信号线上,从机在该边界处获取该数据。MISO(Master In Slave Out,主入从出):从器件的输出和主器件的输入,用于实现从器件到主器件的数据传输。SPI规范中,一个主机可连接多个从机,因此,主机的MISO信号线会连接到多个从机上,或者说,多个从机共享一根MISO信号线。当主机与一个从机通信时,其他从机应将其MISO引脚驱动置为高阻状态。9.1.2 SPI接口的引脚9SCLK(SPI Clock,串行时钟信号):串行时钟信号是主器件的输出和从器件的输入,用于同步主器件和从器件之间在MOSI和MOSO线上的串行数据传输。当主器件启动一次数据传输时,自动产生8个SCL

5、K时钟周期信号给从机。在SCLK的每个跳变处(上升沿或下降沿)移出一位数据。所以,一次数据传输可以传输一个字节的数据。SCLK、MOSI和MISO通常用于将两个或更多个SPI器件连接在一起。数据通过MOSI由主机传送到从机,通过MISO由从机传送到主机。SCLK信号在主模式时为输出,在从模式时为输入。如果SPI接口被禁止,则这些引脚都可作为I/O使用。9.1.2 SPI接口的引脚10SS(Slave Select,从机选择信号):这是一个输入信号,主器件用它来选择处于从模式的SPI模块。主模式和从模式下, 的使用方法不同。在主模式下,SPI接口只能有一个主机,不存在主机选择问题。在该模式下 不

6、是必需的。主模式下通常将主机的 引脚通过10k的电阻上拉高电平。每一个从机的 接主机的I/O口,由主机控制电平高低,以便主机选择从机。在从模式下,不论发送还是接收, 信号必须有效。因此,在一次数据传输开始之前必须将 下拉为低电平。SPI主机可以使用I/O口选择一个SPI器件作为当前的从机。SPI从器件通过其SS引脚确定是否被选择。如果满足下面的条件之一, 就被忽略:(1)如果SPI功能被禁止,即SPEN位为0(复位值)。(2)如果SPI配置为主机,即MSTR位为1,并且P1.2配置为输出(P1M0.2=0,P1M1.2=1)。(3)如果 引脚被忽略,即SSIG位为1,该引脚配置用于I/O端口功

7、能。9.1.3 SPI接口的相关特殊功能寄存器11 与SPI接口有关的特殊功能寄存器有SPI控制寄存器SPCTL、SPI状态寄存器SPSTAT和SPI数据寄存器SPDAT。(1)SPI控制寄存器SPCTL。SPI控制寄存器SPCTL的每一位都有控制含义,地址为CEH,复位值为0000 0000B,各位定义如表9.1所示。位号B7B6B5B4B3B2B1B0位名称SSIGSPENDORDMSTRCPOLCPHASPRISPRO表9.1 SPI控制寄存器SPCTL各位定义9.1.3 SPI接口的相关特殊功能寄存器12 SSIG:引脚忽略控制位。若(SSIG)=1,由MSTR确定器件为主机还是从机,

8、引脚被忽略,并可配置为I/O功能;若(SSIG)功能=0,由 引脚的输入信号确定器件为主机还是从机。 SPEN:SPI使能位。若(SPEN)=1,SPI使能;若(SPEN)=0,SPI被禁止,所有SPI信号引脚用作I/O功能。 DORD:SPI数据发送与接收顺序的控制位。若(DORD)=1,SPI数据的传送顺序为由低到高;若(DORD)=0,SPI数据的传送顺序为由高到低。 MSTR:SPI主/从模式位。若(MSTR)=1,主机模式;若(MSTR)=0,从机模式。SPI接口的工作状态还与其他控制位有关,具体选择方法见表9.2所示。 CPOL:SPI时钟信号极性选择位。若CPOL=1,SPI空闲

9、时SCLK为高电平,SCLK的前跳变沿为下降沿,后跳变沿为上升沿;若CPOL=0,SPI空闲时SCLK为低电平,SCLK的前跳变沿为上升沿,后跳变沿为下降沿。 CPHA:SPI时钟信号相位选择位。若CPHA=1,SPI数据由前跳变沿驱动到口线,后跳变沿采样;若CPHA=0,当 引脚为低电平(且SSIG为0)时数据被驱动到口线,并在SCLK的后跳变沿被改变,在SCLK的前跳变沿被采样。注意:SSIG为1时操作未定义。 SPR1、SPR0:主模式时SPI时钟速率选择位。00表示fSYS/4;01表示fSYS/16;10表示fsys/64,11表示fsys/128。9.1.3 SPI接口的相关特殊功

10、能寄存器13SPENSSIG/ssMSTRSPI模式MISOMOSISCLK备注0XP1.2X禁止P1.4P1.3P1.5SPI信号引脚作普通I/O使用1000从机输出输入输入选择为从机1010从机(未选中)高阻输入输入未被选中,MISO引脚处于高阻状态,以避免总线冲突10010从机输出输入输入配置为输入或准双向口,SSIG为0,如果选择 为低电平,则被选择为从机;当 变为低电平时,会自动将MSTR控制位清0。1011主机(空闲)输入高阻高阻当主机空闲时,MOSI和SCLK为高阻状态以避免总线冲突。用户必须将SCLK上拉或下拉(根据CPOL确定)以避免SCLK出现悬浮状态从机(激活)输出输出主

11、机激活时,MOSI和SCLK为强退挽输出11P1.20从机输出输入输入1主机输入输出输出表9.2 SPI接口的主从工作模式选择9.1.3 SPI接口的相关特殊功能寄存器14(2)SPI状态寄存器SPSTAT。SPI状态寄存器SPSTAT记录了SPI接口的传输完成标志与写冲突标志,地址为CDH,复位值为00 xx xxxxB,各位定义如表9.3所示。位号B7B6B5B4B3B2B1B0位名称SPIFWCOL-表9.3 SPI状态寄存器SPSTAT各位定义 SPIF:SPI传输完成标志。当一次传输完成时,SPIF置位。此时,如果SPI中断允许,则向CPU申请中断。当SPI处于主模式且(SSIG)=

12、0时,如果 为输入且为低电平,则SPIF也将置位,表示“模式改变”(由主机模式变为从机模式)。SPIF标志通过软件向其写“1”而清零。WCOL:SPI写冲突标志。当1个数据还在传输,又向数据寄存器SPDAT写入数据时,WCOL被置位以指示数据冲突。在这种情况下,当前发送的数据继续发送,而新写入的数据将丢失。WCOL标志通过软件向其写“1”而清零.。9.1.3 SPI接口的相关特殊功能寄存器15(2)SPI状态寄存器SPSTAT。SPI状态寄存器SPSTAT记录了SPI接口的传输完成标志与写冲突标志,地址为CDH,复位值为00 xx xxxxB,各位定义如表9.3所示。位号B7B6B5B4B3B

13、2B1B0位名称SPIFWCOL-表9.3 SPI状态寄存器SPSTAT各位定义 SPIF:SPI传输完成标志。当一次传输完成时,SPIF置位。此时,如果SPI中断允许,则向CPU申请中断。当SPI处于主模式且(SSIG)=0时,如果 为输入且为低电平,则SPIF也将置位,表示“模式改变”(由主机模式变为从机模式)。SPIF标志通过软件向其写“1”而清零。 WCOL:SPI写冲突标志。当1个数据还在传输,又向数据寄存器SPDAT写入数据时,WCOL被置位以指示数据冲突。在这种情况下,当前发送的数据继续发送,而新写入的数据将丢失。WCOL标志通过软件向其写“1”而清零.。9.1.3 SPI接口的

14、相关特殊功能寄存器16SPI数据寄存器SPDAT。其地址是CFH,用于保存通信数据字节。 与SPI 中断管理有关的控制位。 SPI中断允许控制位ESPI:位于IE2寄存器的B1位。(ESPI)=1,允许SPI中断;(ESPI)=0,禁止SPI中断。如果允许 SPI中断,发生SPI中断时,CPU就会跳转到中断服务程序的入口地址004BH处执行中断服务程序。注意,在中断服务程序中,必须把SPI中断请求标志清零(通过写1实现)。SPI中断优先级控制器PSPI:PSPI位于IP2的B1位。利用PSPI可以将SPI中断设置为2个优先级。9.1.4 SPI接口的数据通信171.SPI接口的数据通信方式IA

15、P15W4K58S4单片机SPI接口的数据通信方式有3种:单主机-单从机方式,双器件方式(器件可互为主机和从机)和单主机-多从机方式。(1)单主机-单从机方式:此方式电路连接如图9-2所示。主机将SPI控制寄存器SPCTL的SSIG及MSTR位置1,选择主机模式,此时主机可使用任何一个I/O端口(包括 引脚,可当作普通I/O)来控制从机的 引脚;从机将SPI控制寄存器SPCTL的SSIG及MSTR位置0,选择从机模式,当从机 引脚被拉为低电平时,从机被选中。图 9-2 SPI接口的单主机-单从机方式9.1.4 SPI接口的数据通信18 当主机向SPI数据寄存器SPDAT写入一个字节时,立即启动

16、一个连续的8位数据移位通信过程:主机的SCLK引脚向从机的SCLK引脚发出一串脉冲,在这串脉冲的控制下,刚写入主机的SPI数据寄存器SPDAT的数据从主机MOSI引脚移出,送到从机的MOSI引脚,同时之前写入从机SPI数据寄存器SPDAT的数据从从机的MISO引脚移出,送到主机的MISO引脚。因此,主机既可主动向从机发送数据,又可主动读取从机中的数据,从机既可接收主机所发送的数据,也可以在接收主机所发数据的同时,向主机发送数据,但这个过程不可以由从机主动发送。9.1.4 SPI接口的数据通信19(2)双器件方式(器件可互为主机和从机):此方式的电路连接如图9-3所示,两片单片机可以互相为主机或

17、从机。初始化后两片单片机都将各自设置成由引 脚(P1.2)的输入信号确定的主机模式,即将各自的SPI控制寄存器SPCTL中的MSTR、SPEN位置1,SSIG位清0,P1.2引脚(SS)配置为准双向(复位模式)并输出高电平。图9-3 SPI接口的互为主从方式9.1.4 SPI接口的数据通信 当一方要求向另一方主动发送数据时,先检测 引脚的电平状态,如果SS引脚是高电平,就将自己的SSIG位置1设置成忽略SS引脚的主机模式,并将引脚拉低,强制将对方设置为从机模式,这样就是单主单从数据通信方式。通信完毕当前主机再次将引脚置高电平,将自己的SSIG为清0,回到初始状态。 把SPI配置为主机模式(MS

18、TR=1,SPEN=1),并且SSIG=0配置为由引脚(P1.2)的输入信号确定主机或从机的情况下,引脚可配置为输入或准双向模式,只要引脚被拉低,即可实现模式的转变,成为从机,并将状态寄存器SPSTAT中的中断标志位SPIF置1。注意,互为主从模式时,双方的SPI通信速率必须相同。如果使用外部晶体振荡管,双方的晶体频率也要相同。209.1.4 SPI接口的数据通信21(3)单主机多从机方式:此方式的电路连接如图9-4所示。主机将SPI控制寄存器SPCTL的SSIG及MSTR位置1,选择主机模式,此时主机使用不同的I/O端口来控制不同从机的 引脚;从机将SPI控制寄存器SPCTL的SSIG及MS

19、TR位置0,选择从机模式。 当主机要与某一个从机通信时,只要将对应从机的 引脚拉低,该从机被选中。其他从机的 引脚保持高电平,这时主机与该从机的通信已成为单主单从的通信。通信完毕主机再将该从机的 引脚置高电平。 9.1.4 SPI接口的数据通信222SPI接口的数据通信过程 SPI时钟信号相位选择位CPHA用于设置采样和改变数据的时钟边沿,SPI时钟信号极性选择位CPOL用于设置时钟极性,SPI数据发送与接收顺序的控制位DORD用于设置数据传送高低位的顺序。通过对SPI相关参数的设置,可以适应各种外部设备SPI通信的要求。 (1)作为从机时当CPHA时,从机SPI总线数据传输时序如图9-5所示

20、。数据在时钟的第一个边沿被采样,第二个边沿被改变。主机将数据写入发送数据寄存器SPDAT后,首位即可呈现在MOSI引脚上,从机的 引脚被拉低时,从机发送数据寄存器SPDAT的首位即可呈现在MISO引脚上。数据发送完毕不再发送其他数据时,时钟恢复至空闲状态,MOSI、MISO的俩根线上均保持最后一位数据的状态,从机的 引脚被拉高时,从机的MISO引脚呈现高阻态。9.1.4 SPI接口的数据通信23 图9-5 CPHA=0,SPI从机传输格式9.1.4 SPI接口的数据通信24 注意,当 CPHA=0,SSIG必须为0,也就是不能忽略SS引脚, 引脚必须置0并且在每个连续的串行字节发送完后需重新设

21、置为高电平。如果SPDAT寄存器在 有效(低电平)时执行写操作,那么将导致一个写冲突错误。(CPHA)=0且(SSIG)=0时的操作未定义。当CPHA=1时,从机SPI总线数据传输时序如图9-6所示,数据在时钟的第一个边沿被改变,第二个边沿被采样。图9-6 CPHA=1,SPI从机传输格式9.1.4 SPI接口的数据通信25(2)作为主机时当CPHA=0时,主机SPI总线数据传输时序如图9-7所示,数据在时钟的第一个边沿被采样,第二个边沿被改变。在通信时,主机将一个字节发送完毕,不再发送其他数据时,时钟恢复至空闲状态,MOSI、MISO两根线上均保持最后一位数据的状态。图9-7 CPHA=0,

22、SPI主机传输格式9.1.4 SPI接口的数据通信26 当CPHA=1时主机SPI总线数据传输时序如图9.8所示,数据在时钟的第一个边沿被改变,第二个边沿被采样。图9-8 CPHA=1,SPI主机传输格式9.1.5 IAP15W4K58S4单片机的SPI接口的应用实例27SPI接口工作在主模式时可以与具有SPI兼容接口的器件进行同步通信,FLASH存储器、A/D转换器、D/A转换器、LED或LCD驱动器等,可以很好地扩展外围器件实现相应的功能。SPI串行通信初始化思路如下:设置SPI控制寄存器SPCTL。设置SPI接口的主从工作模式等。设置SPI状态寄存器SPSTAT。写入0C0H,清0标志位

23、SPIF和WCOL。向其写“1”清零。根据需要,打开SPI中断ESPI和总中断EA。9.1.5 IAP15W4K58S4单片机的SPI接口的应用实例28例:利用IAP15W4K58S4单片机的SPI接口功能控制74HC595驱动8位数码管(串口扩展,3根线)循环显示0F。电路原理图如9-9所示。 图9-9 SPI控制74HC595驱动8位数码管原理图。9.1.5 IAP15W4K58S4单片机的SPI接口的应用实例29解:C语言源程序如下:#include STC15Fxxxx.H /包含单片机头文件#define SPIF 0 x80 /SPI传输完成标志。写入1清0#define WCOL

24、 0 x40 /SPI写冲突标志。写入1清0#define MAIN_Fosc 11059200ul /定义主时钟#define Timer0_Reload (MAIN_Fosc/1200) /Timer0中断频率9.1.5 IAP15W4K58S4单片机的SPI接口的应用实例30/*常量声明*/unsigned char code t_display=0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F,0 x77,0 x7C,0 x39,0 x5E,0 x79,0 x71,0 x00; / 段码,0Funsigned cha

25、r code T_COM=0 x01,0 x02,0 x04,0 x08,0 x10,0 x20,0 x40,0 x80; /位码sbit SPI_SCL = P15; /SPI同步时钟sbit SPI_MOSO = P13; /SPI同步数据输出sbit P_HC595_RCLK = P41; /SPI片选unsigned char LED88; /显示缓冲unsigned char display_index; /显示位索引bit B_1ms; /1ms标志9.1.5 IAP15W4K58S4单片机的SPI接口的应用实例31/* 主函数 */void main(void) unsigned

26、 char i,k; unsigned int j; SPCTL=(SSIG7)+(SPEN6)+(DORD5)+(MSTR4) +(CPOL3)+(CPHA2)+SPEED_4; /配置SPI TMOD=0 x01; TH0=(65536-Timer0_Reload)/256; TH0=(65536-Timer0_Reload)%256; ET0=1; TR0=1; EA=1; for(i=0;i=500) j=0; for(i=0;i0 x10) k=0; /8个数码管循环显示 /0,1,2.,A,B,F,消隐 /* 主函数 */9.1.5 IAP15W4K58S4单片机的SPI接口的应用

27、实例33/ * SPI发送一个字节函数 */void SPI_SendBte(unsigned char dat) SPSTAT=SPIF+WCOL; /清零SPIF和WCOL标志 SPDAT=dat; /发送一个字节 while(SPSTAT&SPIF)=0); /等待发送完成 SPSTAT=SPIF+WCOL; /清零SPIF和WCOL标志9.1.5 IAP15W4K58S4单片机的SPI接口的应用实例34/ * 显示扫描函数 */void DisplayScan(void) SPI_SendByte(T_COMdisplay_index); /共阴输出位码 SPI_SendByte(t_

28、displayLED8display_index); /共阴出段码 P_HC595_RCLK=1; P_HC595_RCLK=0; /锁存输出数据 if(+display_index=8) display_index=0; /8位结束回09.1.5 IAP15W4K58S4单片机的SPI接口的应用实例35/ * Timer0 1ms中断函数 */void timer0(void) interrupt 1 TH0=(65536-Timer0_Reload)/256; /重装定时值 TH0=(65536-Timer0_Reload)%256; DisplayScan(); /1ms扫描显示一位 B

29、_1ms=1; /1ms标志9.2 I2C通信技术36 I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线制串行总线,用于连接微控制器及其外围设备,具有接口线少、通信速率较高等优点。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片引脚的数量,降低了互联成本。总线的长度可高达25英尺能够以10Kb/s的最大传输速率支持40个组件。9.2 I2C通信技术379.2.1 I2C总线构成I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率1

30、00kb/s。各种被控制电路都并联在这条总线上,就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息传输过程中,I2C总线上并接的每一模块电路取决于所要完成的功能,可以既是主控器(或被控器)又是发送器(或接收器)。CPU发出的控制信号分为地址码和控制量俩部分,地址码用来选择地址,即接通需要控制的电路,确定控制的种类;控制量用来决定该调整的类别及需要调整的量如对比度、亮度等。这样,各控制电路虽然挂在同一条总线上,但彼此独立,互不相关。9.2.2 I2C总线的数据传送 381.数据位的有效性规定 I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳

31、定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化,规定如图9-10所示。图9-10 I2C总线数据位的有效性规定9.2.2 I2C总线的数据传送 392.起始和终止信号SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。起始信号和终止信号时序如图9-11所示。起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。 接收器件收到一个完整的数据字节后,

32、有可能需要完成一些其它工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行。 9.2.2 I2C总线的数据传送 409.2.2 I2C总线的数据传送 413.数据传送格式(1)字节传送与应答 I2C规程运用主/从双向通信,器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。总线必须由主器件(微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上

33、的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件,其串行总线上数据传送顺序如图9-12所示。每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。 9.2.2 I2C总线的数据传送 42图9-12 I2C总线数据传送顺序9.2.2 I2C总线的数据传送 43(2)控制字节 在起始条件之后是器件的控制字节,其中高4位为器件类型识别符(EEPROM一般应为1010,不同的芯片定义不同),接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作,如图9-13所

34、示。图9-13 I2C总线数据传送的控制字节9.2.2 I2C总线的数据传送44(2)写操作写操作分为字节写和页面写两种操作,对于页面写,根据芯片的一次装载的字节不同有所不同。关于页面写的地址、应答和数据传送的时序如图9-14所示。写入字节指令每次只能向芯片中的一个地址写入一个字节的数据。先发送开始位来通知芯片开始进行指令传输,然后传送设置好的器件地址字节,R/W位置0,接着分开传送16位地址的高低字节,再传送要写入的数据,最后发送停止位表示本次指令结束。页写入模式的操作基本和字节写入模式一样,不同在于它需要发送第一个字节的地址,然后一次性发送多个字节的写入数据后,再发送停止位。写入过程中其余

35、的地址增量有芯片内部完成。9.2.2 I2C总线的数据传送 45图9-14 I2C总线的页面写时序图无论哪种写入方式,指令发送完成后,芯片内部开始写入,SDA会被芯片拉高,直到写入完成后SDA才会重新变为有效,编写程序写入时不停发送伪指令并查询是否有SCK返回,如果有ACK返回则可以进行下一步操作。9.2.2 I2C总线的数据传送 46(3)读操作该操作有三种基本操作:当前地址读、随机读和顺序读。图9-15所示是顺序读的时序图。应当注意的是,为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA位高电平,然后发出停止条件。当前地址读取模式是读取当前芯片内部的地址指针

36、指向的数据。每次读写操作后,芯片就会把最后一次操作过的地址作为当前地址。在CPU接收完芯片传送的数据后不必发送低电平的ACK给芯片,直接拉高SDA等待一个时钟后发送停止位。读当前地址是读基本指令,读任意地址时只是在这个基本指令前加一个“伪操作”,这个伪操作传送一个写指令,但这个写指令在地址传送完成后就结束,这时芯片内部的地址指针指到这个地址上,再用读当前地址指令就可以读出该地址的数据。9.2.2 I2C总线的数据传送 47图9-15 I2C总线顺序读时序图9.2.3 单片机模拟I2C总线48IAP15W4K58S4单片机未内置硬件I2C总线接口, 在使用过程中可以用普通的I/O端口模拟I2C总

37、线的工作时序,就可以方便地扩展I2C总线接口的外设器件。在总线的一次数据传送过程中,可以有以下几种组合方式:主机向从机发送数据,数据传送方向在整个传送过程中不变;主机在第一个字节后,立即从从机读数据;在传送过程中,当需要改变传送方向时,需将起始信号和从机地址各重复产生一次,而两次读/写方向位正好相反。为了保证数据传送的可靠性,标准的I2C总线的数据传送有严格的时序要求。I2C总线的起始信号、终止信号、发送“0”及发送“1”的模拟时序 如图9-16所示。9.2.3 单片机模拟I2C总线49图9-16 I2C总线模拟时序图I2C串行总线概述I2C总线是PHLIPS公司推出的一种串行总线,是具备多主

38、机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。 I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。一、数据位的有效性规定 I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。I2C总线的数据传送二、起始和终止信号起始信号:当SCL为高电平期间,SDA由高电平向低电平的跳变;启动信号是一种电平跳变时序信

39、号,而不是一个电平信号。终止信号:当SCL为高电平期间,SDA由低电平向高电平的跳变;终止信号是一种电平跳变时序信号,而不是一个电平信号。起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。接收器件收到一个完整的数据字节后,有可能需要完成一些其它工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行。

40、 三、数据传送格式(1)字节传送与应答每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。 由于某种原因从机不对主机寻址信号应答时(如从机正在进行实时性的处理工作而无法接收总线上的数据),它必须将数据线置于高电平,而由主机产生一个终止信号以结束总线的数据传送。如果从机对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续传送。当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是

41、由对从机的“非应答”来实现的。然后,从机释放SDA线,以允许主机产生终止信号。(2)数据帧格式 I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。 注:有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。 A表示应答, A非表示非应答(高电平)。S表示起始信号,

42、P表示终止信号。在总线的一次数据传送过程中,可以有以下几种组合方式:a、主机向从机发送数据,数据传送方向在整个传送过程中不变:b、主机在第一个字节后,立即从从机读数据c、在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相。四、总线的寻址 I2C总线协议有明确的规定:采用7位的寻址字节(寻址字节是起始信号后的第一个字节)。 (1)寻址字节的位定义D7D1位组成从机的地址。D0位是数据传送方向位,为“0”时表示主机向从机写数据,为“1”时表示主机由从机读数据。主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正

43、被主机寻址,根据R/T位将自己确定为发送器或接收器。 从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。一、典型信号模拟为了保证数据传送的可靠性,标准的I2C总线的数据传送有严格的时序要求。 I2C总线的起始信号、终止信号、发送“0”及发送“1”的模拟时序 : 总线数据传送的模拟 主机可以采用不带I2C总线接口的单片机,如80C51、AT89C2051等单片机,利用软件实现I2C总线

44、的数据传送,即软件与硬件结合的信号模拟。 二、典型信号模拟子程序(1)起始信号Void I2C_Start(void) SDA = 1;SomeNop( );SCL = 1;SomeNop( );SDA = 0;SomeNop( );(2)终止信号void I2C_Stop(void)SDA = 0;SomeNop( );SCL = 1;SomeNop( );SDA = 1;SomeNop( ); I2C总线器件的扩展一、扩展电路 二、串行E2PROM的扩展 (1)串行E2PROM典型产品常见ATMEL公司的AT24C系列E2PROM存储器AT24C01:128字节(1288位);AT24C0

45、2:256字节(2568位);AT24C04:512字节(5128位);AT24C08:1K字节(1K8位);AT24C16:2K字节(2K8位); (2)写入过程AT24C系列E2PROM芯片地址的固定部分为1010,A2、A1、A0引脚接高、低电平后得到确定的3位编码。形成的7位编码即为该器件的地址码。单片机进行写操作时,首先发送该器件的7位地址码和写方向位“0”(共8位,即一个字节),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为响应,单片机收到应答后就可以传送数据了。传送数据时,单片机首先发送一个字节,被写

46、入器件存储区的首地址;收到存储器器件的应答后,单片机就逐个发送各数据字节,但每发送一个字节后都要等待应答。AT24C系列器件片内地址在接收到每一个数据字节地址后自动加1,在芯片的“一次装载字节数”(不同芯片字节数不同)限度内,只需输入首地址。装载字节数超过芯片的“一次装载字节数”时,数据地址将“上卷”,前面的数据将被覆盖。当要写入的数据传送完后,单片机应发出终止信号以结束写入操作。写入n个字节的数据格式 : (3)读出过程单片机先发送该器件的7位地址码和写方向位“0”(“伪写”),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个

47、应答信号作为回应。 然后,再发一个字节的要读出器件的存储区的首地址,收到应答后,单片机要重复一次起始信号并发出器件地址和读方向位(“1”),收到器件应答后就可以读出数据字节,每读出一个字节,单片机都要回复应答信号。当最后一个字节数据读完后,单片机应返回以“非应答”(高电平),并发出终止信号以结束读出操作。 工作过程总线上的所有通信都是由主控器引发的。在一次通信中,主控器与被控器总是在扮演着两种不同的角色。1.主设备向从设备发送数据主设备发送起始位,这会通知总线上的所有设备传输开始了,接下来主机发送设备地址,与这一地址匹配的slave将继续这一传输过程,而其它slave将会忽略接下来的传输并等待

48、下一次传输的开始。主设备寻址到从设备后,发送它所要读取或写入的从设备的内部寄存器地址;之后,发送数据。数据发送完毕后,发送停止位.写入过程如下:发送起始位发送从设备的地址和读/写选择位;释放总线,等到EEPROM拉低总线进行应答;如果EEPROM接收成功,则进行应答;若没有握手成功或者发送的数据错误时EEPROM不产生应答,此时要求重发或者终止。发送想要写入的内部寄存器地址;EEPROM对其发出应答; 发送数据 发送停止位.EEPROM收到停止信号后,进入到一个内部的写入周期,大概需要10ms,此间任何操作都不会被EEPROM响应;(因此以这种方式的两次写入之间要插入一个延时,否则会导致失败)

49、73/*此部分为I2C总线的驱动程序*/#include stc15f2k60s2.h#include i2c.h#include delay.h sbit SCL=P15; /I2C 时钟 sbit SDA=P16; /I2C 数据 /*SDA方向控制*/void IO_SDA(u8 m) if(m=1) P1M1=0X40; /配置SDA为输入 P1M0=0X00; else P1M1=0X00;/恢复SDA双向IO P1M0=0X00; 9.2.3 单片机模拟I2C总线74/*/ 函数名称:起动总线函数 Start_I2C( ) / 函数功能: 启动I2C总线,即发送I2C起始条件. /

50、*/ void Start_I2C( ) SDA=1; /发送起始条件的数据信号 SCL=1; delay4us(2); SDA=0; /发送起始信号 delay4us(2); SCL=0; /钳住I2C总线,准备发送或接收数据 9.2.3 单片机模拟I2C总线75/*/函数名称:结束总线函数 Stop_I2C( ); /函数功能: 结束I2C总线,即发送I2C结束条件. /*void Stop_I2C( ) SCL=0; SDA=0; /发送结束条件的数据信号 delay4us(2); SCL=1; /结束条件建立时间大于4s SDA=1; /发送I2C总线结束信号 delay4us(2);

51、76u8 I2c_wait_ack(void) /等待应答信号到来,返回值:1,接收应答失败 0,接收应答成功 u8 Time=0; IO_SDA(1); /配置SDA为输入 SDA=1; /准备接收应答位 delay4us(1); SCL=1; delay4us(1); while(SDA) Time+;if(Time250) Stop_I2c(); IO_SDA(0); /恢复SDA双向io return 1; /无应答返回1 SCL=0; /时钟输出0 IO_SDA(0); /恢复SDA双向io return 0; /有应答返回0 9.2.3 单片机模拟I2C总线77/字节数据发送函数:

52、SendByte(u8 c)/功能: 将数据c发送出去,可以是地址,也可以是数据void SendByte(u8 c) u8 BitCnt; /条件 一定要开启总线 保持SCL处于0状态才能进行写入 for(BitCnt=0;BitCnt8;BitCnt+) /要传送的数据长度为8位 if(cBitCnt)&0 x80) SDA=1; /判断发送位 发送是由高位开始发送 else SDA=0; delay4us(1); SCL=1; /置时钟线为高,通知被控器开始接收数据位 delay4us(1); SCL=0; delay4us(1); 9.2.3 单片机模拟I2C总线9.2.3 单片机模拟

53、I2C总线78/字节数据接收函数 RcvByte( ); /功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),/发完后请用应答函数应答从机。 u8 RcvByte() u8 retc=0, i; IO_SDA(1);/配置SDA为输入 for(i=0;i8;i+) SCL=0; /置时钟线为低,准备接收数据位 delay4us(1); SCL=1; /置时钟线为高使数据线上数据有效 retc=1; if(SDA=1)retc+; /读数据位,接收的数据位放入retc中 delay4us(1); IO_SDA(0);/恢复SDA双向io return retc; 9.2.3 单片

54、机模拟I2C总线79/应答子函数:Ack_I2Cbit a);/功能:主控器进行应答信号(可以是应答或非应答信号,由位参/数a决定) ,a=1发送应答 a=0不发送应答 准备结束void Ack_I2C(bit a) SCL=0; if(a=1) SDA=0; /在此发出应答或非应答信号 else SDA=1; delay4us(2); SCL=1; delay4us(2); SCL=0; /清时钟线,钳住I2C总线以便继续接收 单片机模拟I2C总线80#include#define uchar unsigned char#define uint unsigned int#define write_ADD 0 xa0#define read_ADD 0 xa1uchar a; sbit SDA=P20;sbit SCL=P21;void SomeNop(); /短延时void init(); /初始化void check_ACK(void);void I2CStart(void);void I2cStop(void);void write_byte(uchar dat);/写字节void delay(uint z);uchar re

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论