【F28335】第16章 串行外设接口SPI

目前接触过的SPI接口,连接的外设有FLASH和EEPROM。
存储芯片有支持不同总线访问的类型。

简述

  • SPI = Serial Peripheral Interface
  • 在开发F28335时,有时候可能需要扩展一些外围设备,例如,觉得F28335内部12位的ADC精度不够,想要外扩一个串行高精度的ADC,或者向外扩EEPROM、LCD显示驱动器、网络控制器、DAC等,就需要用到F28335的串行外围设备接口SPI。
  • SPI是一种高速的同步串行输入/输出接口,允许1~16位的数据流在设备与设备间进行交换。
  • 通常用于DSP与外围设备或者DSP与其他控制器之间进行通信。
  • 本章介绍以下内容:
    • 介绍SPI接口通用的一些基本知识
    • 详细介绍F28335内部SPI的结构、特点、中断、工作方式等内容

16.1 SPI模块的通用知识

  • SPI是同步通信,SCI是异步通信。

    • 同步通信:通信双方的设备必须拥有相同的时钟脉冲,以相同的频率进行数据传输。
    • 异步通信:通信双方的设备拥有独立的时钟脉冲,可以独自进行数据传输,就像两个人在散步,各走各的。
  • SPI接口一般使用4根线。当然并不是所有的SPI接口都采用四线制,有的SPI接口带有中断信号线INT,而有的SPI接口没有主机输出/从机输入线MOSI。

  • F28335中的SPI采用四根线的方式。

    线路名称线路作用
    SCK串行时钟线
    MISO主机输入/从机输出线
    MOSI从机输入/主机输出线
    CS低电平有效的从机选择线
  • SPI的通信原理:
    在这里插入图片描述

    • SPI以主从方式进行工作,这种模式的通信系统中通常有一个主设备,多个从设备。CS信号用来控制从机的芯片是否被选中。从机只有通过CS信号被选中之后,对此从机的操作才会有效。
    • 片选信号的存在,使得同一总线上可以挂载多个SPI设备。
    • 当从机被选中,和主机建立连接后,接下来起作用的就是负责通信的3根线。
    • SPI采用串行通信协议,即通信时数据是一位一位进行传输的。
    • 传输时,由SCK时钟信号提供时钟脉冲,当M1给S1发送数据时,数据在时钟脉冲的上升沿或者下降沿通过M1的MOSI引脚发送,在紧接着的下降沿或者上升沿通过S1的MOSI引脚接收。
    • SCK信号只由主设备控制,从设备不能控制时钟信号线。
    • 在一个SPI通信系统中,必须有一个主控设备,其向整个SPI系统提供时钟信号,系统内所有的设备都基于这个时钟脉冲进行数据的接收和发送,所有SPI是同步串行通信接口。
    • 在点对点的通信中,SPI接口不需要寻址操作,且为全双工通信,因此显得高效简单。
    • 在多个从设备的系统中,每个设备都需要独立的使能信号,硬件上比I2C系统稍微复杂一些。
    • SPI是环形总线结构,在SCK时钟信号的控制下,两个双向移位寄存器SPIDAT进行数据交换。
      在这里插入图片描述
    • 假如主机M1与从机S1进行通信,主机的8位寄存器SPIDAT1内的数据是10101010,而从机的8位寄存器SPIDAT2内的数据是01010101,在时钟脉冲上升沿的时候发送数据,在下降沿的时候接收数据,最高位的数据先发送,主机和从机之间进行全双工通信,即两个SPI接口同时接收发送数据。
    • SPIDAT移位寄存器总是将高位的数据移出,接着将剩余的数据分别左移一位,然后将接收到的数据移入其最低位。
    • 如图16-3所示,当时钟脉冲第一个上升沿来的时候,SPIDAT1将最高位1移出,并将剩余所有的数据左移一位,这时主机的MOSI引脚为高电平1,而SPIDAT2将最高位0移出,并将剩余所有的数据左移一位,这时从机的MOSI引脚为低电平0。然后,当时钟脉冲下降沿来的时候,SPIDAT1将锁存主机MISO引脚上的电平,也就是从机发出的低电平0,并将数据0移入其最低位,同样,SPIDAT2将锁存从机MISO引脚上的电平,也就是主机发出的高电平1,并将其数值1移入其最低位。经过8个时钟脉冲后,两个移位寄存器就实现了数据的交换,也就是完成了一次SPI的时序。
      在这里插入图片描述

16.2 F28335的SPI模块的概述

在这里插入图片描述

16.2.1 SPI模块的特点

SPI的特点:

  1. 有外部4个引脚
