SPI通讯

特点:全双工,单主机多从机,数据格式为8bit,数据传输高位在前,低位在后
SPI一共四根引脚,分别为
(1)CS:片选信号,固定使用的话可以硬件上直接拉低
(2)SCK:时钟信号,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据,也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制
(3)MOSI:Master Out Slave In / Serial Data Output(SDO)/ Tx,向从设备发送数据
(4)MISO:Master In Slave Out / Serial Data Input(SDI)/ Rx,接收设备发来的数据

CPOL:Clock Polarity 时钟极性,为1时,SCK空闲时为高电平,为0时,空闲时为低电平
CPHA:Clock Phase 时钟相位,为0时,第一个时钟沿采样;为1时,每个周期的第二个时钟沿采样
在这里插入图片描述
当CPOL = 0,CPHA = 0时,因为主机的采样是在时钟前沿采样的,所以从器件输出信号要在第一个时钟信号前,所以从器件可以在SSEL信号有效后,立即输出bit1(此时SCK信号还未生效)

SPI主模块和与之通信的外设备时钟相位和极性应该一致。在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,因为主设备这边的时钟极性和相位都是以从设备为基准的

下图为四种情况下,采样的时刻,其中,CPHA=0时,数据要在第一个跳变沿之前准备好
在这里插入图片描述

以下为单片机模拟SPI通信的示例
//首先定义好I/O口
sbit SDO=P1^0;
sbit SDI=P1^1;
sbit SCK=P1^ 2;
sbit SCS=P1^3;
sbit ACC_7= ACC^7;
unsigned int SpiRead(unsigned char add)
{
    unsigned char i;
    unsigned int datal6;
    add&=0x3f;/*6位地址*/
    add |=0x80;/*读操作码l0*/
    SDO=1;/*发送1为起始位*/
    SCK=0;
    SCK=1;
    for(i=0;<8;i++)/*发送操作码和地址*/
    {
        if(add&0x80==1)
            SDO=1;
        else 
            SDO=0;
        SCK=0;/*从设备上升沿接收数据*/
        SCK=1;
        add<<= 1;
    }
    SCK=1;/*从设备时钟线下降沿后发送数据,空读1位数据*/
    SCK=0;
    datal6<<= 1;/*读16位数据*/
    for(i=0;<16;i++)
    {
        SCK= 1;
        _nop_();
        if(SDI==1)
            datal6|=0x01;
        SCK =0;
        datal6< < =1;
    }
    return datal6;
}

下面列举一下,SPI的一个应用
下图ST7701S的 三根线的 写功能,一个数据为9bit,多了一个Data/Command的位,下图的数据在上升沿采样,下降沿输出数据
在这里插入图片描述

以下是4线的形式,用多一根D/CX线,该位在bit0处采样
在这里插入图片描述

以下为读功能

  1. 三线的读功能实现(8bit数据)
    在这里插入图片描述

  2. 三线的读功能实现(24bit数据)
    注意:读数据时,多了一个时钟周期要忽略数据
    在这里插入图片描述

  3. 四线的读功能实现(24bit数据)
    在这里插入图片描述

  4. 十六位地址写数据
    在这里插入图片描述

  5. 十六位地址读数据
    在这里插入图片描述

单片机SPI接口配置
6. 方向
7. 模式,3线还是4线
8. 时钟极性,时钟相位
9. 波特率
10. 是否CRC校验
11. 主从
12. 软件管理还是硬件管理片选
13. MSB在前,还是LSB在前
14. 数据格式(八位还是16位)

QSPI的引脚
当SPI_FLASH为标准SPI模式时
各个引脚为
CS 片选
DO 数据输出
WP 写保护输入
GND
DI 数据输入
CLK 串行时钟输入
HOLD 保持端输入
VCC

当为QSPI模式时
在这里插入图片描述
CS 片选
IO1 数据输入输出1
IO2 数据输入输出2
GND
IO0 数据输入输出0
CLK 串行时钟输入
IO3 数据输入输出3
VCC

Vivado是赛灵思公司(Xilinx)提供的一款集成电路开发套件,用于FPGA设计和嵌入式系统开发。SPI(Serial Peripheral Interface)是一种串行外设接口通信协议,用于在微控制器或其他数字集成电路之间传输数据。 在Vivado中进行SPI通讯,我们需要先设计相应的电路,并配置引脚和通信参数。首先,在Vivado设计工程中创建一个新的项目,并添加所需的硬件模块。然后,我们可以使用Vivado开发环境的IP Catalog来选择合适的SPI IP核。 接下来,我们需要对IP核进行配置,包括指定时钟频率、数据位宽、模式(主/从模式)、传输速率等。设置完成后,可以生成IP核,并将其添加到设计中。在设计中,我们还需要添加其他所需的模块,如处理器等。 完成硬件设计后,我们可以进行FPGA逻辑设计,包括将SPI模块与其他逻辑模块进行连接,并编写相应的逻辑代码。这些代码描述了SPI通讯的协议和控制流程,以确保正确的数据传输。 最后,我们需要将设计综合为比特流文件,并下载到FPGA设备中进行验证和测试。通过连接外部设备(如传感器、存储器等)到FPGA的SPI接口,我们可以进行数据传输和通讯测试。 总而言之,在Vivado中进行SPI通讯需要进行硬件设计、IP核配置、逻辑设计和测试验证等步骤。通过正确的配置和编写相应的代码,我们可以实现可靠的SPI通讯,并与其他数字集成电路或外部设备进行数据交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值