第2节 GP32的SPI模块编程基础
推荐给好友
打印
加入收藏
更新于2008-07-25 19:45:39

10.2.1 SPI模块的引脚

SPI模块通常引出4个引脚,分别为: 、MISO、MOSI、SPSCK,下面分别介绍它们的含义。

1.从机选择引脚 (Slave Select)
若一个MCU的SPI工作于主机方式,置 为高电平。若一个MCU的SPI工作于从机方式时,当 =0时,表示主机选中了该从机,反之则未选中该从机。对于单主单从(One master and one slave) 系统,可以采用图10-1的接法。对于一个主MCU带多个从属MCU的系统,主机MCU的 接高电平,每一个从机MCU的 接主机的I/O输出线,由主机控制其电平高低,以便主机选中该从机。

2.主出从入引脚MOSI(Master Out/Slave In)
主出从入引脚MOSI,是主机输出、从机输入数据线。对于MCU被设置为主机方式,主机送向从机的数据从该引脚输出。对于MCU被设置为从机方式,来自主机的数据从该引脚输入。

3.主入从出引脚MISO(Master In/Slave Out)
从机的数据从该引脚输入主机,对于MCU被设置为从机方式,送向主机的数据从该引脚输出。

4.SPI串行时钟引脚SPSCK(SPI Serial Clock)
SPI串行时钟引脚SPSCK用于控制主机与从机之间的数据传输。串行时钟信号只能由主机发出,经主机的SPSCK引脚输出给从机的SPSCK引脚,控制整个数据传输过程。在主机启动一次传送过程中,自动产生8个时钟周期信号从SPSCK引脚输出,SPSCK信号的一个跳变进行一位数据移位过程。

10.2.2 SPI模块的寄存器

从程序员角度看,SPI模块有3个8位寄存器,只要理解和掌握了这3个寄存器的用法,就可以进行SPI编程。下面分别阐述这些寄存器的功能及用法。

1.SPI数据寄存器(SPI Data Register,SPDR)
SPI数据寄存器SPDR的地址是:$0012。写入时,为要发送的8位数据,记为:T7~T0;读出时,为接收的8位数据,记为:R7~R0。它们的特点与SCI数据寄存器相似。在实际内部结构上,SPDR由两个独立的数据寄存器组成,即只能写入的发送数据寄存器和只能读出的接收数据寄存器,它们共用一个地址。

2.SPI控制寄存器(SPI Control Register,SPCR)
SPI控制寄存器一般情况下只能复位时写一次,以后不再对其写入,不再更改对SPI的设置。SPCR的地址:$0010,定义为:

数据位 D7 D6 D5 D4 D3 D2 D1 D0
定义 SPRIE DMAS SPMSTR CPOL CPHA SPWOM SPE SPTIE
复位 0 0 1 0 1 0 0 0

D7 — SPRIE位:SPI接收中断允许位(SPI Receiver Interrupt Enable Bit),SPRIE=1,允许SPI接收中断;SPRIE=0,不允许SPI接收中断。当收到一个字节的数据时,状态及控制寄存器SPSCR(下面将介绍该寄存器)的SPRF位(SPI接收器满标志位)被置1,此时,若SPCR寄存器的SPRIE=1,则产生SPI中断。通常情况下SPRIE=0,即收到数据不产生中断。
D6 — DMAS位:DMA选择位(DMA Select Bit)。目前没用,为0。
D5 — SPMSTR位:SPI主机位(SPI Master Bit),该位决定SPI工作方式,SPMSTR =1,主机方式;SPMSTR=0,从机方式。
D4 — CPOL位:时钟极性选择位(Clock Polarity Bit),该位决定SPSCK引脚空闲时的极性。此位对数据的传输格式没有影响。CPOL=1,SPSCK空闲时为高电平;CPOL=0,SPSCK空闲时为低电平。时钟极性选择位CPOL与时钟相位位CPHA配合使用。
D3 — CPHA位:时钟相位位(Clock Phase Bit),该位控制串行时钟与SPI数据的时序关系。见图10-6。CPHA=1,从机以SPSCK的第一次沿跳变为移位开始信号,在多个字节的连续传送过程中,从机的 引脚信号可始终保持为低电平;CPHA=0,从机以 的下降沿作为移位开始信号,在SPSCK的第一次沿跳变启动第一次数据采样,在多个字节的连续传送过程中,从机的 引脚信号需要不断地恢复为高电平,来为每一个字节的传送产生移位开始信号(在 的下降沿)。一般情况下设置CPHA=1,复位时CPHA=1。