引脚功能说明
SPISOMI主机输入/从机输出引脚
SPISIMO从机输入/主机输出引脚
SPICLK串行时钟引脚
SPISTE从模式发送使能引脚
  1. 有两种工作模式:主工作模式,从工作模式
  2. 传输速率:125种可编程的数据传输速率,最高传输速率不超过LSPCLK/4
  3. 单次发送的数据字的长度为1~16位
  4. 可选择4种脉冲时钟配置方案
  5. 接收和发送可以同步操作,可以实现全双工通信。发送功能可以通过SPICTL寄存器的TALK位禁止或者使能。
  6. 接收和发送可以通过查询和中断的方式实现
  7. 具有6个控制寄存器、3个数据寄存器和3个FIFO寄存器,SPI的控制寄存器都是8位的,数据位于低8位,高8位是0。
  8. SPI的数据寄存器SPIRXBUF、SPITXBUF、SPIDAT和3个FIFO寄存器是16位的。
  9. SPI有2个16级深度的FIFO:一个用来发送数据,一个用来接收数据。发送数据的时候,数据和数据之间的延时可以通过变成进行控制。
  10. 标准SPI模式下(非FIFO模式),接收发送中断都是用SPIINT/RXINT,FIFO模式下,接收中断使用SPIINT/RXINT,而发送中断使用SPITXINT

16.2.2 SPI的信号总结

在这里插入图片描述


16.3 SPI模块的工作原理

在这里插入图片描述

  • 从图16-5可以看出,SPI能够完成数据传输主要依赖3个数据寄存器,接收数据缓冲寄存器SPIRXBUF、发送数据缓冲寄存器SPITXBUF和数据移位寄存器SPIDAT,这3个寄存器都是16位的。
  • 在标准的SPI工作模式下(FIFO未使能),
    • 首先,通过程序向发送缓冲寄存器SPITXBUF写入数据,如果此时SPIDAT寄存器为空,则SPITXBUF将需要发送的完整数据传输给SPIDAT,数据在SPITXBUF寄存器和SPIDAT中都是左对齐的,也就是从高位开始存储的。
    • SPIDAT每经过一个时钟脉冲,完成一位数据的接收或发送。假设在时钟脉冲的上升沿时,SPIDAT将数据的最高位发送出去,然后将剩余的所有数据左移一位,接下来,在时钟脉冲的下降沿时,SPIDAT锁存一位数据,并保存至其最低位。当发送完指定位数的数据后,SPIDAT寄存器将其内部的数据发送给接收缓冲寄存器SPIRXBUF,等待CPU来读取。
    • 数据在SPIRXBUF中存放是右对齐的,也就是从地位开始存储的。
  • 在标准SPI模式下,接收操作支持双缓冲,也就是在新的接收操作启动时,CPU可以暂时不读取SPIRXBUF中接收到的数据,但是在新的接收操作完成之前必须读取SPIRXBUF,否则将会覆盖原来接收的数据。同样,发送操作也支持双缓冲功能。

16.3.1 SPI主从工作方式

在这里插入图片描述

  • 主机模式
    • 通过设置SPI工作控制寄存器SPICTL的MASTER/SLAVE位为1,来使得SPI工作于主机模式:SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
    • 主机通过SPICLK引脚为整个通信网络提供时钟脉冲信号。由于,每经过一个时钟脉冲,就完成一位数据发送,所以时钟脉冲的频率就是数据传输速率,其值由主机的SPIBRR寄存器来决定。通过主机的SPIBBR寄存器配置,SPI能够实现125种不同的数据传输速率,但是最大不超过LSPCLK/4。
    • 主机通过SPISIMO引脚发送数据,通过SPISOMI引脚接收数据。当数据写到移位寄存器SPIDAT或者串行发送缓冲寄存器SPITXBUF中,会启动SPISIMO引脚开始发送数据,首先发送的是SPIDAT的最高位,接着将剩余的数据左移一位,然后将接收到的数据通过SPISOMI引脚移入SPIDAT的最低有效位。如此重复,当SPIDAT中所有发送的数据都发送出去之后,SPIDAT中接收到的数据被写到SPI的接收缓冲寄存器SPIRXBUF中,等到CPU读取。
    • 为了保证首先发送的是数据的最高有效位,SPITXBUF和SPIDAT中的数据是左对齐的,而由于每次接收到的数据始终是写在最低位,所以SPIRXBUF中的数据是右对齐的。
    • 当规定的数目的数据通过SPIDAT完成发送时:
      • 发送了多少位数据,同时也就接收了多少位数据,当SPIDAT发送完规定数目中的数据时,SPIDAT中也存放了接收到的相同数目的数据。这时候,SPIDAT中接收到的数据会被写入SPIRXBUF。
      • SPI的中断标志位SPIINT FLAG被置位,如果SPIINT/RXINT中断已经被使能,从三级中断的角度来看,也就是SPICTL寄存器的SPINT ENA位被置位,相应的PIE中断被使能,相应的CPU中断已开启,则产生SPIINT/RXINT中断。由于SPI的发送和接收时一起完成的,所以这也就解释了为什么在非FIFO模式下,SPI的发送中断和接收中断使用的是同一个SPIINT/RXINT。
      • 当SPIDAT完成数据发送时,如果SPITXBUF中还有数据,这些数据将被写入SPIDAT,继续发送,如果所有数据发送完毕,SPICLK将会停止,直到有新的数据写入SPIDAT寄存器进行发送。
    • 当主机需要给从机发送数据时,SPISTE引脚就被置为低电平;当主机发送完需要的数据后,SPISTE重新被置高电平。片选信号的存在使得系统能够同时拥有多个从机,但是在同一时刻,只有一个从机起作用。
  • 从机模式:
    • 通过设置SPI工作控制寄存器SPICTL的MASTER/SLAVE位为0,来使得SPI工作于从机模式:SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;
    • SPI系统通信的时钟是由主机来决定的,也就是说,从机通过SPICLK引脚接收主机提供的串行移位时钟。从机SPICLK引脚输入频率应不大于LSPCLK/4。
    • 可以通过设置SPICTL寄存器的TALK位来禁止SPI的发送功能:SpiaRegs.SPICTL.bit.TALK = 0;
    • 当发送功能被禁止后,发送引脚SPISOMI就被置为高阻态。如果在禁止发送功能的时候,还有数据正在被发送,则要等到数据被发送完成之后,SPISOMI引脚才被置为高阻态,这样可以保证SPI正确的接收数据。

