您的位置:首页 > 运维架构 > Linux

SPI总线 的使用 和 裸机程序编写

2017-08-05 14:06 537 查看

SPI总线介绍

SPI总线结构:

SPI(Serial Peripheral Interface)串行外设接口,是一种高速的,全双工,同步的通信总线。采用主从模式(Master Slave)架构,支持多个slave,一般仅支持单Master。



SPI接口共有4根信号线,分别是:设备选择线(SS)、时钟线(SCK)、串行输出数据线(MOSI)、串行输入数据线(MISO)。

数据传输过程:

主节点通过 MOSI 线输出数据,从节点在 SIMO 处从主节点读取数据。同时,也在通过 SOMI 输出 MSB(最高位),主节点会在 MISO处读取从节点的数据,整个过程将一直持续,直至交换完所有数据。



总线时序:



CPOL极性:决定时钟空闲时为高电平还是低电平。

CPOL=0:CLK空闲时是低电平,CLK有效时是高电平。

CPOL=1: CLK空闲时是高电平,CLK有效时是低电平。

CPHA相位:决定何时进行数据采样(读取)

CPHA=0:第一个边沿采样

CPHA=1:第二个边沿采样

根据CPOL和CPHA的不同组合,SPI被分为4种模式。

SPI总线裸机程序

以6410开发板为例:

SPI有两个通道,分别为TX通道RX通道,CPU要写数据到FIFO中,先写数据到 SPI_ TX_ DATA 寄存器中,这样此寄存器中的内容就会自动移动到发送FIFO中;同样的道理,如果CPU要从接收FIFO中读取数据,就访问寄存器 SPI_ RX_ DATA,紧接着,接收FIFO的数据就会自动移动到 SPI_ RX_ DATA 寄存器中。



裸机代码举例:

#define CH_CFG0      (*(volatile unsigned long*) 0x7f00b0000)
#define CLK_CFG0     (*(volatile unsigned long*) 0x7f00b0004)
#define MODE_CFG0    (*(volatile unsigned long*) 0x7f00b0008)
#define SPI_STAS0    (*(volatile unsigned long*) 0x7f00b0014)
#define SPI_TXDATA0  (*(volatile unsigned long*) 0x7f00b0018)
#define SPI_RXDATA0  (*(volatile unsigned long*) 0x7f00b001C)

u8 SPI_Init()
{
/* SPI复位 */
CH_CFG0 |= 0x60; //设置第5位进行软件复位

/* 设置引脚,这些引脚与spi引脚复用 */
rGPCCON &= ~0xffff;
rGPCCON |= 0x2222;

/* 配置CFG寄存器 */
CH_CFG0 = 0b0111;

/* 配置MODE_CFG0寄存器 */
MODE_CFG0 = (63 << 11);

/* 设置时钟 */
CLK_CFG0 = 100;
CLK_CFG0 |= (1 << 8);

return 0;
}

u32 SPI_ReadWriteData(u32 TxData) //参数是要发送的数据
{
do
{
temp = (SPI_STAS0 >> 6) & 0x7f; //获取发送FIFO数据数量
}
while(temp > 63);     //发送FIFO满了,等待

SPI_TXDATA0 = TxData; //发送数据

do
{
temp = (SPI_STAS0 >> 13) & 0x7f; //获取接收FIFO数据数量
}
while(temp == 0);    //接收FIFO为空,等待

return SPI_RXDATA0;
}

int main(void)
{
SPI_Init();
while(1)
{
SPI_ReadWriteData(5);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息