1. SPI简介
SPI全称是Serial Peripheral Interface;意为串行外围接口;
高速的,全双工,同步的通信总线;
SPI接口:
MISO:Master Input Slave Output(主输入从输出),数据方向为从机到主机;
MOSI:Master Output Slave Input(主输出从输入),数据方向为主机到从机;
SCLK:时钟信号线,用于数据同步; F28335的SPI时钟频率最大为SYSCLK/2;
CS:从设备片选信号线;低有效(选中);
SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步,MOSI及MISO数据线在SCK的每个时钟周期传一位数据,且数据输入输出是同时进行的;数据传输时,还区分MSB还是LSB优先;
SPI主要特点:
(a)可以同时发出和接收串行数据;
(b)可以当作主机或从机工作;
(c) 提供频率可编程时钟;
(d) 发送结束中断状态;
(e) 写冲突保护;总线竞争保护等;
与I2C总线对比它的缺点:
(a) 没有指定的流控制;
(b) 没有应答机制确认是否接收到数据;
SPI工作的四种方式:与时钟极性(CPOL)和时钟相位(CPHA)控制;
2. 软件部分
void SPIA_Init(void)
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // SPI-A
EDIS;
InitSpiaGpio();
// Initialize SPI FIFO registers
//bit15:SPI FIFO恢复传输和接收
//bit14:SPI FIFO增强使能
//bit13:重新使能传输FIFO操作;
//bit6:写1清空第7位TXFFINT标志
SpiaRegs.SPIFFTX.all=0xE040;
//bit13:重新使能接收FIFO操作;
//bit6:写1清除bit7的RXFFINT标志;
//bit0~3:写1111复位FIFO中断水平位;
SpiaRegs.SPIFFRX.all=0x204f;
//FIFO传输延时位 定义了延时介于每个传输从FIFO传输缓存到传输移位寄存器;
SpiaRegs.SPIFFCT.all=0x0;
//bit7:SPI软复位;
//bit6:移位时钟极性
//bit4:SPI 回环测试
//字符长度, 16位;
SpiaRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits
//bit3:CLOCK PHASE,时钟相位选择; 0:普通SPI时钟方案
//bit2: 0:SPI配置成slave; 1:spi配置成master
//bit1: master/slave传输使能
//bit0:SPI 中断使能 0:不使能中断;
SpiaRegs.SPICTL.all =0x0006; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
//SPI位率控制
SpiaRegs.SPIBRR =0x007F;
//bit7:SPI软复位; 1:SPI准备传输或接收下一个字符;
//bit4:SPI 回环测试
SpiaRegs.SPICCR.all =0x009F; // Relinquish SPI from Reset
//自由运行
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}
Uint16 SPIA_SendReciveData(Uint16 dat)
{
// Transmit data
SpiaRegs.SPITXBUF=dat;//传输数据buffer
// Wait until data is received
//等待接收FIFO有一个字;
while(SpiaRegs.SPIFFRX.bit.RXFFST !=1);
return SpiaRegs.SPIRXBUF;//SPI串口接收缓存寄存器
}