DSP的SPI

SPI是一种高速,全双工,同步的通信总线。

SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时,一般是MSB先行。
在这里插入图片描述

SPI接口一般使用4条线通信,但是片选线可以不用。那MISO,MOSI,SCLK。

主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。寄存器通过MOSI信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机。同时发生。
FIFO的目的在于起到一个缓冲的作用,如果外设速度太快的话,仅用一个寄存器是不够的。但是具体编程什么的还是用BUF就行了。

DSP中的SPI

就得分为主控制器模式从控制器模式
在这里插入图片描述

主控制器模式:MASTER=1

数据写到SPI数据寄存器(SPIDAT)或SPI输入缓存寄存器(SPITXBUF)时,会启动SPISIMO引脚上的数据发送。
首先发的是最高有效位MSB,同时接收的数据通过SPISOMI引脚移入SPIDAT的最低有效位,收完之后,数据存到SPIRXBUF中,(右对齐)如果数据发到SPIRXBUF中,SPI INT FLAG会置1,若SPI INT ENA为1,则会触发中断。

从控制器模式:MASTER=0

检测到主控制器的SPICLK信号的合适时钟边沿,SPITXBUF中的数据会被发送到网络中。TALK为0,SPISOMI为高阻态。如果在发送数据期间将TALK清零,即使SPISOMI引脚被强制为高阻态也要完成当前的字符传输

SPI的配置

void SPIA_Init(void)
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // SPI-A
EDIS;
InitSpiaGpio();
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all=0xE040;
SpiaRegs.SPIFFRX.all=0x204f;
SpiaRegs.SPIFFCT.all=0x0
SpiaRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits
SpiaRegs.SPICTL.all =0x0006; // Enable mastermode, normal phase,// enable talk,and SPI int disabled.
SpiaRegs.SPIBRR =0x007F;
SpiaRegs.SPICCR.all =0x009F; // Relinquish SPIfrom Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}
//因为SPI是全双工,所以send和receive是一起的
Uint16 SPIA_SendReciveData(Uint16 dat)
{
// Transmit data
SpiaRegs.SPITXBUF=dat;
// Wait until data is received
while(SpiaRegs.SPIFFRX.bit.RXFFST !=1)//接收FIFO中字符的个数,用于检测FIFO中是否有字符,FIFO收完放到BUF中,FIFO就变为0,待定
return SpiaRegs.SPIRXBUF;
}
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值