16.3.2 SPI数据格式

  • F28335的SPI通过对控制寄存器SPICCR的第3位至第0位的选择,可以实现1~16位数据的传输。
  • 当每次传输的数据小于16位时,需要注意以下几点:
    1. 当数据写入SPITXBUF和SPIDAT寄存器时,必须左对齐;
    2. 当数据从SPIRXBUF寄存器读取时,必须右对齐
    3. SPIRXBUF寄存器中存放的是最新接收到的数据,数据采用右对齐方式,再加上前面移位到左边后留下的位。
    4. 假设SPIDAT寄存器当前的值是737BH,发送的数据的长度为1位,则SPIDAT和SPIRXBUF在发送前后的状态如下图所示:
      在这里插入图片描述

16.3.3 SPI数据传输速率

  • F28335的SPI通过对寄存器SPIBRR的配置,可以实现125种不同的数据传输速率。
    • 当SPIBRR=0~2时,SPIBaudRate = LSPCLK / 4;
    • 当SPIBRR=3~127时,SPIBaudRate = LSPCLK / (SPIBRR + 1);
  • SPI最大的数据传输速率为LSPCLK/4
  • 当SPIBRR为奇数时,SPICLK的高电平与低电平在一个周期内保持对称。
  • 当SPIBRR为偶数时,SPICLK的高电平与低电平在一个周期内不对称。高电平比低电平多一个系统时钟周期。
    在这里插入图片描述

16.3.4 SPI时钟配置

在这里插入图片描述

  • SPI的时钟配置方案是指SPI在时钟脉冲的什么时刻去发送或者接收数据。SPICCR[CLOCK POLARITY]决定了时钟的极性,SPICTL[CLOCK PHASE]决定了时钟的相位。
  • SPICCR[CLOCK POLARITY]=0,SPICLK没有数据发送时,SPICLK处于低电平时:
    • SPICTL[CLOCK PHASE]=0,SPI在SPICLK上升沿发送数据,下降沿接收数据
    • SPICTL[CLOCK PHASE]=1,SPI在SPICLK上升沿延时半个周期后发送数据,在随后的上升沿处接收数据
  • SPICCR[CLOCK POLARITY]=1,SPICLK没有数据发送时,SPICLK处于高电平时:
    • SPICTL[CLOCK PHASE]=0,SPI在SPICLK下降沿发送数据,上升沿接收数据
    • SPICTL[CLOCK PHASE]=1,SPI在SPICLK下降沿延时半个周期后发送数据,在随后的下降沿处接收数据
  • 以时钟极性为低电平为例:
    • 当没有数据发送的时候,SPICLK保持低电平。
    • 当SPICLK引脚的电平发生跳变时开始传输数据。
    • 低电平状态只能向高电平状态跳变,所以当时钟相位无延时,在低电平跳变为高电平时,也就是上升沿的时刻发送数据,而在高电平跳变为低电平,下降沿的时刻锁存数据。
    • 当时钟相位有延时时,整体延迟了半个时钟周期。

