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

SPI总线介绍

SPI总线结构:

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

SPI总线 的使用 和 裸机程序编写_第1张图片

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

数据传输过程:

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

SPI总线 的使用 和 裸机程序编写_第2张图片

总线时序:

SPI总线 的使用 和 裸机程序编写_第3张图片

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 寄存器中。

SPI总线 的使用 和 裸机程序编写_第4张图片

裸机代码举例:

#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);
    }
}

你可能感兴趣的:(SPI总线 的使用 和 裸机程序编写)