一、原理
二、SPI寄存器(SpiaRegs)
2.1 SPI配置控制寄存器(SPICCR)
2.2 SPI控制寄存器(SPICTL)
2.3 SPI状态寄存器(SPISTS)
2.4 SPI波特率寄存器(SPIBRR)
在从模式下,SPI 时钟的 SPICLK 引脚使用外部时钟源,而且要求该时钟信号的频率不能大于 CPU 时钟的 1/4。在主模式下,SPICLK 引脚想网络输出时钟,并且该时钟频率不能大于 LSPCLK 频率的 1/4。
SPI 波特率的计算公式如下:
①当 SPIBRR=3~127 时:SPI 波特率=LSPCLK/(SPIBRR+1)
②当 SPIBRR=0、1 或 2 时:SPI 波特率=LSPCLK/4
其中:LSPCLK 为 DSP 的低速外设时钟频率;SPIBRR 为主动 SPI 模块 SPIBRR的值。
2.5 SPI接收缓冲寄存器(SPIRXBUF)
2.6 SPI发送缓冲寄存器(SPITXBUF)
2.7 SPI数据寄存器(SPIDAT)
2.8 SPI FIFO发送寄存器(SPIFFTX)
2.9 SPI FIFO接收寄存器(SPIFFRX)
2.10 SPI FIFO控制寄存器(SPIEECT)
2.11 SPI优先级控制寄存器(SPIPRI)
三、配置步骤
3.1 主函数
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "leds.h"
#include "time.h"
#include "uart.h"
#include "spi.h"
#include "stdio.h"
void main()
{
int i=0;
Uint16 senddata=0;
Uint16 recdata=0;
char str[40];
InitSysCtrl();
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
LED_Init();
TIM0_Init(150,200000);//200ms
UARTa_Init(4800);
SPIA_Init();
// 间隔500ms调用SPIA_SendReciveData()函数进行数据收发自测,
// 并且将发送和接收的数据使用串口输出。
while(1)
{
i++;
if(i%500==0)
{
recdata=SPIA_SendReciveData(++senddata);
sprintf(str,"senddata=%d recdata=%d\r\n",senddata,recdata);
//sprintf函数
UARTa_SendString(str);
}
DELAY_US(1000);
}
}
3.2 SPI函数
void SPIA_Init(void)
{
//step1 使能SPI外设时钟
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // SPI-A
EDIS;
//step2 初始化GPIO
InitSpiaGpio();
//step3 SPI工作参数设置,包括数据格式、相位极性、FIFO
// FIFO设置
SpiaRegs.SPIFFTX.all=0xE040; // 使能FIFO,清除发送中断标志
SpiaRegs.SPIFFRX.all=0x204f; // 使能FIFO接收16级深度,清除接收中断标志
SpiaRegs.SPIFFCT.all=0x0; // 清除FIFO计数器
SpiaRegs.SPICCR.all =0x000F; // 复位SPI,上升沿发送,下降沿接收,16位数据
SpiaRegs.SPICTL.all =0x0006; // 无相位延时,主机模式,使能发送
SpiaRegs.SPIBRR =0x007F; // 确定SPICLK
// 波特率设置
// 0,1,2: SPI Baud = LSPCLK/4
// 3 to 127: SPI Baud = LSPCLK/(SPIBRR+1)
SpiaRegs.SPICCR.all =0x009F; // 自测模式并从复位状态释放
SpiaRegs.SPIPRI.bit.FREE = 1; // 自由运行
}
// SPI发送和接收函数。
// SPI发送数据,即将数据存储到SPITXBUF寄存器中。
// 接收数据时,先判断FIFO内是否有数据,
// 如果有数据则可从SPIRXBUF寄存器读取。
Uint16 SPIA_SendReciveData(Uint16 dat)
{
// 发送数据
SpiaRegs.SPITXBUF=dat;
// 等待,直到接收到数据
while(SpiaRegs.SPIFFRX.bit.RXFFST !=1);
return SpiaRegs.SPIRXBUF; // 返回收到的数据
}