分享

DSPF28335---SPI模块

 李乃安 2017-04-14

DSPF28335--串行外设接口(SPI模块

问题1:什么是串行外设接口(SPI)?

答:SPISerial Peripheral Interface)接口是高速同步串行I/O接口。

问题2:串行通信接口(SCI)和串行外设接口(SPI)主要区别?

答:(1)SPI采用同步通讯方式,除了发送和接受两根线之外,还需要一根同步时钟线;SCI采用异步通信方式,只需要发送和接收两根线,通讯双方微处理器使用各自的时钟。

(2)SPI适用于板上短距离高速通讯;SCI适用于对另外的外设长距离的低速率通讯,在默认状态下,其最高通讯速率只相当于SPI通讯速率的1/4

(3)SPI的时钟可反映在外在的同步时钟线上;SCI的时钟时隐藏的。

问题3:TMS320F28335有几个SPI接口模块?

答:有一个专门的SPI模块, 另外两个McBSP也可以配置为SPI接口。

问题4:F28335SPI接口由几组寄存器控制?

答:12,位于控制寄存器帧0x7040h开始的位置。

问题5:SPI FIFO模式下如何对传输和接收16FIFO进行操作?

直接对SPITXBUF寄存器进行赋值以传输数据例如:SpiaRegs.SPITXBUF=sdata[i]此操作可理解为:首先使TXFIFO头指针加1,然后把值写入TXFIFO头指针指向的位置。如果当前没有一个激活的传输过程时,对SPITXBUF的写入会激活一个传输过程。直接读取SPIRXBUF寄存器的值以接收数据。例如:rdata[i]=SpiaRegs.SPIRXBUF,此操作可理解为:首先从RXFIFO头指针处读取1个字符, 然后使RXFIFO头指针减1

问题6:SPI FIFO模式下传输和接收中断何时产生?

答:是在数据传输或接收结束后,再判断传输和接收FIFO队列中有多少数据(SPIFFTX.TXFFST4-0)和SPIFFRX.RXFFST4-0)的值)。对于传输FIFO如果FIFO中数据小于等于TXFFIL4-0(此寄存器指定临界值)指定的值时会触发中断,在中断处理过程中继续传输数据。对于接收FIFO如果FIFO中的值大于等于RXFFIL(4-0)(此寄存器指定能够容忍的最大值)中指定的值时触发中断,在中断处理过程中继续接收数据。FIFO模式下中断触发条件除了标准SPI模式下的数据传输接收完毕的条件外还要满足FIFO中的数据小于等于TXFFIL或大于等于RXFFIL设定值的条件,在两个条件都满足的情况下才会触发中断。

FIFO选项

SPI中断源

中断标志位

中断使能位

SPIFFENA

中断线

SPI不使用FIFO

接收溢出

RECEIVER OVERRUN FLAG

OVERRUN INT ENA

0

SPIRXINT

数据接收

SPI INT FLAG

SPIINTENA

0

SPIRXINT

数据发送(发送空)

SPI INT FLAG

SPIINTENA

0

SPIRXINT

SPI使用FIFO

FIFO接收

RXFFINT Flag

RXFFIENA

1

SPIRXINT

数据发送(发送空)

TXFFINT Flag

TXFFIENA

1

SPITXINT

 问题7:如果只接收数据不发送数据如何激活接收过程?

答:SPI的的接收过程必须依赖传输过程,故即使值接收数据也必须对SPITXBUF写入以激活一个传输过程来接收数据。