D2 — SPWOM位:SPI线或模式位(SPI Wired-OR Mode Bit)。该位决定三个引脚SPSCK、MOSI、MISO是否有内部上拉电阻,因而成为开漏输出(open-drain output)。SPWOM=1,设置SPSCK,MOSI和MISO引脚为线或模式;SPWOM=0,设置SPSCK,MOSI和MISO引脚为普通推拉(push-pull)模式。
D1 — SPE位:SPI允许位(SPI Enable)。该位决定是否允许SPI。SPE=1,允许SPI;SPE=0,不允许SPI,相应引脚成为普通I/O引脚。
D0 — SPTIE位:SPI发送中断允许位(SPI Transmit Interrupt Enable)。SPTIE=1,允许SPI发送中断;SPRIE=0,不允许SPI发送中断。当一个字节的数据发送完毕时,状态及控制寄存器SPSCR(下面将介绍该寄存器)的SPTE位(SPI发送器空标志位)被置1,此时,若SPCR寄存器的SPTIE=1,则产生SPI中断。通常情况下SPTIE=0,即发送数据完成不产生中断。(请类比本寄存器的SPI接收中断允许位SPRIE的功能)。

3.SPI状态和控制寄存器(SPI Status and Control Register,SPSCR)
SPSCR的地址:$0011,定义为:
数据位 D7 D6 D5 D4 D3 D2 D1 D0
定义 SPRF ERRIE OVRF MODF SPTE MODFEN SPR1 SPR0
复位 0 0 0 0 1 0 0 0

D7 — SPRF位(只读):SPI接收器满标志位(SPI Receiver Full Bit)。当收到一个字节的数据时,SPRF位被置1,程序读取该位得知此位为1后,可以通过数据寄存器SPDR读取收到的数据,读取数据后SPRF位被自动清零。
D6 — ERRIE位:错误中断允许位(Error Interrupt Enable Bit)。ERRIE=1,允许MODF和OVRF产生CPU中断请求;ERRIE=0,禁止MODF和OVRF产生CPU中断请求。
D5 — OVRF位(只读):溢出标志位(Overflow Bit)。当接收数据寄存器中的数据还没有被读取时,若有新的数据进入移位寄存器,OVRF位被置1。OVRF被置1后,读SPSCR寄存器及接收数据寄存器后,OVRF位被自动清零。
D4 — MODF位(只读):模式错误标志位(Mode Fault Bit)。若本寄存器的MODFEN=1,在数据传输过程中,若在从机方式, 引脚为高电平,或在主机方式 引脚为低电平,说明 引脚逻辑发生错误(与图10-6相违背),MODF被置1。MODF被置成1后,若读SPSCR寄存器后再对SPDR进行写操作,MODF位被自动清零。
D3 — SPTE位(只读):SPI发送器空标志位(SPI Transmitter Empty Bit)。当发送数据寄存器的数据进入移位寄存器中,SPTE被置1,表示发送结束。SPTE被置成1后,若又向发送数据寄存器中写入新的数据,SPTE位被自动清零。
D2 — MODFEN位:模式错误标志允许位(Mode Fault Enable Bit)。MODFEN=1,允许MODF标志的置位,MODFEN=0,禁止MODF标志的置位。但如果MODF位已经被置1,将MODFEN清零,并不会使MODF位也清零。对于主机而言,如果MODFEN为0, 引脚就可以作为一般的I/O引脚。
D1、D0 — SPR1、SPR0位:SPI波特率选择位(SPI Baud Rate Select Bits)。当MCU处于主机模式下,这两位控制串行时钟SPSCK的频率。在从机模式下,这两位没有意义。计算公式为:

SPI的波特率 =
上式中:CGMOUT为时钟产生模块CGM的基准时钟输出。BD是分频系数,由SPR1、SPR0位决定:
SPR1、SPR0=00,BD=2
=01,BD=8
=10,BD=32
=11,BD=128

10.2.3 SPI编程基本方法

在进行SPI编程时,首先在程序初始化部分必须进行SPI系统初始化。SPI的初始化,主要是对SPI控制寄存器SPCR进行写入,以便定义工作方式、时钟的空闲电平、是否允许SPI等。同时,还要对SPI控制和状态寄存器SPSCR的控制位部分写入,例如通过对SPR1、SPR0位的写入确定SPI的波特率。本小节给出最基本的用法,以作为GP32单片机的SPI的编程入门。

1.SPI初始化
对SPI初始化,一般需要两步:
第一步:写控制字到SPCR,确定是否允许SPI接收中断、SPI的工作方式、时钟极性、时钟相位、是否允许SPI等。例如:
LDA #%00100010 //不产生中断、主机方式、时钟空闲低电平
STA SPCR
第二步:写控制字到SPSCR,确定SPI的波特率:
LDA #%00000001 //8分频
STA SPSCR

2.发送一个数据与接收一个数据
要通过SPI发送一个数据,同时通过SPI接收一个数据,作为主机方,只要将数据送入SPDR,然后检查SPSCR的SPTE位(位3),如果该位为1,表示数据已经送出。若同时接收对方送来的数据,则接着检查SPSCR的SPRF位(位7),如果该位为1,表示要接收的数据已经进入数据寄存器,可以取出。例如:下列程序发送A中数据,同时接收对方数据放入A中:
STA SPDR //送入SPDR
NOP //适当延时
NOP
BRCLR 3,SPSCR,. //为0等待,即等待SPTE(位3)为1,发送完毕
BRCLR 7,SPSCR,. //为0等待,即等待SPRF(位7)为1,接收完毕
LDA SPDR //取收到的数据到寄存器A中


<<上一节 下一节>>




 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.