SPI串行外设接口

一、原理

二、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; // 返回收到的数据
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值