DSP学习笔记之SPI
SPI介绍
SPI 的全称是"Serial Peripheral Interface",意为串行外围接口。SPI 是一种高速的,全双工,同步的通信总线,SPI采用主从方式工作,一般有一个主设备和一个或多个从设备; SPI需要至少4根线,分别是MISO(主设备输入从设备输出)、MOSI(主设备输出从设备输入)、SCLK(时钟)、CS(片选)。
SPI分为硬件SPI和软件SPI,由于软件SPI的响应速度没有硬件SPI快,在日常使用中,为追求更高的响应速度,会使用硬件SPI。
寻址方式
当有多个 SPI 从设备与 SPI 主机相连时,设备的其它信号线 SCK、 MOSI及 MISO 同时并联到相同的 SPI 总线上,即无论有多少个从设备,都共同只使用这 3 条总线;而每个从设备都有独立的这一条 CS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。把该从设备的 CS 信号线设置为低电平,该从设备即被选中,即片选有效。
通信过程
SPI总线在进行数据传送时,先传送高位,后传送低位;数据线为高电平表示逻辑‘1’,低电平表示逻辑‘0’;一个字节传送完成后无需应答即可开始下一个字节的传送; SPI总线采用同步方式工作,时钟线在上升沿或下降沿时发送器向数据线上发送数据,在紧接着的下降沿或上升沿时接收器从数据线上读取数据,完成一位数据传送,八个时钟周期即可完成一个字节数据的传送;
相关寄存器
SPI 配置控制寄存器(SPICCR)
SPI 操作控制寄存器(SPICTL)
SPI 波特率设置寄存器(SPIBRR)
SPI 串行接收缓冲寄存器(SPIRXBUF)
SPI 串行发送缓冲寄存器(SPITXBUF)
SPI FIFO 寄存器(SPIFFTX、SPIFFRX、SPIFFCT)
代码分析
SPI 初始化函数
void SPIA_Init(void)
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // SPI-A
EDIS;
InitSpiaGpio();
// Initialize SPI FIFO registers
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
SpiaRegs.SPICCR.all =0x00DF; // 自测模式并从复位状态释放
SpiaRegs.SPIPRI.bit.FREE = 1; // 自由启动
}
SPI 数据收发函数
Uint16 SPIA_SendReciveData(Uint16 dat)
{
// Transmit data
SpiaRegs.SPITXBUF=dat;
// Wait until data is received
while(SpiaRegs.SPIFFRX.bit.RXFFST !=1);
return SpiaRegs.SPIRXBUF;
}
标签:信号线,传送,SpiaRegs,DSP,SPI,笔记,FIFO,设备
From: https://www.cnblogs.com/filosefer/p/18186146