吉林大学通信工程学院单片机原理与应用10.2同步串行外设接口SPI2单片机原理与应用本节提要一、SPI概述二、SPI模块功能三、SPI模块引脚四、SPI模块寄存器五、SPI模块编程范例3单片机原理与应用本节提要一、SPI概述二、SPI模块功能三、SPI模块引脚四、SPI模块寄存器五、SPI模块编程范例4单片机原理与应用SPI特性可设置主机模式/从机模式可选择8位或16位数据宽度可选择全双工模式(一个)或单线双向模式可灵活设置的时钟极性和相位可选择从最高位或最低位开始传送可编程的传送速率可实现双缓存操作与LCD驱动器,D/A转换器,RTC,EEPROM等通信接口简单;5单片机原理与应用SPI的数据流动6单片机原理与应用7070MOSIMISOCPU端IO端CPU端IO端707MOSIMISO0重复8次SPI工作原理7单片机原理与应用本节提要一、SPI概述二、SPI模块功能三、SPI模块引脚四、SPI模块寄存器五、SPI模块编程范例8单片机原理与应用SPI方框图SPI时钟发生器移位寄存器控制寄存器9单片机原理与应用主机模式控制整个数据传送通过定义SS选择通信从机确定SCK波特率,相位和极性切换SCK脉冲驱动MOSI信号采样MISO信号通过写入SPIDR触发传输过程10单片机原理与应用从机模式响应传输仅当定义了相应的SS才被激活利用事先定义的相位和极性检测SCK跳变沿驱动MISO信号采样MOSI信号11单片机原理与应用本节提要一、SPI概述二、SPI模块功能三、SPI模块引脚四、SPI模块寄存器五、SPI模块编程范例12单片机原理与应用.SPI引脚1——串行数据引脚MOSI—MasterOut/SlaveInPinMISO—MasterIn/SlaveOutPinSPI置为主机模式:MISO–数据输入线MOSI–数据输出线SPI置为从机模式:MISO–数据输出线MOSI–数据输入线作用:发送和接收串行数据13单片机原理与应用.SPI引脚2——串行时钟SCK—SerialClockPin主机模式下,SCK信号来源于内部MCU总线时钟同步信号,对MOSI和MISO引脚传输的串行输入、输出数据进行同步主机和从机在SCK信号的跳变沿进行移位和采样数据SCK的时钟频率由SPI0BR选择主机和从机遵守相同时序模式14单片机原理与应用SPI信号–SCK极性&相位SCK奇数跳变沿驱动,偶数跳变沿采样15单片机原理与应用SPI信号–SCK极性&相位(续)SCK偶数跳变沿驱动,奇数跳变沿采样16单片机原理与应用.SPI引脚3——外设片选SS—SlaveSelectPin主机模式:SS信号上拉到高电平主机和从机对SS引脚使用不同从机模式:SS信号为低电平17单片机原理与应用本节提要一、SPI概述二、SPI模块功能三、SPI模块引脚四、SPI模块寄存器五、SPI模块编程范例18单片机原理与应用SPI寄存器1/4SPICR1-SPI控制寄存器11=SPIInterruptEnabled0=SPIInterruptDisabled1=SPISYSTEMEnabled0=SPISYSTEMDisabled1=SPIISMASTER0=SPIISSLAVEDDRS7SSOEMASTERMODESLAVEMODE00SSINPUTSSINPUT(MODFEnabled)01GPINPUTSSINPUT10GPOUTPUTSSINPUT11SSOUTPUTSSINPUT1=SPILSBFIRST0=SPIMSBFIRST1=SPITransmitInterruptEnable0=SPITransmitInterruptDisabledSPICR2-SPI控制寄存器2SPISWAI=SPIStopinWaitMode1=HALTSSICLOCKWHENCPUINWAITMODEMODFEN-ModeFaultEnable0=ModeFaultDisabled1=ModeFaultEnabledBIDIROE-OutputEnableinBidirectionalmode0=OutputBufferDisabled1=OutputBufferEnabled19单片机原理与应用练习:20M总线时钟,最大SPI波特率=?最小SPI波特率=?SPI寄存器2/420单片机原理与应用SPI寄存器3/4SPISR-SPI状态寄存器SPRF-SPI接收中断标志1=NewisreceivedintoSPIDRSPTEF-SPI发送缓存空中断标志MODF–主机模式错误标志1=SPIDataRegisterisEmpty1=SPIMasterwasselectedasSlave21单片机原理与应用SPI寄存器4/4SPIDataRegister(SPIDR=SPIDRH:SPIDRL)-SPI数据寄存器注:用户仅当SPI发送缓冲空标志置位时才能写入该寄存器.注:发送数据与接收数据使用相同寄存器22单片机原理与应用本节提要一、SPI概述二、SPI模块功能三、SPI模块引脚四、SPI模块寄存器五、SPI模块编程范例23单片机原理与应用SPI模块编程范例SPI模块编程方法①SPI初始化:先写SPI0BR,设定SPI波特率;再写控制寄存器SPI0CR1和SPI0CR2,设定时钟的极性、相位、SPI数据传输宽度、SPI工作模式、中断允许位,并使能SPI模块②SPI收发数据:通过查询SPI0SR中的状态位或采用中断方式,读写数据寄存器,完成数据收发。24单片机原理与应用SPI模块编程范例(续1)SPI模块编程范例1.SPI初始化//SPI初始化函数voidSPI_Init(){SPI0BR=0x44;//设定波特率SPI0CR1=0x5C;//关闭SPI中断,置SPI主机模式,使能SPI模块SPI0CR2=0x00;//数据传输宽度为8位,即一个字节}25单片机原理与应用SPI模块编程范例(续2)//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;}2.SPI收发数据