SPI配置控制寄存器(SPICCR

名称

位域描述

7

SPI SW RESET

SPI软件复位位:

作用:当用户改变配置时,用户要清零该位,并在配置完成后置位该位。

0:将SPI操作标志初始化为复位条件;

1SPI准备发送和接受下一个字符。

6

CLOCK POLARITY

移位时钟极性位:

作用:系统提供4种不同的时钟方案,通常推荐第一种(系统默认的时钟方案),极性和延时全部为0.

0:数据在上升沿输出,下降沿输入;

1:数据在下降沿输出,上升沿输入。

5

保留

 

4

SPILBK

SPI回路返回位:

作用:回路返回模式允许模块在器件的器件测试时验证,该模式只在SPI配置为主控制模式才有效。

0:禁止;

1:使能。

3-0

SPI CHAR

字符长度控制位:

作用:这四位决定了一个移位序列中单个字符被移入或移除的位数(1-16)。

 

 

SPI工作控制寄存器(SPICTL

 

SPI操作控制寄存器SPICTL控制这数据发送,SPI产生中断的能力,SPICLK相位和SPI的工作方式(主控制器模式或从控制器模式)。

名称

位域描述

7-5

保留

 

4

OVERRUN INT ENA

溢出中断使能位:

作用:接收器溢出标志位(SPISTS.7)由硬件置位时,该位将产生一个中断。接收溢出中断标志位(SPISTS.7)和SPI中断标志位(SPISTS.6)公用一个中断向量。

0:禁止接收器溢出中断标志位(SPISTS.7)中断;

1:禁止接收器溢出中断标志位(SPISTS.7)中断。

3

CLOCK HPASE

SPI时钟相位选择位:

0:无延迟;

1SPICLK信号延迟半个周期。

2

MASTER/SLAVE

SPI通讯模式选择位:

0SPI配置为从机模式;

1SPI配置为主机模式;

1

TALK

主机/从机发送使能位:

作用:无论主机模式还是从机模式,要是SPI正常工作必须使能发送。

0:禁止发送;

1:使能发送。

0

SPI INT ENA

SPI中断使能位:

0:禁止SPI发送和接收中断;

1:使能SPI发送和接收中断。

 

 

SPI状态寄存器(SPISTS

 

名称

位域描述

7

RECEIVER OVERRUN FLAG

SPI接收器溢出中断标志位:

0:无效;

1:清除该位。

6

SPI INT FLAG

SPI中断标志位:

作用:SPI硬件置位该位来表示已经完整的接收或者发送字符的最后一位,准备好后续服务。该位置位的同时接收到的字符放在接收缓冲寄存器。如果SPI INT ENA被置位,该位将引起一个中断。

5

TX BUF FULL FLAG

SPI发送缓冲满标志位:

当一个字符写入SPI发送缓冲寄存器SPITXBUF时该位被置1。当上一个字节被全部移出,当前字节自动加载入SPIDAT寄存器时该位被清除。

4-0

保留

 

 

 

SPI波特率控制寄存器(SPIBRR)

 

SPI仿真缓冲器寄存器(SPIRXEMU)

 

名称

位域描述

15-0

EPIRXEMU

SPI仿真缓冲器寄存器:

作用:SPIRXEUM寄存器和SPIRXBUF寄存器的功能几乎相同,唯一的区别就是读取SPIRXEUM寄存器不会清除SPI的中断标志位(SPISTS.6.其实SPIRXEUM不是一个真实的寄存器而是一个虚拟地址,从该寄存器可以读取SPIRXBUF的内容而不清除中断标志位。

 

 

SPI串行接收缓冲器寄存器(SPIRXBUF)

 

名称

位域描述

15-0

EPIRXBUF

SPI串行接收缓冲器寄存器:

作用:一旦SPIDAT寄存器接收到完整的字符,字符就会被移入SPIRXBUF寄存器。在SPIRXBUF寄存器的字符可被读取。同时SPI中断标志位(SPISTS.6)被置位。由于数据首先被移位到SPI最高有效位,所以数据在该寄存器中采用右对齐方式存储。接收时,必须屏蔽无用的高位。

 

SPI串行接发送冲器寄存器(SPITXBUF)

 

名称

位域描述

15-0

EPITRXBUF

SPI串行发送缓冲器寄存器:

作用:当前发送的字符已经发送完成后,如果TX BUF FULL标志位被置位,那么寄存器的内容将会自动载入SPIDAT寄存器,于此同时TX BUF FULL标志位将被清除。数据写EPITRXBUF寄存器入必须采用左对齐的方式。

 

SPI串行数据寄存器(SPIDAT

名称

位域描述

15-0

SPIDAT

串行数据:

作用:SPIDAT实质是一个16位的循环左移位寄存器,主机发送的数据逐次的从左边最高位(MSB)移出,从右边最低位(LSB)移入,移出的数据左对齐读数,而移入的数据右对齐度数。

 

 

SPI FIFO 发送,接收和控制寄存器

 

1SPI FIFO 发送寄存器(SPIFFTX

 

名称

位域描述

15

SPIRST

SPI FIFO复位位:

0:复位FIFO发送和接受通道,SPI FIFO寄存器的配置保持不变;

1SPI FIFO重新开始发送和接受。

14

SPIFFENA

SPI FIFO模块使能位:

0:禁止FIFO增强模块;

1:使能FIFO增强模块。

13

TXFIFO RESET

发送FIFO复位位:

0:复位FIFO指针为0,且一直处于复位;

1:再次使能发送FIFO工作。

12-8

TXFFST(4-0)

发送FIFO状态位:(只读:中断检测位

作用:发送FIFO字符个数:用于检测发送FIFO是否有字符。

7

TXFFINT Flag

发送FIFO中断标志位:(只读

0:没有中断发生;

1:有中断发生。

6

TXFFINT CLR

发送FIFO中断清除位:

0:无效;

1:写1清除该位。

5

TXFFINNA

发送FIFO中断使能位:

0:禁止;

1:使能。

4-0

TXFFIL(4-0)

发送FIFO中断级位:

作用:指定临界值。当发送FIFO状态位和发送FIFO中断级位匹配(小于等于)时,发送FIFO将产生中断,推荐默认值位0x0000.

 

2SPI FIFO 接收寄存器(SPIFFRX

 

名称

位域描述

15

RXFFOVF Flag

接收FIFO溢出标志位:

作用:其实接收FIFO溢出中断和接收FIFO中断标差不多,说白了:接收FIFO溢出中断是接收FIFO中的断级设置为0x1111接收FIFO中断。

0:接收FIFO没有溢出;

1:接收 FIFO已经溢出。

14

RXFFOVF CLR

接收FIFO溢出中断清除位

0:无影响;

1:写1清除RXFFOVF 标志位。

13

RXFIFO RESET

接收FIFO复位位:

0:复位FIFO指针为0,且一直处于复位;

1:再次使能接收FIFO工作。

12-8

RXFFST(4-0)

接收FIFO状态位:(只读:中断检测位

作用:接收FIFO字符个数:用于检测接收FIFO是否有字符。

7

RXFFINT Flag

接收FIFO中断标志位:(只读)

0:没有中断发生;

1:有中断发生。

6

RXFFINT CLR

接收FIFO中断清除位:

0:无效;

1:写1清除该位。

5

RXFFINNA

接收FIFO中断使能位:

0:禁止;

1:使能。

4-0

RXFFIL(4-0)

接收FIFO中断级位:

作用:指定临界值。当接收FIFO状态位和接收FIFO中断级位匹配(大于等于)时,接收FIFO将产生中断,推荐默认值位0x1111..这样可以避免复位后的重复中断,因此接收FIFO大多数时间位空。

 

3SPI FIFO 控制寄存器(SPIFFCT

 

 

名称

位域描述

15-8

保留

 

7-0

FFTXDLY

FIFO发送延时位:

一般不延时

 

 

SPI优先级控制寄存器(SPIPRI

 

名称

位域描述

7-6

保留

 

5-4

SPI SUS POFT

SPI SUS FREE

 

仿真挂起位:

仿真模式位:

作用:这为决定了当一个仿真挂起事件发生(例如:调试程序时遇到一个断点)SPI模块的操作。

00:挂起时立即停止;

10:完成当前的接收/发送序列后停止

x1:自由运行。无视挂起,继续SPI操作。(推荐)

3-0

保留

 

 

 

【例1该程序为SPI典型例子例程,采用内部循环的自测模式,自发自接受,并检查错误率。在程序中没有使用中断。首先发送一个数据流,然后接收一个数据流,并检查错误率上述操作不断循环进行。

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File

 

//函数声明

void delay_loop(void);//简单延时函数

void spi_xmit(Uint16 a); //SPI发送一个字符

void spi_fifo_init(void);// SPI FIFO 初始化

void spi_init(void);// SPI 初始化

void error(void);//出错处理函数,一旦数据传输有错误终止仿真

 

void main(void)

{

   Uint16 sdata;  // 发送数据

   Uint16 rdata;  // 接收数据

  

// Step 1. 初始化系统控制

   InitSysCtrl();

 

// Step 2. 初始化SPI GPIO:

// This function is found in DSP2833x_Spi.c

   InitSpiaGpio();

 

// Step 3. 清楚中断和中断向量表

   DINT;  //禁止 CPU 中断

 

 

   InitPieCtrl();// 初始化PIE 控制寄存器

 

 

   IER = 0x0000;  // 禁止CPU级中断

 

   IFR = 0x0000;   // 清除CPU interrupt flags:

  

   InitPieVectTable();// 初始化中断向量表

        

// Step 4. 初始化 SPI外设:

   spi_fifo_init();      // 初始化Spi FIFO

   spi_init();               // 初始化SPI

 

// Step 5. 用户代码,设置发送数据的初始值

   sdata = 0x0000;                                                       

   for(;;)

   {   

          spi_xmit(sdata);//发送数据

 

          while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }          // 等待数据接收,RXFFSTSPIFFRX寄存器的的状态位,表示FIFO接收到的字数。当RXFFST=0时,没有接收到字符,等待;当RXFFST=1时,接收到一个字符,转到下面的程序。

                  

          rdata = SpiaRegs.SPIRXBUF;                   // 检查接收的数据;

               if(rdata != sdata) error();

          sdata++;

   }

}      

 

 

// Step 7. 插入所以的全局中断服务程序(ISR      

 

void delay_loop()

{

    long      i;

    for (i = 0; i < 1000000; i++) {}

}

 

 

void error(void)

{

    asm("     ESTOP0");                                                  // 测试失败!! 立刻停止!

    for (;;);

}

 

void spi_init()

{   

         SpiaRegs.SPICCR.all =0x000F;              // SPI 配置寄存器进行配置; 

         SpiaRegs.SPICTL.all =0x0006;                   // 主控模式, 无时钟延时,

                                                 // 使能发送,  SPI 中断禁止.

         SpiaRegs.SPIBRR =0x007F;                                                                                

    SpiaRegs.SPICCR.all =0x009F; // SPI 准备接收和发送下一个子符,并且使能回送模式 

    SpiaRegs.SPIPRI.bit.FREE = 1;                // 忽略挂起

}

 

void spi_xmit(Uint16 a)

{

SpiaRegs.SPITXBUF=a;

//是一个16位的串行发送缓冲寄存器。用于存储等待发送的一个字符,如果当前发送的字符已经发送完成后,如果TX BUF FULL标志位被置位,那么寄存器的内容将会自动载入SPIDAT寄存器,于此同时TX BUF FULL标志位将被清除。}   

 

void spi_fifo_init()                                                                                       

{

    SpiaRegs.SPIFFTX.all=0xE040;

    SpiaRegs.SPIFFRX.all=0x204f;

    SpiaRegs.SPIFFCT.all=0x0;

 

//===========================================================================

// No more.

//===========================================================================

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多