单片机原理与应用CollegeofCommunicationEngineering,JilinUniversity第10章单片机片内外设模块2CollegeofCommunicationEngineering,JilinUniversity本章提要10.1并行I/O10.2异步串行通信SCI10.3同步串行通信SPI10.4ATD转换模块10.5周期中断定时器PIT10.6时钟产生器模块3CollegeofCommunicationEngineering,JilinUniversity本章提要10.1并行I/O10.2异步串行通信SCI10.3同步串行通信SPI10.4ATD转换模块10.5周期中断定时器PIT10.6时钟产生器模块4CollegeofCommunicationEngineering,JilinUniversity本节提要10.3.1SPI概述10.3.2SPI模块工作原理10.3.3SPI模块寄存器10.3.4SPI模块编程范例10.3.5SPI模块应用实例5CollegeofCommunicationEngineering,JilinUniversity本节提要10.3.1SPI概述10.3.2SPI模块工作原理10.3.3SPI模块寄存器10.3.4SPI模块编程范例10.3.5SPI模块应用实例6CollegeofCommunicationEngineering,JilinUniversity10.3.1SPI概述——SPI特性SPI(SerialPeripheralInterface)可设置主机模式/从机模式,从机选通输出可选择8位或16位数据宽度可选择从最高位或最低位开始传送可选择全双工模式或单线双向模式可灵活设置的时钟极性和相位可编程的传送速率可实现相互独立的发送和接收数据寄存器和移位寄存器双缓存操作接收中断和发送中断工作方式与LCD驱动器,D/A转换器,EEPROM等通信接口简单7CollegeofCommunicationEngineering,JilinUniversity10.3.1SPI概述——SPI结构框图8CollegeofCommunicationEngineering,JilinUniversity本节提要10.3.1SPI概述10.3.2SPI模块工作原理10.3.3SPI模块寄存器10.3.4SPI模块编程范例10.3.5SPI模块应用实例9CollegeofCommunicationEngineering,JilinUniversity10.3.2SPI工作原理MOSI—主出从入(MasterOut/SlaveInPin)MISO—主入从出(MasterIn/SlaveOutPin)SCK—同步时钟(SerialClockPin)SS—从机片选引脚,一主一从时,主高从低(SlaveSelectPin)主机从机10CollegeofCommunicationEngineering,JilinUniversity7070MOSIMISOCPU端IO端CPU端IO端707MOSIMISO0重复8次10.3.2SPI工作原理主机写发送数据寄存器将启动一次数据传送(位数、传送速率)从机数据送接收数据寄存器,置接收缓存满或发送缓存空标志从机在SS为低电平时与主机同步移位操作从机只能通过主机发起的传输被动传送数据,因此必须经常主动更新要传送给主机的数据11CollegeofCommunicationEngineering,JilinUniversity10.3.3SPI引脚——串行时钟(时序图)SCK奇数跳变沿驱动,偶数跳变沿采样12CollegeofCommunicationEngineering,JilinUniversity10.3.3SPI引脚——串行时钟(时序图)SCK偶数跳变沿驱动,奇数跳变沿采样13CollegeofCommunicationEngineering,JilinUniversity本节提要10.3.1SPI概述10.3.2SPI模块工作原理10.3.3SPI模块寄存器10.3.4SPI模块编程范例10.3.5SPI模块应用实例14CollegeofCommunicationEngineering,JilinUniversity10.3.3SPI寄存器——控制寄存器SPIControlRegister1(SPICR1)-SPI控制寄存器1$00D8SPIControlRegister2(SPICR2)-SPI控制寄存器2$00D91=SPIInterruptEnabled0=SPIInterruptDisabled1=SPISYSTEMEnabled0=SPISYSTEMDisabled1=SPIISMASTER0=SPIISSLAVEDDRS7SSOEMASTERMODESLAVEMODE00SSINPUTSSINPUT(MODFEnabled)01GPINPUTSSINPUT10GPOUTPUTSSINPUT11SSOUTPUTSSINPUT1=SPILSBFIRST0=SPIMSBFIRST1=SPITransmitInterruptEnable0=SPITransmitInterruptDisabledSPISWAI=SPIStopinWaitMode1=HALTSSICLOCKWHENCPUINWAITMODEMODFEN-ModeFaultEnable0=ModeFaultDisabled1=ModeFaultEnabledBIDIROE-OutputEnableinBidirectionalmode0=OutputBufferDisabled1=OutputBufferEnabledSPIClockPolarityBitSPIClockPhaseBitSPC0=SerialPinControlBit01=半双工0=全双工15CollegeofCommunicationEngineering,JilinUniversity练习:20M总线时钟,最大SPI波特率=?最小SPI波特率=?10.3.3SPI寄存器——波特率设置寄存器SPIBaudRateRegisters(SPIBR)-SPI波特率设置寄存器$00DA16CollegeofCommunicationEngineering,JilinUniversity10.3.3SPI寄存器——状态寄存器SPIStatusRegister(SPISR)-SPI状态寄存器$00DBSPIF-SPI接收中断标志1=NewisreceivedintoSPIDRSPTEF-SPI发送缓存空中断标志MODF–主机模式错误标志1=SPIDataRegisterisEmpty1=SPIMasterwasselectedasSlave17CollegeofCommunicationEngineering,JilinUniversity10.3.3SPI寄存器——数据寄存器SPIDataRegister(SPIDR=SPIDRH:SPIDRL)-SPI数据寄存器$00DC$00DD注:用户仅当SPI发送缓冲空标志置位时才能写入该寄存器.注:发送数据与接收数据共享同一个存储地址18CollegeofCommunicationEngineering,JilinUniversity本节提要10.3.1SPI概述10.3.2SPI模块工作原理10.3.3SPI模块寄存器10.3.4SPI模块编程范例10.3.5SPI模块应用实例19CollegeofCommunicationEngineering,JilinUniversity10.3.4SPI模块编程范例SPI模块编程方法①SPI初始化:先写SPI0BR,设定SPI波特率;再写控制寄存器SPI0CR1和SPI0CR2,设定时钟的极性、相位、SPI数据传输宽度、SPI工作模式、中断允许位,并使能SPI模块②SPI收发数据:通过查询SPI0SR中的状态位或采用中断方式,读写数据寄存器,完成数据收发。20CollegeofCommunicationEngineering,JilinUniversity10.3.4SPI模块编程范例——SPI初始化//SPI初始化函数voidSPI_Init(){SPI0BR=0x44;//设定波特率SPI0CR1=0x5C;//关闭SPI中断,置SPI主机模式,使能SPI模块SPI0CR2=0x00;//数据传输宽度为8位,即一个字节}21CollegeofCommunicationEngineering,JilinUniversity10.3.4SPI模块编程范例——SPI收发数据//SPI发送一个字节的函数//参数:send_data为待发送的1字节数据voidSPI_send_char(unsignedcharsend_data){while((SPI0SR&0x20)==0);SPI0DRL=send_data;}//SPI接收一个字节的函数//返回:接收的1字节数据unsignedcharSPI_rev_char(void){while((SPI0SR&0x80)==0);returnSPI0DRL;}22CollegeofCommunicationEngineering,JilinUniversity本节提要10.3.1SPI概述10.3.2SPI模块工作原理10.3.3SPI模块寄存器10.3.4SPI模块编程范例10.3.5SPI模块应用实例23CollegeofCommunicationEngineering,JilinUniversity10.3.5SPI模块应用实例实验9(P266)任务:(1)实现SPI输出,输出端接8位数字量显示电路,在红色LED小灯上显示01010101内容。(2)实现SPI输入,输入端接DIP开关,将输入在PORTB显示出来。(3)扩展内容采用中断方式实现上述内容利用SPI输出实现数码管显示DIP开关数字量通过SCI发送至PC显示双机通信24CollegeofCommunicationEngineering,JilinUniversity10.3.5SPI模块应用实例——SPI输出电路任务(1)中连线如图所示,其中164的MR接PORTA0,164的输出Q0~Q7接位数字量输出显示电路L0~L7。(CP)PORTA025CollegeofCommunicationEngineering,JilinUniversity10.3.5SPI模块应用实例——74HC164/74HCT16474HC164/74HCT164:8位边沿触发式移位寄存器,串入并出引脚说明数据通过DSA或DSB之一串行输入,任一输入端可以用作高电平使能端,控制另一输入端的数据输入;主复位(MR)输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。正电源14VCC输出10~13Q4~Q7主复位输入(低电平有效)9时钟输入(低电平到高电平边沿触发)8CP地(0V)7GND输出3~6Q0~Q3数据输入2DSB数据输入1DSA说明引脚符号真值表26CollegeofCommunicationEngineering,JilinUniversity10.3.5SPI模块应用实例——SPI输入电路任务(2)中连线如图所示,其中165的PL接PORTA1PORTA1CPDS27CollegeofCommunicationEngineering,JilinUniversity10.3.6SPI模块应用实例——74HC165/74HCT16574HC164/74HCT164:8位边沿触发式移位寄存器,并入串出引脚说明正电源16VCC时钟使能输入(低电平有效)15并行数据输入11~14,3~6D0~D7串行数据输入10DS地(0V)8GND互补输出3时钟输入(低电平到高电平边沿触发)2CP异步负载输入(低电平有效)1说明引脚符号真值表28Collegeo