《8051单片机原理及应用》 课件 郭玲 第7、8章 I2C总线开发、SPI总线开发_第1页
《8051单片机原理及应用》 课件 郭玲 第7、8章 I2C总线开发、SPI总线开发_第2页
《8051单片机原理及应用》 课件 郭玲 第7、8章 I2C总线开发、SPI总线开发_第3页
《8051单片机原理及应用》 课件 郭玲 第7、8章 I2C总线开发、SPI总线开发_第4页
《8051单片机原理及应用》 课件 郭玲 第7、8章 I2C总线开发、SPI总线开发_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

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

文档简介

网络空间安全学院网络安全基础技术应用第七章I2C总线开发目录CONTENT7.1.I2C总线标准7.2.GPIO模拟I2C总线协议的开发技术7.3.STC单片机I2C功能模块开发技术7.1.I2C总线标准I2C总线只有两根双向信号线:一根是数据线SDA,另一根是时钟线SCL,通常用于芯片和芯片之间的数据交换,是串行总线半双工通信。I2C器件的应用优点:减少了电路间连线,减小了电路板尺寸,标准化通信过程,降低了硬件成本,并提高了系统可靠性。7.1.1.I2C总线基本概念I2C是一种串行总线,是在微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简化,器件封装形式小,通信速率较高等优点。图7.1-1展示了I2C总线传输过程,Master是主机,Slave是从机,根据各器件的功能角色可划分发送端、接收端,根据各器件的主从地位又可划分为主器件、从器件。I2C总线只有两根双向信号线:一根是数据线SDA,另一根是时钟线SCL,在主从通信中,可以有多个I2C总线器件同时接到I2C总线上,通过地址来识别通信对象。图7.1-1I2C总线基本概念7.1.1.I2C总线基本概念发送端:发送数据到总线上的器件。接收器:从总线上接收数据的器件。主机:为启动数据传送(START指令)、产生时钟(SCL)信号并中止数据传送(STOP指令)的器件,也称主控端,SCL信号必须由主控端发送,主控端是发送端或接收端。从机:被主器件寻址的器件。从属端可以扮演接收端或发送端的角色。当发送端器件可以主动将数据放到总线,称为主控发送端;若可以回应主控端的要求,称为从属发送端。当接收端器件可以主动接收数据时,称为主控接收端;若依照主控端要求而接收,称为从属接收端。7.1.2.I2C总线结构I2C总线上数据的传输速率在标准模式下可达100kbit/s,在快速模式下可达400kbit/s,在高速模式下可达3.4Mbit/s,典型的I2C总线结构见图7.1-2,所有I2C设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。在总线上至少必须有一个主控端,在图7.1-2中,主控端可以是单片机A或是单片机B。图7.1-2I2C总线结构7.1.2.I2C总线结构SDA和SCL都是双向线路,I2C总线需通过上拉电阻接正电源,当总线空闲时,两根线均为高电平,总线上任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线与关系,见图7.1-3。所谓“线与”是指连接到总线的器件输出级是漏极开路或集电极开路,此时只要有一个器件输出低电平,总线就被拉低。图7.1-3I2C总线电路原理图7.1.2.I2C总线结构如图7.1-4所示,在I2C总线系统中,CPU是核心,I2C总线由CPU电路引出,其他被控对象均挂接在I2C总线上。CPU是主机,挂接在总线上的设备是从机,SCL上的时钟信号始终由主机产生。图7.1-4CPU和被控对象的连接方式每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。在单片机应用系统的串行总线扩展中,我们经常遇到的是以单片机为主机,其它接口器件为从机的单主机情况。7.1.3.I2C总线的通信格式图7.1-5是I2C总线的时序图:SCL是节拍周期Clock;SDA是数据位。每个节拍上都有一个数据位在传输。发送器给出起始位,每发出一个字节,接收器都要应答一次,给出ACK信号。发送器的数据发送完毕后,发出停止位。图7.1-5I2C时序图7.1.3.I2C总线的通信格式I2C总线时序图关键描述如下:起始START信号:当SCL=1阶段中,在SDA上有一个下降沿跳变,标识着数据传输启动。停止STOP信号:当SCL=1阶段中,在SDA上有一个上升沿跳变,标识着数据传输停止。应答ACK信号:SDA=0,表示接收成功,否则是接收失败,或者无应答。最后一个字节接收器可以不应答。在数据传输的过程中必须通过ACK信号来保证数据的有效性。I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化,见图7.1-6所示。图7.1-6数据位传输的时序7.1.3.I2C总线的通信格式从图7.1-1到图7.1-6主机和从机都共享一根SDA、SCL,为了说清楚一个字节中SDA的控制情况,图7.1-7中用了2根SDA示意了主机SDA和从机SDA的信号情况——主机是发送端,前8个时钟都由主机控制SDA的电平状态,第9个时钟由从机控制SDA的电平。主机传送完毕一个字节,从机可以不应答,称为“非应答”,SDA保持高电平不变,说明字节接收不成功;从机“应答”,则从机把SDA拉低,表示字节接收成功。图7.1-7一个字节的传输演示7.1.3.I2C总线的通信格式图7.1-8给出了起始、终止、应答、非应答的时间标准。在程序编写时,需要注意各个信号的最小持续时间要求。例如,起始信号S中SDA的高电平保持时间需大于4.7微秒,若此过程中SDA跳变为低电平后,则SCL信号大于4微秒后才能变化为低电平,从另一个角度看,即SDA数据建立时间需大于4微秒才能满足I2C的时间标准。图7.1-8数据传输位的时间标准7.2.GPIO模拟I2C总线协议的开发技术I2C总线简单方便,是芯片间通信经常使用的一种总线,很多芯片都具有I2C接口。当MCU没有I2C功能模块时,可利用通用输入输出管脚模拟I2C总线协议。7.2.1.GPIO模拟I2C总线的驱动函数对照图7.1-7、图7.1-8时序图,书写I2C总线单字节读写函数,放置在i2c.c文件中,文件中的函数说明如表7.2-1所示。序号函数名函数说明1voidi2c_delay(unsignedchari)I2C总线延时2voidi2c_start(void)I2C总线起始信号S,在SCL是高电平期间,SDA从高电平变低,该下降沿意味着传输的起始。3voidi2c_stop(void)I2C总线终止信号P,在SCL是高电平期间,SDA从低电平变高,该上升沿意味着传输的结束。4voidi2c_sendbyte(unsignedcharbyt)总线发送函数,函数输入参数是发送内容。5unsignedchari2c_waitack(void)总线等待应答函数,返回值是从机应答位。6unsignedchari2c_receivebyte(void)总线接收函数,返回值是接收内容。7voidi2c_sendack(unsignedcharackbit)总线发送应答函数,函数输入参数是应答位电平。表7.2-1GPIO模拟I2C总线的驱动函数7.2.1.GPIO模拟I2C总线的驱动函数i2c.c文件见二维码7.2-1。二维码7.2-1GPIO模拟I2C总线驱动程序7.2.2.GPIO模拟I2C总线访问PCF8591数模转换ADC芯片PCF8591是单片、单电源低功耗8位ADC芯片,具有4个模拟输入、一个输出和一个串行I2C总线接口,采用8位逐次逼近式AD转换,主要应用于电池供电、汽车、音响等模拟数据采集。ADC的最大转换速率取决于I2C总线的最高速率。PCF8591采用I2C总线接口与CPU交换数据,它将采集到的模拟量转换成二进制数值,输出到I2C总线上。图7.2-1是PCF8591芯片管脚图,图7.2-2表明器件的通道3连接电位器,电位器电压可调,图7.2-3是PCF8591的工作电路图,PCF8591通过I2C总线(P20、P21)与上位机MCU通信。图7.2-1图PCF8591器件管脚图

