《串行通信》PPT课件.ppt
第二章 串行通信,一、通信概念介绍二、简单的单工串行通信举例三、UART异步串行接口应用 四、SPI串行接口应用 五、I2C串行总线应用六、附录-RS-232标准和RS-485标准,一、通信的基本概念,微处理器与外设交换数据的过程中可选择以下两种方式:并行通信:数据的各个数位同时传送;传输速度快,信息率高;占用的引脚资源多,需要的电缆多,成本高;远距离通信时数据的可靠性和抗干扰性下降。串行通信:数据按照位顺序一位一位传送。传输距离长,抗干扰性强;占用的引脚资源少,成本低。,1.1 串行通信方式,通信双方只要约定好通信格式和通信速度即可通信。串行通信方式可分为两类:异步通信:在异步串行通信中没有同步时钟信号。同步通信:在同步串行通信中数据传送受到同步时钟的控制。,1.2 异步通信,异步通信中,微处理器与外设之间必须有两项规定。第一项规定:双方通信时采用怎样的数据格式。例如UART串行通信双方规定:用ASCII编码,字符为7位,加一个偶校验位、一个起始位以及一个停止位,则一个字符总共由10位组成,形成的数据格式如图所示。,第二项规定:即双方通信过程中每发送一个数位需要多长的时间。在有些场合也称之为波特率,即每秒钟传送的二进制位数(bps)。数据传送的速率为120字符/秒,每一个字符是10位,则波特率为1200bps。PC串口:115200bps 921600bpsModem:19200bps工业场合:4800bpsUART和1-Wire通信标准就是常见的异步通信。在异步通信中发送器和接收器不必用同一个时钟,只要求各局部时钟同一标称频率(波特率)。,1.3 同步通信,在大量数据传送时,采用通信双方(发送器、接收器)在同一个时钟控制下传输数据的同步通信。同步通信是先将许多的字符聚集成一字符块,再将每块信息(常称为信息帧)之前加上12个同步字符,接着再加适当的错误检测数据到字符块,最后才传送出去。,注意:在同步通信时,数据上没有字符传输时,必须发送专用的空闲字符或是同步字符。,冗余:把传输的数据位当做被除数,发送器本身产生一个固定的除数,前者除以后者得到的余数即为冗余字符。,1.4 串行通信制式,在单工制式下,数据只能从发送站向接收站传送。如图:在半双工制式下,数据能双向传送,但是不能同时在两个方向上传送。如图:全双工制式下,接收数据和发送数据占用不同的线路。全双工通信可以同时发送和接收。如图:,在串行通信中数据是在两个站之间进行传送的,按照数据传送方向,串行通信可分为单工、半双工和全双工3种制式。,1.5 串行通信分类,串行通信标准有许多,下面仅对部分常见的串行通信标准进行简单介绍。,二、最简单的单工串行通信举例,与外设串行通信过程中,数据是一位一位依次顺序传送的;而在微处理器内部,数据是并行处理和传送的。当微处理器发送数据到外设时,必须要先把并行的数据转换为串行数据再传送;当微处理器接收来自外设的数据时,必须要先把接收到的串行数据转换为并行数据才能处理。这种并/串之间的转换既可用硬件实现也可用软件实现。本小节以74LS164芯片为例,介绍如何用软件方法实现数据的串并转换。(ARM与74LS164之间的串行通信),1.1 实验目的与内容,实验目的:学会用软件方法模拟串行通信的时序,完成串行通信;深刻理解串行通信的原理,掌握时序分析的基本方法。实验内容:完成ARM芯片与74LS164芯片之间的串行通信,利用LED灯显示传输的数据;在完成基本通信的实验基础上,实现流水灯效果。,1.2.1 实验原理分析,A、B:串行数据输入端。Clock:时钟输入端。Clear:清零端。低电平有效。QAQH:数据输出引脚。,74LS164真值表,74LS164的时钟是由ARM处理器产生,每来1个上升沿74LS164就接收1位数据。假设要使QAQH=10110011,则ARM要发送一串数据10110011给A、B输入端,并产生相应的时钟信号。如下图:,1.3 电路原理图,#define LS164_DATA(125)/LS164_DATA=0 x0200 0000#define LS164_CLK(129)/LS164_CLK=0 x2000 0000#define LS164_CLR(117)/LS164_CLR=0 x0002 0000,74LS164通过ARM的3个I/O脚:P1.17、P3.29、P0.25,分别控制74LS164芯片的清零端口(CLR)、时钟端口(CLK)和数据端口(DATA),引脚定义如下:,程序清单-初始化子程序,/*名称:void LS164_Init(void)*功能:初始化子程序。*入口参数:无*出口参数:无*/void LS164_Init(void)PINSEL1=PINSEL1/设置P1.17为输出,1.4.2 程序清单-发送数据子程序,void LS164_SendData(uint8 data)uint8j;/定义一个8位无符号整型变量jIO1CLR=LS164_CLR;/74LS164输出清零IO1SET=LS164_CLR;/-模拟时钟信号,循环8次完成数据传送-for(j=0;j=1;/data右移一位IO3SET=LS164_CLK;/向74LS164发送一个高电平时钟信号IO3CLR=LS164_CLK;,程序清单-主程序,uint8 const LS164_TAB32=0 x00,0 x01,0 x03,0 x07,0 x0F,0 x1F,0 x3F,0 x7F,0 xFF,0 x7F,0 x3F,0 x1F,0 x0F,0 x07,0 x03,0 x01,0 x00,0 x81,0 x42,0 x24,0 x18,0 x3c,0 x7e,0 xff,0 x00,0 xff,0 x00,0 x55,0 xaa,0 x55,0 xaa,0 x00;/*名称:main()*功能:通过64LS164控制LED灯,实现流水灯*/int main(void)uint8 i;LS164_Init();/引脚初始化 while(1)/-发送数据-for(i=1;i32;i+)LS164_SendData(LS164_TABi);DelayMS(100);/大约延时100毫秒,详见第一章蜂鸣器控制程序 return(0);,1.5 实验结果,观看实验板,每次由ARM处理器向74LS164芯片发送一个8位数据,LED的开关会发生相应的变化。当程序连续运行时,实验板上会出现各种灯闪烁的效果。,三、UART异步串行接口应用,UART通信标准就有专门的硬件UART,即异步接收发送器。UART有2个对外连接的引脚:RxD、TxD:RxD是输入引脚,用于串行数据接收;TxD是输出引脚,用于串行数据发送。,1.1 硬件UART的结构框图,UART数据的接收过程示意图,UART数据的发送过程示意图,1.2 UART的功能,1传输转换功能 UART既能发送,把并行数据转换成串行数据输出;又能接收,把接收的串行数据转换成并行数据输入。,2奇偶校验功能 UART在发送时,检查每个要传送的字符中的“1”的个数,自动在奇偶校验位上添“l”或“0”,使之满足要求;UART在接收时,检查每个字符的各位及奇偶校验位,“1”的个数是否满足要求。,3出错标识功能常用的有以下三种:奇偶错误帧错误溢出错误,1.3 UART通信协议,UART异步串行通信协议需要定义以下5个内容:1起始位 2数据位3奇偶校验位 4停止位5波特率设置,范例如图:,1.4 UART的应用,UART一般可以应用到如下一些场合:1.芯片间的近距离通信 2.与PC机之间的通信 3.模块之间的远距离通信,1、芯片间的近距离通信,同一块板卡上的芯片需要通信时,我们可以采用UART异步串行通信。连接示意图 如下:,2、与PC机的通信,RS-232-C接口是PC机目前最常用的一种串行通讯接口。芯片利用UART可以与PC机进行通讯,由于接口不同从而电流不同,需要使用RS232转换器对通讯信号进行转换,芯片接RS232转换器与PC机通讯图,3、模块之间的远距离通信,RS-485接口的最大传输距离可达3000米,最高传输速率10Mbps,且抗噪声干扰性好。RS-485的电气特性:逻辑“1”以两线间的电压差为+2V+6V表示;逻辑“0”以两线间的电压差为-2V-6V表示。接口信号电平比RS-232-C降低了,该电平与TTL电平兼容,可方便与TTL电路连接。,RS-485通信电路示意图,RS-485接口具有多站能力,能够实现多机间远距离通信。下图是基于RS-485的多机通信系统:,1.5 LPC2220内部UART模块,UART0具有16字节发送FIFO和16字节接收FIFO。UART0内置了波特率发生器。,UART0主要包括3个模块:UART0接收器模块(U0Rx)UART0发送器模块(U0Tx)UART0波特率发生器模块(U0RBG)UART0波特率发生器模块(U0RBG),产生UART0所使用的定时,U0BRG模块时钟源为VPB时钟(pclk),它保存了VPB时钟(pclk)的分频值。时钟源(pclk)与除数锁存LSB寄存器(U0DLL)和除数锁存MSB寄存器(U0DLM)所定义的除数相除得到UART0模块所使用的时钟,该时钟必须为波特率的16倍。波特率计算如下:分频后的时钟=pclk/(U0DLM*256+U0DLL)波特率=分频后的时钟/16,问题:系统时钟(pclk)为64MHz,UART0串行通信所需要的波特率为115200bps,如何设置U0DLL和U0DLM?,除数=64MHz/(16*115200)U0DLM=除数/256=0U0DLL=除数%256=36注意:当U0DLM和UODLL中的值为0 x0000时,系统默认为0 x0001。,1.6 寄存器介绍,UART0包含10个8位寄存器。U0RBR、U0THR、U0SCR、U0DLL、U0DLM、U0IER、U0FCR、U0LCR、U0IIR、U0LSR。,除数锁存访问位DLAB=1时可以设置波特率,U0LCR线控制寄存器,U0LCR决定发送和接收数据字符的格式。,U0LSR线状态寄存器,U0LSR为只读寄存器,它提供UART0的接收和发送模块的当前状态信息。,UART0的初始化设置程序,*名称:UART0_Init(unit32 UART_BPS)*功能:初始化串口0,设置波特率,数据位长度,停止位长度,奇偶校验类型 默认设置为8位数据位,1位停止位,无奇偶校验*入口参数:UART_BPS*出口参数:无*Void UART0_Init(uinit32 UART_BPS)unit16 Fdiv;PINSEL0=0 x00000005;/设置P0.0(Txd)和P0.1(Rxd)连接到UART0/*设置波特率*/U0LCR=0 x83;/DLAB=1,可设置波特率 Fdiv=(Fpclk/16)/UART_BPS;/计算分频值 U0DLM=Fdiv/256;U0DLL=Fdiv%256;/*设置数据格式/*U0LCR=0 x03;/8位数据长度、1个停止位、禁止奇偶校验位,UART0初始化包括三项内容:1引脚连接功能的设置 2波特率的设置 3通信数据格式的设置,1.7 实验目的与内容,实验目的:掌握LPC2220的UART模块中各个控制寄存器的设置,并能使用UART 通信标准与PC机或其他板块进行通信。实验内容1:使用UART0通过RS-232接口向PC机发送数据,并在PC机的超级终端上显示。实验内容2:使用UART1通过RS485接口与另一个板块进行通信,通信数据通过8个LED灯显示。,实验1,PC机一般都会配有12个RS232串行通信接口(简称COM口),利用COM口PC机可以与外部设备实现通信连接。本实验中,我们用ARM实验平台连接PC机。,/*名称:UART0_SendByte(uint8 data)*功能:向串口发送一个字节数据,并等待发送完毕。*入口参数:data要发送的字节数据*/void UART0_SendByte(uint8 data)U0THR=data;/发送数据 while(U0LSR,实验1 程序清单,实验1 程序清单,uint8 const UART0_SEND_TAB=Oh,Succeed!n;/*名称:main()*功能:向串口UART0发送字符串 Oh,Succeed!*/int main(void)uint8*str,data;UART0_Init(115200);while(1)str=UART0_SEND_TAB;while(*str!=0)UART0_SendByte(*str+);/向PC机发送数据data=UART0_RcvByte();/等待PC发送数据 return(0);,实验1结果,在AXD调试软件中全速运行程序,串口调试助手,将会显示一串字符“Oh,Succeed!”。,当PC台式机向实验板发送任何字符后,串口调试助手的接收窗口会再多一串字符“Oh,Succeed!”。,实验2,当设备间需要远距离通信时可以考虑采用RS485通信。,Max483是一款半双工的芯片,板卡1用于数据发送(客户端)板卡2用于数据接收(服务器端),实验2 程序清单-服务端程序,#define DERE(110)/连接 P0.10/*名称:UART1_Init(uint32 UART_BPS)*功能:ARM处理器UART1相关引脚与功能模块的初始化*入口参数:UART_BPS 串口的波特率*/void UART1_Init(uint32 UART_BPS)uint16 Fdiv;PINSEL0=(PINSEL0/8位字符长度、1个停止位、禁止奇偶效验,/*名称:uint8 UART1_RcvByte(void)*功能:通过RS-485接收一字节数据。*出口参数:data接收到的数据*/uint8 UART1_RcvByte(void)uint8rcv_data;IO0CLR=DERE;/RE引脚置低,使其处于接收状态while(U1LSR,实验2 参考程序清单-客户端程序,void UART1_SendData(uint8 data)IO0SET=DERE;/DE引脚置高,使Max483处于发送状态 U1THR=data;/发送数据 while(U1LSR,四、SPI串行接口应用,SPI是由Motorola公司提出的一种同步串行外围接口。它在速度要求不高、低功耗、需保存少量参数的智能化传感系统中得到了广泛应用。SPI是一个全双工的同步串行接口。在数据传输过程中,总线上只能是一个主机和一个从机进行通信。,在数据传输中,主机总是向从机发送1字节的数据(MOSI),同时从机向主机发送1字节的数据(MISO)。,1.1 SPI接口的信号描述,1MISO(Master In Slave Out)主机输入、从机输出信号。2MOSI(Master Out Slave In)主机输出、从机输入信号。3SCK(Serial Clock)串行时钟信号。4SS(Slave Select)从机选择信号。低电平有效。,注意:1、主设备必须为微处理器,从设 备可以是微处理器也可以是其他带有SPI接口的芯片。2、主设备的SS应接高电平。3、先发送MSB,在发送LSB。4、SCK由主设备产生。主设备和从设备必须在相同的时序下工作。,1.2 基于SPI接口的系统组成,SPI总线可在软件的控制下构成各种简单或复杂的系统。,SPI总线与多从机连接示意图,1.3 SPI接口的工作原理,SPI的基本结构相当于两个8位移位寄存器的首尾相接,构成16位的环形移位寄存器。从而实现了主机与从机的数据交换。,SPI接口的基本结构图,1.4 LPC2220内部SPI模块,LPC2220中具有两个完全独立的SPI控制器:SPI0和SPI1。其中SPI0模块有4个引脚:SCK0、SSEL0、MISO0、MOSI0,其功能如下:,一个SPI总线可以连接多个主机和多个从机,但是在同一时刻只允许有一个主机操作总线。可通过SSEL引脚设置LPC222为SPI主机或从机。,1.5 SPI数据传输,SPI接口可由CPOL和CPHA设定4种不同传输格式的时序。CPOL决定时钟脉冲SCK的有效脉冲方式(正脉冲、负脉冲)。CPHA决定数据线MOSI什么时候输出数据或采集数据。根据CPOL和CPHA的组合数目,一共有4种设置情况。,4种时序下的数据传输,其中“第一位数据的输出”和“其他位数据的输出”栏是表示数据在什么时候更新输出。还需注意数据采样是上升沿还是下降沿有效。数据与时钟的相位关系如图:,1.6 SPI寄存器,LPC的SPI内部结构框图如表所示。,SPI内部包括控制寄存器、数据寄存器、状态寄存器、时钟计数寄存器、中断标志寄存器。具体描述见表:,SPI控制寄存器(SPCR),SPI状态寄存器(SPSR),SPI数据寄存器(SPDR),SPI时钟寄存器(SPCCR),SPI中断标志寄存器(SPINT),1.7 SPI的使用,1主机操作SSEL0引脚接高电平,数据传输步骤为:设置S0PCCR寄存器,确定分频值。设置S0PCR寄存器,控制SPI0为主机。当有多个从机情况下,控制片选信号,选择要通信的从机。将要发送的数据写入S0PDR寄存器,即启动SPI传输。读取S0PSR寄存器,等待SPIF位置位。从SPI数据寄存器中读出接收到的数据(可选)。如果还有数据要传送,则重复第46步骤,否则取消对从机选择。第46步骤。,通过SSEL引脚的电平可以配置LPC2220为SPI主机或为SPI从机,LPC2220内部SPI支持主机操作和从机操作。下面以SPI0模块为例分别介绍。,1.7 SPI的使用,2从机操作SSEL0引脚接低电平,数据传输步骤为:设置S0PCR寄存器,控制SPI0为从机。不需要设置S0PCCR寄存器。将要发送的数据写入S0PDR(可选)。读取S0PSR寄存器,等待SPIF位置位。从SPI数据寄存器中读出接收到的数据(可选)。如果还有数据要传送,则跳到第2步。,74HC595芯片介绍,当SCLR为低电平时,输出端Q清零;当SCLR=1,SCK出现上升沿时,内部寄存器移位并接收SER端发来的数据;当RCK出现上升沿时,74HC595内部寄存器的数据输出到QAQH。74HC595在SCK上升沿进行数据采样,因此CPOL=0,CPHA=0。,真值表,74HC595引脚图,1.8 电路原理图分析,74HC595的控制端口和SPI串行通信端口连接LPC2220的相关引脚。,并行输出端口QAQH连接到数码管上,数码管输出显示的内容完全取决于SPI0模块所传输的内容。,1.9 程序清单,/*名称:SPI0_SendData()*功能:向SPI总线发送数据,并接收从机发回的数据。*入口参数:data 待发送的数据*出口参数:返回值为接收到的数据*/uint8 SPI0_SendData(uint8 data)S0PDR=data;while(0=(S0PSR,/*名称:void HC595_Init(void)*功能:初始化引脚与SPI0模块。*入口参数:无*出口参数:无*/void HC595_Init(void)/-引脚初始化-PINSEL0=(PINSEL0/设置SPI接口模式,MSTR=1,主模式/CPOL=0,CPHA=0,LSBF=1,LSB在前,#define smgA1(122)/p2.22连接数码管的第一个位选端uint8 const TAB10=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x98;/-int main(void)uint8 i;HC595_Init();/HC595初始化/-打开数码管-IO2DIR=IO2DIR|smgA1;IO2CLR=smgA1;while(1)/-向74HC595发送数据-for(i=0;i10;i+)HC595_SendData(TABi);DelayMS(1);,五、I2C串行总线应用,I2C BUS 是Philips公司推出的一种基于两线的芯片间串行传输总线。I2C总线采用了器件地址的硬件设置方法,通过软件寻址完全避免了器件的片选线寻址方法,从而使硬件系统具有最简单而灵活的扩展方法。I2C总线在标准模式下,数据传输率可达100kbps,高速模式下可达400kbps。目前I2C总线被广泛应用于消费类电子产品、通信产品、仪器仪表及工业测控系统中。,1.1 基于I2C总线的系统组成,在I2C总线上只需要串行数据SDA线和串行时钟SCL线两条线。每个器件都有一个唯一的地址以供识别,并工作在主模式或者从模式下,而且各器件都可以作为一个发送器或接收器。主模式用于初始化总线的数据传输并产生允许传输时钟信号SCL,从模式则被主器件寻址,并被动的接受和发送数据;微控制器包含的I2C发送/接收器都可以选择作为主模式(Master)或从模式(Slave)工作。但任一时刻I2C总线上只允许一个微控制器工作在主模式下,作为主控器;而另一个微控制器必须工作在从模式下,作为被控器。,1.2 I2C总线的特点,1二线传输2无中心主机3软件寻址4应答式数据传输过程5节点可带电接入或撤出,1.3 I2C信号描述与数据传输,1起始信号和终止信号I2C总线的时钟线SCL与数据线SDA均为双向传输线。时钟线SCL高电平时,数据线出现由高电平向低电平变化的启动信号,启动I2C总线;时钟线SCL高电平时,数据线上出现由低到高的电平变化,此信号即为I2C总线的停止信号,结束I2C总线的数据传输。起始信号和终止信号均有主机发出。,I2C总线的启动信号与停止信号,2数据信号I2C总线在进行数据传输时,在时钟线为高电平期间,数据线上必须保持稳定的逻辑电平状态。只有在时钟线为低电平时,才允许数据线上的电平状态发生变化。,数据位的传输,3应答信号数据发送方每发送一个字节数据后,需要得到数据接收方的一个应答信号。应答信号通过数据线(SDA)传输,与应答信号相对应的时钟(第9个时钟)由主控器产生。如图所示,I2C总线的数据传输格式,传输的第一个8位数据为寻址字节,包括7位的被控器地址和1位方向位,接着被控器发出A(应答位),紧接着的是主控器与被控器之间数据传输和应答。在数据传输完成后,主控器要发出停止信号。数据传输格式如图:,读写位:1读 0写,1.4 LPC2220内部I2C模块,LPC2220内部具有I2C总线接口模块,可与连接外部标准I2C部件接口。LPC2220的I2C模块可配置为主机、从机或主/从机。LPC2220的I2C接口包含7个寄存器如表所列:,I2C控制置位寄存器I2CONSETI2CONSET寄存器的某一位写入1,相应位将置1;对该寄存器写入0,相应位不会置0,必须向I2CONCLR寄存器写入1来实现某一位的清零操作。,I2C状态寄存器I2STAT主发送模式下的状态寄存器。,I2C状态寄存器I2STAT主接收模式下的状态寄存器。,I2C数据寄存器I2DAT,I2C从地址寄存器I2ADR,I2C的SCL时钟寄存器I2SCLH I2CSCLL,I2DAT中的数据移位总是从右至左进行:第一个发送的位是MSB,第一个接收的位也是MSB。,在主模式下,I2ADR无效。,位频率=Fpclk/(I2SCLH+I2SCLL),I2SCLH和I2SCLL的值必须大于4,在从模式下,I2SCLH和I2SCLL无效。,1.5 I2C模块的使用,LPC2220系列可配置为I2C主机和从机具有2种模式:,主/从模式下的操作包括:1、初始化操作2、数据发送操作3、数据接收操作,主模式下的初始化操作,先设置I/O口功能选择,然后设置总线的速率,再配置好I2CONSET寄存器和I2CONCLR寄存器。配置I2CONSET寄存器和I2CONCLR寄存器主要完成以下一些任务:1、选择主机模式(AA=0)2、使能主I2C(I2EN=1)3、清零某些位(SI=0,STA=0)具体操作:向I2CONSET寄存器写入Ox40会将I2EN置1,即使能I2C接口。向I2CONCLR写入Ox2C 会将AA、STA和SI置0。,I2C主模式设置程序,/*名称:I2C_Init(unit32 F_I2C)*功能:I2C模块初始化为主模式,未打开中断。*入口参数:F_I2C初始化I2C总线速率,最大值为40K*出口参数:无*/void I2C_Init(unit32 F_I2C)PINSELO=(PISELO&OxFFFFFOF)|Ox50;/设置I2C控制口有效if(F_I2C 400000)F_I2C=40000;I2SCLH=(Fpclk/F_I2C+1)/2;/设置I2C时钟为F_I2CI2SCLL=(Fpclk/F_I2C)/2;I2CONCLR=Ox2C;I2CONSET=Ox40;/使能主I2C,主模式下的数据发送,主模式I2C的数据发送格式见图所示,起始信号S和停止信号P用于指示串行传输的起始和结束。数据的发送每次为8位,即一字节,每发送完一个字节,主机都接收到一个应答位(是由从机回发的)。,操作步骤如下:1、置位STA进入I2C主发送模式,I2C逻辑在总线空闲后,立即发送一个起始条件;2、当发送起始条件后,等待SI置位(只有当SI=1时,I2DAT才能访问并保持稳定状态),此时I2STAT的状态为08H;3、把从地址和读写操作位装入I2DAT,清零SI位,开始发送从地址和读写操作位;4、当把从地址和读写操作位已发送并且接受到从机应答位后,SI位再次置位,现在的状态码可能为18H、20H、38H;5、如果状态码为18H,表明主机已经接收到应答位,则可以将数据装入I2DAT寄存器,然后清零SI位,开始发送数据;6、正确发送数据后,SI位再次置位,可能的状态码为28H,30H,此时可以根据状态码进行下一个操作。,主模式下的数据发送,/*名称:I2C_Send()*功能:主发送模式,与从器件进行数据交互。*入口参数:SlaveAddr从器件地址pSendData待发送的数据指针Num发送的数据长度*出口参数:1 代表发送成功;0 代表发送失败*/uint8 I2C_Send(unit8 SlaveAddr,uint8*pSendData,uint32 Num)uint32 i;I2CONSET=0 x20;/发送起始位while(I2CONSET/等待SI置位,if(I2STAT!=0 x18)/未接收到应答,则发送停止位,数据传输中止。I2CONSET=0 x10;return 0;/*发送Num个字节数据数据*/for(i=0;iNum;i+)I2CONCLR=0 x08;/SI位清零I2DAT=*(pSendData+i);while(I2CONSET,主模式下的数据接收,主机所接收的数据字节来自从发送器(即从机),起始和停止条件用于指示串行传输的起始和结束。第一个发送的数据包含接收器件的从地址(7位)和读写操作位(1位)。,操作步骤如下:1、置位STA进入I2C主接收模式,I2C逻辑在总线空闲后,立即发送一个起始条件;2、当发送起始条件后,等待SI置位(只有当SI=1时,I2DAT才能访问并 保持稳定状态),此时I2STAT的状态为08H;3、清零SI位,把从地址和读写操作位装入I2DAT,开始发送从地址和读写操作位;4、当把从地址和读写操作位已发送并且接受到从机应答位后,SI位再次置位,现在的状态码可能为38H、40H、48H;5、如果状态码为40H,表明主机已经接收到应答位,设置AA位,用来控制接收数据后产生应答位还是非应答位,然后清零SI位,开始接收数据;6、正确发送数据后,SI位再次置位,可能的状态码为50H、58H,此时可以根据状态码进行下一个操作。,从模式下的初始化操作,LPC2220系列器件配置为I2C从机时,I2C主机可以对它进行读/写操作。要初始化从接收模式,并向I2CONSET写入0 x44实现I2C使能和AA位置1,向I2CONCLR写入0 x28清零起始位和中断标识,即可等待主机访问。通常初始化程序中加入了中断的初始化。I2C总线时钟信号是由主机产生,所以从机不用初始化I2SCLH和I2SCLL寄存器。,I2C从模式初始化设置,/*名称:I2C_SlaveInit()*功能:从模式I2C初始化,包括初始化其中断为向量IRQ中断。*入口参数:adr 本从机地址*出口参数:无*/void I2C_Slavlnit(uit8 adr)PINSELO=(PINSELO&OxFFFFFFOF)|Ox50;/设置I2C控制口有效I2ADR=adr&OxFE;/设置从机地址I2CONCLR=0 x28;I2CONSET=Ox44;/I2C配置为从机模式/*设置I2C中断允许*/VICIntselect=OxOOOOOOOO;/设置所有通道为IRQ中断VICVectCntl0=Ox29;/I2C通道分配到IRQ slot 0,即优先级最高VICVectAddr0=(int)IRQ_I2C;/设置I2C中断向量地址VICIntEnale=Ox0200;/使能I2C中断,从模式下的数据发送,当主机访问从机时,若读写操作位为1(读操作),则从机进入从发送模式,向主机发送数据,并等待主机的应答信号。,从模式下的数据接收,当主机访问从机时,若读写操作位为0(写操作),则从机进入从接收模式,接收主机发送 过来的数据,并产生应答信号。,六、附录-RS-232标准,RS-232标准(协议)的全称是EIA-RS-232标准。它是一个全双工的通信标准。这些标准都是在RS-232标准的基础上经过改进而形成的。RS-323C标准是美国EIA(电子工业联合会)与BELL等公司一起开发的1969年公布的通信协议。它适合于数据传输速率在020000b/s范围内的通信。这个标准对串行通信接口的有关问题都作了明确规定。,RS-232C标准它早期被应用在计算机与调制解调器(MODEM)的连接控制,MODEM再通过电话线进行远距离数据传输。但是严格来讲,RS232接口是DTE与DCE之间的接口。RS-232C标准对电器特性、逻辑电平和各种接口信号及功能都作了规定,下面分别进行讲述。,1.1 RS-232标准中定义的信号线,RS-232C规标准接口有25条信号线,但常用的只有9根,它们是2个数据信号,1个信号地线,6个控制信号。如表所示:,DB-9型 RS-232的接口示意图,RS-485与RS-232不一样,数据信号采用差分传输方式,也称作平衡传输,它使用一对双绞线,将其中一线定义为A,另一线定义为B,另有一个信号地C,在某些情况下是可以不用的。,六、附录-RS-485标准,RS-485标准中的信号,1.1 RS-485网络安装注意要点,RS-485支持32个节点,因此多节点构成网络。在构建网络时,应注意如下几点:1)采用一条双绞线电缆作总线,将各个节点串接起来,从总线到每个节点的引出线长度应尽量短,以便使引出线中的反射信号对总线信号的影响最低。2)注意总线特性阻抗的连续性,在阻抗不连续点就会发生信号的反射。总之,应该提供一条单一、连续的信号通道作为总线。,1.2 思考与练习,1、在ARM微处理器与外设进行数据交互的过程中,有哪两种数据传送方式,分别适合应用在哪些场合?2、在串行通信方式中,除了书上所讲的RS232、RS485、SPI、I2C以外,请你再举出3种以上其他的串行通信方式。3、串行通信方式从整体上来讲可分为两类,其中异步通信过程中,微处理器与外设之间应该有哪些规定,才能有效地完成通信?那么同步通信呢?4、串行通信中有哪3种通信制式,请你对每种通信制式举一个例子。5、常用的74LS164是一个用于串转并的通信芯片,请问芯片中有哪些引脚是用于与微处理器通信的,哪些引脚是用于并行输出的?如果ARM想让74LS164芯片的输出端全为高电平,请画出通信时序图。6、一般的UART异步接收/发送器具备些什么功能?UART异步通信应用在哪些场合?7、UART通信协议包含了哪些内容?,8、LPC2220中的UART0模块包含了哪些子模块?请问如何设置UART0模块的波特率?9、UART0模块如何发送和接收通信数据,U0LSR寄存器有什么作用?10、SPI总线接口使用了哪些接口信号,这些接口信号各自有什么作用?11、LPC2220既可以作为SPI通信主机,又可以作为SPI通信从机,请问如何设置?SPI通信有多种传输格式,请问LPC2220中能否支持?12、配置LPC2220中SPI0模块为主机,然后向SPI总线发送一个字节的数据,请问大致步骤怎样?13、根据节中对74HC595的描述,请你找出74HC595芯片中的SPI通信引脚,并画出该芯片的通信时序图?14、I2C总线接口使用了哪些接口信号,这些接口信号各自有什么作用?15、I2C总线有什么特点?I2C总线上可以同时拥有多个主机吗?16、请问I2C总线上的起始信号、数据信号、应答信号和终止信号是如何描述的?17、如何设置LPC2220中的I2C模块为主发送模式?该模式下,I2C总线上的起始信号、停止信号以及应答信号分别是由谁发送的?18、RS232标准中的逻辑电平是如何定义的?在RS232标准中定义了许多信号线,请问哪几根线涉及到数据传送。19、与RS232相比,RS485标准有什么优势?20、RS485标准中的逻辑电平是如何定义的?,