16.3.5 SPI的FIFO列队

  • F28335的SPI有16级深度的发送FIFO和接收FIFO。
  • 当FIFO功能未被使能时,SPI工作于标准SPI模式
  • 当FIFO功能被使能时,SPI工作于增强的FIFO模式
  • FIFO功能由3个寄存器设置
    • SPIFFTX
      • SPIFFTX[SPIFFEN]=1;启动SPI的FIFO功能
    • SPIFFRX
    • SPIFFCT
  • 当DSP复位时,SPI工作在标准的SPI模式,FIFO功能被禁止。通过将SPIFFTX寄存器的SPIFFEN位置位来启动SPI的FIFO功能。将SPIFFTX的位SPIRST置1,可以在任何状态下复位FIFO模式,SPI FIFO将重新开始发送和接收数据。
  • SPI具有1个1616b的发送缓冲器和1个1616b的接收缓冲器,标准SPI模式下的发送缓冲器SPITXBUF将作为发送FIFO和移位寄存器SPIDAT之间的一个发送缓冲器。当最后一位数据从移位寄存器SPIDAT移出后,SPITXBUF将重新从FIFO装载数据。
  • 数据从FIFO转移到移位寄存器的速度是可编程的。SPIFFCT寄存器的第7位到第0位,即FFTXDLY定义了两个数据发送间的延时。这个延时是以SPI串行时钟周期SPICLK为基准的。
  • 当延时为0个时钟周期时,SPI模块能够连续发送数据
  • 当延时为256个时钟周期时,SPI模块发送数据将产生最大延时。
  • 发送和接收FIFO都有状态为TXFFST和RXFFST。这两个状态位的作用是在任何时间都可以标识FIFO列队中有用数据的个数。

16.3.6 SPI中断

在这里插入图片描述

  • 标准模式下:
    • SPIFFTX[SPIFFENA]=0;禁止FIFO功能时
    • 当一个完整的字符移入或者移出SPIDAT时,SPIRXINT的中断标志位SPIINT FLAG被置位,此时,SPIDAT中的数据被写入SPIRXBUF缓冲器中,等待CPU读取。
  • FIFO模式下:
    • 当SPIFFTX寄存器的SPIFFENA位为1时,也就是FIFO功能被使能时,SPI工作于增强FIFO模式。对于接收操作,接收FIFO队列有状态位RXFFST,表示接收FIFO中有多少个接收到的数据。同时,SPI FIFO接收寄存器SPIFFRX还有一个可编程的中断触发级位RXFFIL。当RXFFST的值与RXFFIL相等时,接收FIFO就会产生接收中断SPIRXINT信号,如果SPIFFRX寄存器的RXFFIENA为1,也就是FIFO接收中断已经使能,那么SPI将向PIE控制器提出中断请求。比如,通过编程,将RXFFIL位设置为8,那么当FIFO队列中接收到8个数据时,RXFFST的值也为8,正好和RXFFIL的值相等,这时候接收FIFO就产生了接收中断匹配事件。复位后,接收FIFO的中断触发级位RXFFIL默认的值为0x1111,即16,也就是说,FIFO队列中接收到16个数据的时候产生接收中断请求。
    • 对于发送操作,发送FIFO队列有状态位TXFFST,表示发送FIFO中有多少个数据需要发送,同时SPI FIFO发送寄存器SPIFFTX也有一个可编程的中断触发级位TXFFIL。当TXFFST的值与TXFFIL相等时,发送FIFO就会产生发送中断SPITXINT信号,如果SPIFFTX寄存器的位TXFFIENA为1,也就是FIFO发送中断已经使能,那么SPI将向PIE控制器提出中断请求。比如,通过编程,将TXFFIL位设置为8,那么当FIFO队列中还剩8个数据需要发送时,TXFFST的值也为8,正好和TXFFIL的值相等,这时候发送FIFO就产生了发送中断匹配事件。复位后,发送FIFO的中断触发级位TXFFIL默认的值为0x0000,即0,也就是说,FIFO队列中数据全部发送完毕后产生发送中断请求。
      在这里插入图片描述

16.4 SPI模块的寄存器

在这里插入图片描述


16-5 习题

  • 16-1 SPI接口有哪些引脚?有哪些工作模式?

    • 引脚包括:
      • SPICLK
      • SPISIMO
      • SPISOMI
      • SPISTE
    • 工作模式包括:
      • 主工作模式
      • 从工作模式
  • 16-2 如何设置SPI成为主机?如何设置SPI成为从机?

    • SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; //主机
    • SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0; //从机
  • 16-3 如何禁止SPI从机的发送功能?

    • SpiaRegs.SPICTL.bit.TALK = 0;
  • 16-4 若SPIBRR = 1,LSPCLK = 37.5MHz,则SPI的数据传输速率为多少?

    • SPIBaudRate = 37.5 / 4 = 9.375MHz
  • 16-5 若SPIBRR = 4,LSPCLK = 37.5MHz,则SPI的数据传输速率为多少?

    • SPIBaudRate = 37.5 / (SPIBRR + 1) = 7.5MHz
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值