图7.2-2

通道3电位器电压采集7.2.2.GPIO模拟I2C总线访问PCF8591数模转换ADC芯片图7.2-3图

PCF8591工作电路图7.2.2.GPIO模拟I2C总线访问PCF8591数模转换ADC芯片1.写时序:写时序如图7.2-4所示,这个过程是单片机写数据到ADC器件。由起始信号S、PCF8591器件地址(Address)、控制字节(ControlByte)、N个数据字节(DataByte),以及停止位组成。每写完一个字节,单片机都要释放总线,接收来自PCF8591的应答。图7.2-4PCF8591的写时序图7.2-5是ADC器件地址编码,高四位固定1001,低四位可编程,最后一位表示读写方向,“1”表示读器件,“0”表示写器件。图7.2-5ADC器件的地址编码7.2.2.GPIO模拟I2C总线访问PCF8591数模转换ADC芯片图7.2-6是控制字节,规定了PCF8591的工作方式,控制字节每个位的定义:D1D0:A/D通道编号。00——通道0;01——通道1;10——通道2;11——通道3。D2:自动增益选择,当该位是“1”时表示自动增益,否则手动增益。D5D4:模拟量输入方式,00——四路单端输入;01——三路差分输入;10——两两单端与一路差分;11——两路差分。D6:模拟输出使能。当AD模拟-数字转换时该位是“0”,当DA数字-模拟转换时该位“1”。图7.2-6PCF8591的控制寄存器7.2.2.GPIO模拟I2C总线访问PCF8591数模转换ADC芯片按照图7.2-4书写单片机初始化ADC器件的代码如下:voidinit_pcf8591(void){ i2c_start(); i2c_sendbyte(0x90);//器件地址 i2c_waitack(); i2c_sendbyte(0x03);//控制字节,ADC通道3模拟量输入 i2c_waitack(); i2c_stop(); }7.2.2.GPIO模拟I2C总线访问PCF8591数模转换ADC芯片2.读时序:图7.2-7是PCF8591的读时序,这个过程是单片机获取ADC数据的时序,由起始位(S)、器件地址(Address)、N个转换数据及停止位构成。首先单片机写器件地址,然后等待来自PCF8591的应答,接着PCF8591发送内容到总线,每发送一个字节,主机都应答一次,如果主机不应答(发送1),主机随后发送停止位。图7.2-7PCF8591的读时序7.2.2.GPIO模拟I2C总线访问PCF8591数模转换ADC芯片按照图7.2-7书写获取ADC转换数值的函数。unsignedcharadc_pcf8591(void){ unsignedchartemp; i2c_start(); i2c_sendbyte(0x91);//器件地址 i2c_waitack(); temp=i2c_receivebyte();//读取ADC转换数值 i2c_sendack(1); i2c_stop(); returntemp;7.2.2.GPIO模拟I2C总线访问PCF8591数模转换ADC芯片 returntemp;}令模数转换器PCF8591连接电位器电压如图7.2-2所示,GPIO模拟I2C总线读取电位器电压,图7.2-8是电压显示界面,二维码7.2-2展示了开发示范过程。图7.2-8电压显示界面7.2.2.GPIO模拟I2C总线访问PCF8591数模转换ADC芯片二维码7.2-2GPIO模拟I2C总线电压采集程序实现7.3.STC单片机I2C功能模块开发技术单片机模拟I2C总线需要自己书写I2C总线驱动函数,开发工作量大。STC8x、STC32x系列单片机内部集成了一个I2C串行总线控制器,通过配置寄存器就可以实现I2C通信。使用单片机I2C功能模块的步骤是:首先规定I2C功能管脚,其次配置I2C功能模块工作方式,最后读出I2C模块的寄存器数据。7.3.1.I2C管脚切换STC8x、STC32x系列单片机提供I2C总线管脚切换功能,可将SCL和SDA切换到不同的I/O口上,以方便用户分时复用I2C总线。(1)P_SW2:寄存器名称地址bit7bit6bit5bit4bit3bit2bit1bit0P_SW2BAHEAXFR-I2C_S[1:0]CMPQ_SS4_SS3_SS2_SI2C_S[1:0]:I2C功能脚选择位I2C_S[1:0]SCLSDA00P1.5P1.401P2.5P2.410P7.7P7.611P3.2P3.37.3.2.I2C控制寄存器STC系列单片机提供的I2C总线提供了两种操作模式:主机模式(SCL为输出口,发送同步时钟信号),和从机模式(SCL为输入口,接收同步时钟信号)1.I2C配置寄存器寄存器名称地址bit7bit6bit5bit4bit3bit2bit1bit0I2CCFG7EFE80HENI2CMSSLMSSPEED[5:0]ENI2C:I2C功能使能控制位。0:禁止I2C功能;1:允许I2C功能。MSSL:I2C功能模式选择位。0:从机模式;1:主机模式。MSSPEED[5:0]:I2C总线速度(等待时钟数),I2C总线速度=SYSCAK/2/(MSSPEED*2+4)。只有当I2C模块工作在主机模式时,MSSPEED参数设置的等待参数才有效。7.3.2.I2C控制寄存器2.I2C控制寄存器(1)I2C主机控制寄存器EMSI:主机模式中断使能控制位。0:关闭主机模式的中断;1:允许主机模式的中断。MSCMD[3:0]主机命令。寄存器名称地址bit7bit6bit5bit4bit3bit2bit1bit0I2CMSCR7EFE8HEMSI---MSCMD[3:0]7.3.2.I2C控制寄存器MSCMD[3:0]命令说明0000待机,无动作0001起始命令,发送START信号0010发送数据命令,SCL产生8个时钟,并将I2CTXD内容按位送到SDA0011接收ACK信号0100接收数据命令,SCL产生8个时钟,按位读取SDA数据0101发送ACK命令0110停止命令,发送STOP信号0111保留1000保留1001起始命令+发送数据命令+接收ACK命令,0001+0010+0011组合。1010发送数据命令+接收ACK命令,0010+0011组合1011接收数据命令+发送ACK(0)命令1100接收数据命令+发送NAK(1)命令7.3.2.I2C控制寄存器(2)I2C从机控制寄存器寄存器名称地址bit7bit6bit5bit4bit3bit2bit1bit0I2CSLCRFE83H-ESTAIERXIETXIESTOI--SLRSTESTAI:从机模式时接收到START信号中断允许位。0:禁止中断;1:使能中断。ERXI:从机模式时接收到1字节数据后中断允许位。0:禁止中断;1:使能中断。ETXI:从机模式时发送完成1字节数据后中断允许位。0:禁止中断;1:使能中断。ESTOI:从机模式时接收到STOP信号中断允许位。0:禁止中断;1:使能中断。SLRST:复位从机模式。7.3.2.I2C控制寄存器3.I2C状态寄存器(1)I2C主机状态寄存器寄存器名称地址bit7bit6bit5bit4bit3bit2bit1bit0I2CMSSTFE82HMSBUSYMSIF----MSACKIMSACKOMSBUSY:主机模式时I2C控制器状态位(只读)。0:控制器处于空闲状态;1:控制器处于忙碌状态。MSIF:主机模式的中断请求位(中断标志位)。当处于主机模式的I2C控制器执行完成寄存器I2CMSCR中MSCMD命令后产生中断信号,硬件自动将此位置1,向CPU发出中断请求,响应中断后MSIF位必须用软件清零。MSACKI:主机模式时,发送“0011”命令到I2CMSCR的MSCMD位后所接收到的ACK数据。MSACKO:主机模式时,准备将要发送出去的ACK信号。当发送“0101”命令到I2CMSCR的MSCMD位后,控制器会自动读取此位的数据当做ACK发送到SDA。7.3.2.I2C控制寄存器(2)I2C从机状态寄存器寄存器名称地址bit7bit6bit5bit4bit3bit2bit1bit0I2CSLSTFE84HSLBUSYSTAIFRXIFTXIFSTOIF-SLACKISLACKOSLBUSY:从机模式时I2C控制器状态位(只读)。0:控制器处于空闲状态;1:控制器处于忙碌状态。STAIF:从机模式时接收到START信号后的中断请求位。从机模式的I2C控制器接收到START信号后,硬件会自动将此位置1,并向CPU发中断请求,响应中断后STAIF位必须用软件清零。RXIF:从机模式时接收到1字节的数据后的中断请求位。RXIF必须由软件清零。TXIF:从机模式时发送完成1字节数据后的中断请求位。TXIF也必须由软件清零。STOIF:从机模式时接收到STOP信号后的中断请求位。STOIF也必须由软件清零。SLACKI:从机模式时,接收到到的ACK数据。SLACKO:从机模式时,准备将要发送出去的ACK信号7.3.2.I2C控制寄存器4.I2C数据寄存器寄存器名称地址bit7bit6bit5bit4bit3bit2bit1bit0I2CTXDFE86HI2CRXDFE87HI2CTXD:I2C发送数据寄存器,存放将要发送的I2C数据;I2CRXD:I2C接收数据寄存器,存放接收完成的I2C数据。7.3.3.I2C主机模式访问AT24C02AT24C系列是电可擦写存储器EEPROM,数据的存储和取出采用I2C总线实现,AT24C系列产品有以下几种:AT24C01:128字节(128×8位);AT24C02:256字节(256×8位);AT24C04:512字节(512×8位)AT24C08:1K字节(1K×8位);AT24C16:2K字节(2K×8位);以AT24C02为例它的读取时序有如下规定。7.3.3.I2C主机模式访问AT24C021.单字节的写——写数据到存储单元图7.3-1是单字节的读时序,此处省略了SCL时钟线,SDALine的每个小方块都和SCL时钟周期节拍对应,一个小方块就是一个时钟周期。小方块对应一个二进制数值0或1。整个过程的时序由五部分组成,这五部分分别是:起始START位、器件地址(DeviceAddress)、存储单元地址(WordAddress)、要存储的数据(Data)、结束STOP位。在两个地址、一个数据之后都有ACK应答,ACK来自从机。图7.3-1单字节的写时序7.3.3.I2C主机模式访问AT24C022.单字节的读——从存储单元读数据图7.3-2是EEPROM单字节读时序,时序中有2个START,第一个是假写,说明I2C总线要访问的器件和存储单元地址,第二个是真的读,给出器件地址,然后把数据读出来,图中打箭头指示的地方都是来自从机的应答信号。图7.3-2单字节的随机读时序7.3.3.I2C主机模式访问AT24C023.连续字节的写——CPU将多个字节写入存储块图7.3-3是连续字节写时序,在单片机在总线上发出器件地址和存储地址后,连续写入数据,在连续写的过程中从机自动将存储地址指向下一个单元。对于AT24C01和AT24C02一次装载的字节数是8,AT24C04、AT24C08、AT24C16芯片一次装载的字节数是16。图7.3-3连续字节的写时序7.3.3.I2C主机模式访问AT24C02按照图7.3-3的时序,对应程序如下:voidWriteNbyte(u8addr,u8*p,u8number)/*WordAddress,FirstDataAddress,Bytelenth*/{Start();//发送起始命令SendData(SLAW);//发送设备地址+写命令RecvACK();SendData(addr);//发送存储地址RecvACK();do7.3.3.I2C主机模式访问AT24C02{SendData(*p++);RecvACK();}while(--number);Stop();//发送停止命令}7.3.3.I2C主机模式访问AT24C024.连续字节的读——CPU将存储块的数据读出来图7.3-4是连续字节读时序,和单字节的读一样,也有一个“假写”过程,然后是真的读。图中箭头的地方都是主机发出的应答信号。图7.3-4连续字节的读时序在读的过程中,主机应答(0),存储器持续将下一个地址里的数据送到SDA上,当最后一个字节数据读完后,单片机应返回“非应答”(电平1),并发出终止信号以结束读出操作。主机回复应答信号后,要令SDA为1,释放总线,以便开展下一次通信。7.3.3.I2C主机模式访问AT24C02按照图7.3-4时序图,对应程序如下:voidReadNbyte(u8addr,u8*p,u8number)/*WordAddress,FirstDataAddress,Bytelenth*/{Start();//发送起始命令SendData(SLAW);//发送设备地址+写命令RecvACK();SendData(addr);//发送存储地址RecvACK();Start();//发送起始命令SendData(SLAR);//发送设备地址+读命令7.3.3.I2C主机模式访问AT24C02RecvACK();do{*p=RecvData();p++;if(number!=1)SendACK();//sendACK}while(--number);SendNAK();//sendnoACK Stop();//发送停止命令}任务1.I2C功能模块应用开发任务要求:在第七届蓝桥杯单片机决赛试题中要求选手将测量到的电压波动事件记录到EEPROM中,当设备重新上电后,能够从EEPROM里获取事件发生时间、事件类型、电压上限、电压下限等参数和数据。为了简化,本任务对EEPROM里任意4个存储单元读写,内容显示在数码管。具体要求如下:1.初始化AT24C02第1~4单元的内容。2.当按键P34按下后,记录按键次数。3.为了对比和调试,将读取到的数据同时发送到单片机USB虚拟串口。任务资讯:AT24CX(X=02,04,08,16,等)是串行E2PROM芯片,图7.3-5是AT24C02连接电路图。图7.3-5AT24C02的连接电路图图7.3-6按键电路任务1.I2C功能模块应用开发采用单片机自身I2C总线模块进行程序开发,其开发步骤是:1.设置P2.4、P2.5是I2C总线;2.设置I2C功能模块是主机模式;3.按照AT24C02的写时序,依次发送起始信号、写器件地址、写单元地址、写数据命令。4.按照AT24C02的读时序,依次发送起始信号、写器件地址、写单元地址、发送起始信号、发送读信号、读取数据。任务1.I2C功能模块应用开发任务参考主要代码:/*************本地函数声明**************/voidWriteNbyte(u8addr,u8*p,u8number);voidReadNbyte(u8addr,u8*p,u8number);voidDelay1ms(u8ms);voidDisplayScan(void);voidmain(void){P_SW2=0x90;//使能XFR访问,I2C选择P2.4,P2.5I2CCFG=0xe0;//使能I2C主机模式I2CMSST=0x00;/*设置USB虚拟串口*/任务1.I2C功能模块应用开发P3M0&=~0X03;//USB数据线 P3M1|=0X03; IRC48MCR=0x80; while(!(IRC48MCR&0x01)); USBCLK=0X00; USBCON=0X90; usb_init(); IE2|=0x80; while(DeviceState!=DEVSTATE_CONFIGURED); /*显示EEPROM初始值*/ for(i=0;i<4;i++)//显示EEPROM初值 {任务1.I2C功能模块应用开发 dspbuf[2*i]=datam[i]&0x0f;//显示数字小于16,个位数 dspbuf[2*i+1]=datam[i]>>4&0x0f;//显示数字小于16,十位数 } while(1){if(key1==0){Delay1ms(10);//按键去抖 while(key1==0);//等待按键释放 key_cnt++; datam[0]=key_cnt; //第一个单元存储按键次数任务1.I2C功能模块应用开发 dspbuf[2*i]=datam[i]&0x0f;//显示数字小于16,个位数 dspbuf[2*i+1]=datam[i]>>4&0x0f;//显示数字小于16,十位数 } while(1){if(key1==0){Delay1ms(10);//按键去抖 while(key1==0);//等待按键释放 key_cnt++; datam[0]=key_cnt; //第一个单元存储按键次数WriteNbyte(AT_addr,datam,4); //写数据到eeprom存储单元 Delay1ms(2);任务1.I2C功能模块应用开发 ReadNbyte(AT_addr,datam,4);//读EEPROM内容, //显示EEPROM读出值 for(i=0;i<4;i++) { dspbuf[2*i]=datam[i]&0x0f;//显示数字小于16,个位数 dspbuf[2*i+1]=datam[i]>>4&0x0f;//显示数字小于16,十位数 } //虚拟串口同步显示EEPROM数据 USB_SendData(datam,4); } if(bUsbOutReady){usb_OUT_done();//接收应答(固定格式)} }}7.2.1.GPIO模拟I2C总线的驱动函数任务23开发过程见二维码7.3-1。二维码7.3-1STC单片机I2C功能模块应用程序结论:在上面的程序中,由于单片机内部集成了一个I2C串行总线控制器,I2C总线的起始信号、停止信号、读写信号都是通过配置I2C串行总线控制器的寄存器实现,相比7.2节的开发,省去了编写I2C总线底层驱动函数,本程序相对简单明了。谢谢&提问网络空间安全学院网络安全基础技术应用第八章SPI总线开发目录CONTENT8.1.SPI总线的基本概念8.2.GPIO模拟SPI总线的开发技术8.3.STC单片机SPI功能模块开发技术8.1.SPI总线的基本概念SPI接口是SerialPeripheralInterface的缩写,顾名思义就是串行外围设备接口。SPI接口是Motorola公司首先提出的全双工同步串行接口通信协议,采用主从模式架构,支持多从设备应用,一般只支持单主设备。SPI总线一般有4根信号线:MOSI,MISO,SCK,SS。在使用的时候,时钟由主设备控制,数据在时钟脉冲下按位传输,高位在前低位在后,SPI接口有2根单向数据线,可以实现全双工通信,数据速率可达几Mbps。8.1.1.SPI总线结构SPI的四根总线分别是串行数据输出线、输入线、时钟线、设备选择线。MOSI:MasterOutputSlaveInput主器件数据输出,从器件数据输入。MISO:MasterInputSlaveOutput主器件数据输入,从器件数据输出。SCK:时钟信号,由主设备控制发出。/SS:从设备选择信号,由主设备控制。有些器件也用“CS”表示。8.1.1.SPI总线结构图8.1-1展示了主机和从机之间的连接关系。主机(也称主设备)和从机(也称从设备)的MOSI、MISO、SCK管脚互相连接,主设备的SS接VCC,从设备的SS接地。因为只有一个从设备,所以从设备的SS接地,意味着从设备始终都处于通信状态。因此在只有一个从设备的情况下会省略SS,SPI总线变成三线制。SCK是时钟脉冲,由主机控制,沿着SCK的上升沿或者下降沿,MOSI、MISO的数据串行输出,实现数据交换。

图8.1-1主机和从机的电路连接8.1.2.SPI总线的传输模式根据时钟极性(CPOL)及相位(CPHA)不同可以组合成4种工作模式:SPI0,SPI1,SP2,SP3。其中使用的最为广泛的是SPI0和SPI3方式。(1)SPI0:CPOL=0,CPHA=0(2)SPI1:CPOL=0,CPHA=1(3)SPI2:CPOL=1,CPHA=0(4)SPI3:CPOL=1,CPHA=1时钟极性(CPOL)定义了时钟空闲状态电平:CPOL=0:时钟空闲状态为低电平。CPOL=1:时钟空闲状态为高电平。时钟相位(CPHA)定义数据的采样时间:CPHA=0:在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样。CPHA=1:在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。8.1.2.SPI总线的传输模式SPI接口有四种不同的数据传输时序,取决于CPOL和CPHA这两位的组合。图8.1-2中表现了这四种时序,从图中也可以看出CPHA=0与CHPA=1,采样和输出先后顺序正好相反。。图8.1-2SPI总线的工作模式8.2.GPIO模拟SPI总线的开发技术SPI总线把接收和发送分成了两根线,通信速度快,和I2C总线一样,通常用于芯片间通信。很多芯片都具有SPI接口,当MCU没有SPI功能模块时,利用通用输入输出管脚模拟SPI总线协议。8.2.1.GPIO模拟SPI总线的驱动函数对照图8.1-2时序图,书写SPI总线单字节读写函数,读写的时候低位在前,高位在后。以SPI0工作模式为例,SCK默认状态是低电平,在上升沿采样,在下降沿输出,SPI是全双工通信,所以发送和接收是同时进行的。(1)SPI0模式下主机的读写函数:主机在MOSI总线上写数据,在MISO总线上读数据。unsignedcharSPIMaster_RWByte(unsignedchardata){unsignedchari;for(i=0;i<8;i++){sck=0;MOSI=data&0x01;//数据的低位输出到MOSIdata>>=1;//数据右移,高位移到低位8.2.1.GPIO模拟SPI总线的驱动函数sck=1;//拉高SCKdata|=(MISO<<8);//读MISO到data最高位,补充data低位空缺。sck=0;}return(data);//返回读出的字节数据}(2)SPI0模式下从机的读写函数:从机在MOSI总线读数据,在MISO总线写数据unsignedcharSPISlave_RWByte(unsignedchardata){unsignedchari;for(i=0;i<8;i++){8.2.1.GPIO模拟SPI总线的驱动函数if(sck==0){ MISO=data&0x01;//从机数据的低位输出到MISO}while(sck==0);data<<=1;If(sck==1){data|=(MOSI<<8);//从机读MOSI到data最高位,补充data高位空缺。while(sck==1);}}return(data);}8.2.2.GPIO模拟SPI总线访问DS1302日历芯片DS1302是DALLAS公司推出的日历芯片,内含有一个实时时钟/日历和31字节静态RAM,利用简化的SPI总线与单片机通信。DS1302提供秒、分、时、日、周、月、年的信息,每月的天数和闰年自动调整,时钟可以选择12小时制或24小时制。DS302有12个寄存器,其中有7个寄存器与日期和时间相关,其余都是控制寄存器。要使用DS1302,首先将日期和时间等初始化数据写入DS1302的寄存器,设置时间格式,然后开启DS1302计时。当DS1302初始化设置完并开启计时后,单片机只要读出DS1302里的日期或时间即可。图8.2-1是DS1302的DIP封装图和管脚说明,图8.2-2是芯片工作电路图,图8.2-3是DS1302应用电路。图8.2-1中的I/O数据线是双线数据线,它将SPI总线的MOSI和MISO两根线合并成一根线,收发不能同时进行,是半双工通信。8.2.2.GPIO模拟SPI总线访问DS1302日历芯片图8.2-1DS1302芯片管脚图图8.2-3DS1302应用电路图8.2-2芯片工作电路图8.2.2.GPIO模拟SPI总线访问DS1302日历芯片图8.2-3中SPI的三根线分别和单片机P17、P23、P13连接。DS1302采用双电源供电模式,可以由VCC电源供电(连接VCC2管脚),也可以由电池供电(连接VCC2管脚),在VCC主电源失效时由电池保持时间和日期数据。RST是芯片复位和片选管脚,低电平时,芯片复位,读写无效;高电平时,片选有效,开始数据传输。SCK管脚为芯片提供时钟脉冲。I/O是数据输入输出管脚,用于传输及接收数据。芯片连接32.768KHz外部晶振。表8.2-1列出了DS1302的寄存器。ReadWritebit7bit6bit5bit4bit3bit2bit1bit0说明81h80hCH10SecondsSeconds秒:00-59,CH=1:时钟暂停83h82h

10MinutesMinutes分:00-5985h84h12/24010Hour时:00-23/01-12AM/PM87h86h0010DateDate日:01-28/29/30/3189h88h00010MonthMonth月:01-128Bh8Ah00000Day星期:1-78Dh8Ch10YearYear年:00-998Fh8EhWP0000000控制寄存器,WP=1:写保护,不允许器件写入91h90hTCSDSRS涓流充电选择表8.2-1DS1302和日期时间有关的寄存器列表8.2.2.GPIO模拟SPI总线访问DS1302日历芯片访问DS1302,首先要说明访问的存储单元地址,然后在总线上传送数据。因此一个完整的读或写至少有2个字节构成。1.读时序:图8.2-4是读时序,对应SPI0工作模式,第1个字节写地址,CPU控制I/O线;第2个字节读数据,由DS1302发送数据到I/O线。图8.2-4单个字节读时序8.2.2.GPIO模拟SPI总线访问DS1302日历芯片2.写时序:图8.2-5是写时序,对应SPI0工作模式,2个字节都是CPU控制I/O线。图8.2-5单个字节写时序8.2.2.GPIO模拟SPI总线访问DS1302日历芯片2.写时序:图8.2-5是写时序,对应SPI0工作模式,2个字节都是CPU控制I/O线。图8.2-5单个字节写时序8.2.2.GPIO模拟SPI总线访问DS1302日历芯片DS1302的读写时序是三线半双工通信,一个时钟周期内只有一个方向的数据,主机单个字节的读写函数如下所示。/*****主机单个字节的写过程*****/voidwrite_Ds1302_Byte(unsignedchardata){ unsignedchari; for(i=0;i<8;i++) { SCK=0; SDA=data&0x01;//数据低位输出到IO总线上 data>>=1;//数据右移,高位移到低位 SCK=1;

8.2.2.GPIO模拟SPI总线访问DS1302日历芯片 }}/*****主机单个字节的读过程*****/unsignedcharread_Ds1302_Byte(){ unsignedchari,data; for(i=0;i<8;i++) { SCK=0; data>>=1; data|=(SDA)<<8; //读SDA数据到data最高位 SCK=1; 8.2.2.GPIO模拟SPI总线访问DS1302日历芯片 }return(data);}

/*****图8.2-4时序DS1302完整的读过程***/unsignedcharRead_Ds1302(unsignedcharaddress){ unsignedchari,temp=0x00; Write_Ds1302_Byte(address);//写地址return(read_Ds1302_Byte());}/*****图8.2-5时序DS1302完整的写过程***/ 8.2.2.GPIO模拟SPI总线访问DS1302日历芯片voidWrite_Ds1302(unsignedcharaddress,unsignedchardata){ Write_Ds1302_Byte(address); //写地址 Write_Ds1302_Byte(data); //写数据}基于GPIO模拟SPI总线,让单片机与DS1302日历芯片交换数据,数码管分两屏显示日期和时间,图8.2-6是日历显示界面,二维码8.2-1展示了开发示范过程。 图8.2-6日历显示界面8.2.2.GPIO模拟SPI总线访问DS1302日历芯片二维码8.2-1GPIO模拟SPI总线读日历芯片的程序实现8.3.STC单片机SPI功能模块开发技术STC单片机从15系列开始就提供SPI总线功能,与SPI相关的寄存器有SPI状态寄存器、SPI控制寄存器、SPI数据寄存器,通过这三个寄存器就可以完成SPI数据的传输。8.3.1.SPI管脚切换对于SPI总线端口分配,STC15x、STC8x、STC32x系列单片机提供了切换模式,可将SS、MOSI、MISO、SCLK切换到不同的I/O口上,以方便用户将灵活应用管脚。(1)P_SW:SPI功能脚切换寄存器名称地址Bit7Bit6Bit5Bit4Bit3Bit2B

温馨提示

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

评论

0/150

提交评论