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

来源:互联网 发布:python 服务 编辑:程序博客网 时间:2024/06/03 22:54

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);    }}
原创粉丝点击