总线—spi

本文详细介绍了SPI和UART这两种串行通信协议的区别,包括工作原理、通信方式、应用领域以及SPI在STM32中的编程示例。同时讨论了SPI的优点和缺点,以及如何配置SPI时钟频率和极性。
摘要由CSDN通过智能技术生成

目录

串口

SPI:

UART:

SPI和UART之间的关系在于:

spi传输过程

时钟频率

时钟极性

时钟模式

​编辑

SPI的优点和缺点


串口

cpu串口总线有很多种,spi就是其中一个,这里讲一下uart,uart是异步串行通信协议,而spi是同步串行通信协议,虽然他们都是用串行通信的接口,但是他们的工作原理、通信方式和应用领域上有很大的差别。

SPI:

  1. 工作原理:SPI是一种同步串行通信协议,通过主从模式实现数据传输,具有四根信号线(SCLK、MOSI、MISO、SS)。
  2.  通信方式:SPI支持全双工通信,可以同时发送和接收数据。
  3.  应用领域:SPI通常用于连接单片机和外部设备,适用于高速数据传输和需要多个外设同时通信的场景。

UART:

  1. 工作原理:UART是一种异步串行通信协议,通过发送和接收数据位来进行通信。
  2. 通信方式:UART通过TX(发送)和RX(接收)两根信号线进行通信,是一种半双工通信方式。
  3. 应用领域:UART通常用于串口通信,如连接计算机和外设设备、以太网调试等场景,适用于长距离通信和实时通信要求不高的场合。

SPI和UART之间的关系在于:

  • 功能不同:SPI适用于高速数据传输和多设备通信,而UART适用于简单的串口通信。
  •  连接方式不同:SPI通过主从模式实现多个设备之间的通信,而UART通常是一对一的通信方式。
  •  标准不同:SPI是一种通信协议,定义了通信的规范和信号线连接方式;UART是一种硬件设备,用于实现串口通信功能。 

UART设备通常只需要三根线:TX(发送)、RX(接收)和GND(地线) ,UART工作在异步模式,这意味着数据传输不需要时钟信号的同步。带来的弊端是无法控制何时发送数据。uart必须在传输速度达成一致

看,我这边串口设定了115200,必须保证波特率一样,才能使用。

uart要求接收端和发送端的波特率一样,如果不一样还不能用,是不是挺拉跨,那下面我们来看看spi,spi完美避开了这些问题。。。

刚刚说到uart三根线传输,spi是通过四根线来实现数据的接送和传送的。

  1.  SCLK(串行时钟线):用于在主设备和从设备之间发送和接收数据时的时钟信号。
  2.  MOSI(主设备输出从设备输入线):用于主设备向从设备发送数据。
  3.  MISO(主设备输入从设备输出线):用于主设备接收从设备发送的数据。
  4. SS(片选线):用于选择要与之通信的从设备。

ps:顺便讲一下时钟信号,新手可能不知道时钟信号是干嘛的

时钟信号是数字电路和通信系统中不可或缺的组成部分,它为数据的传输和处理提供了精确的时间参考和同步机制。具体我会出一期关于时钟信号的文章。

spi传输过程

假设我们有一个主设备(例如微控制器)和一个从设备(比如传感器),它们通过SPI总线进行通信。以下是一个简单的SPI传输过程的举例描述:

1. 初始状态:
   - 主设备和从设备处于空闲状态,SPI总线上的片选信号 SS 都处于高电平,表示未选择任何从设备进行通信。

2. 选择从设备:
   - 主设备需要与从设备通信时,它会拉低相应的片选信号 SS,选择要通信的从设备,其他从设备的片选信号保持高电平。

3. 发送数据:
   - 主设备开始传输数据。它向 MOSI(主输出从输入)线发送数据,同时在 SCLK(时钟)线上生成时钟信号,以此同步数据传输。
   - 从设备在接收到位于 MOSI 线上的数据时,通过 SCLK 确定数据的时序,进行数据接收操作。

4. 接收数据:
   - 从设备开始响应。它会将要发送给主设备的数据放到 MISO(主输入从输出)线上。
   - 主设备通过 SCLK 和 MISO 线读取从设备发送的数据,并实时处理。

5. 结束传输:
   - 完成数据传输后,主设备拉高片选信号 SS,表示通信结束。
   - 从设备收到片选信号高电平后,等待下一个传输周期的到来。

在整个SPI传输过程中,主设备通过控制片选信号和时钟信号实现与从设备之间的数据交换。通过这种方式,SPI总线可以实现快速、可靠的数据传输,适用于许多嵌入式系统和外设设备之间的通信。

时钟频率

SPI(Serial Peripheral Interface)总线的时钟频率是指串行时钟线(SCLK)上的时钟信号的频率,即数据位在SPI总线上传输的速度。SPI总线的时钟频率由主设备(通常是微控制器或处理器)通过硬件配置来设定,可以从几十赫兹到几十兆赫兹不等,具体取决于硬件的性能和应用需求。

在SPI通信中,时钟频率的选择对数据传输速率和总线利用率有重要影响。时钟频率越高,数据传输速率越快,但同时也可能增加通信错误的风险,因为高速通信对信号质量和线路长度有限制。因此,在选择SPI总线的时钟频率时,需要考虑以下因素:

  1.  设备的最大数据传输速率:不同的SPI设备可能有不同的最大支持速率,因此时钟频率不应超过设备的最高工作速率。
  2.  信号质量和稳定性:高速通信对信号线的质量和稳定性要求较高,需要考虑信号干扰、衰减和电磁兼容性等因素。
  3.  总线利用率:时钟频率越高,总线利用率越高,但过高的时钟频率可能导致数据传输中的错误率增加。
  4.  应用需求:根据具体的应用场景,高速数据采集、低速控制等,选择合适的时钟频率。
  5.  硬件限制:主设备的硬件可能会限制SPI总线的时钟频率,例如,某些微控制器可能只有有限的时钟分频选项。

时钟极性

SPI总线的时钟极性指的是在数据传输过程中时钟信号(SCLK)的空闲态和工作态的极性。SPI总线的时钟极性通常有两种类型:极性(CPOL)和相位(CPHA)。 

1. 时钟极性(CPOL): - CPOL为0时,时钟信号在空闲状态下为低电平,通常在下降沿采样数据。 - CPOL为1时,时钟信号在空闲状态下为高电平,通常在上升沿采样数据。

2. 时钟相位(CPHA): - CPHA为0时,在第一个时钟边沿(上升沿或下降沿)开始发送和接收数据。 - CPHA为1时,在第二个时钟边沿(上升沿或下降沿)开始发送和接收数据。

CPOL空闲状态采集数据
0低电平下降沿
1高电平上升沿
CPHA时钟边沿
0第一个
1第二个

时钟模式

SPI(Serial Peripheral Interface)总线有四种工作模式,这些模式由时钟极性(CPOL)和时钟相位(CPHA)的组合决定。以下是SPI的四种工作模式:

1. 模式0(CPOL=0, CPHA=0):
   - 时钟闲状态为低电平。
   - 在时钟的第一个边沿(上升沿)采样数据,在第二个边沿(下降沿)发送数据。
   - 数据帧的格式:起始位(低电平)+ 数据位 + 奇偶校验位(可选)+ 停止位(高电平)。

2. 模式1(CPOL=0, CPHA=1):
   - 时钟空闲状态为低电平。
   - 在时钟的第二个边沿(下降沿)采样数据,在第一个边沿(上升沿)发送数据。
   - 帧的格式:起始位(低电平)+ 数据位 + 奇偶校验位(可选)+ 停止位(高电平)。

3. 模式2(CPOL=1, CPHA=0):
   - 时钟空闲状态为高电平。
   - 在时钟的第一个边沿(下降沿)采样数据,在第二个边沿(上升沿)发送数据。
   - 数据帧的格式:起始位(低电平)+ 数据位 + 奇偶校验位(可选)+ 停止位(高电平)。

4. 模式3(CPOL=1, CPHA=1):
   - 时钟空闲状态为电平。
   - 在时钟的第二个边沿(上升沿)采样数据,在第一个边沿(下降沿)发送数据。
   - 数据帧的格式:起始位(低电平)+ 数据位 + 奇偶校验位(可选)+ 停止位(高电平)。

在SPI通信中,主设备通常负责配置时钟极性和相位,而从设备则需要能够适应这些配置。不同的SPI设备可能在出厂时被设置为特定的工作模式,因此在多设备通信时,主设备需要与从设备协商并配置相同的模式。

SPI的优点和缺点

优点:

  1.  高速、低功耗、低成本、简单易用。
  2.  支持多设备通信,可扩展性较强。
  3.  时钟信号的发送和接收同步进行,提高了数据传输的效率。
  4.  全双工通信,可以实现数据的发送和接收同时进行。
  5.  适用于各种嵌入式系统和外设之间的数据传输。

缺点:

  1.  通信模式单一,不支持其他复杂的通信协议。
  2.  传输速率和通信距离受到限制,不适合长距离和大容量数据传输。
  3.  需要主设备控制通信过程,对主设备的依赖性较强。
  4.  需要通过硬件寄存器进行配置,对于软件编程的要求较高。

总之,SPI总线是一种简单易用、高速、低功耗的通信协议,适用于各种嵌入式系统和外设之间的数据传输。但同时也存在通信模式单一、传输速率和通信距离受限等缺点。在实际应用中,需要根据具体的应用场景和需求来选择是否使用SPI总线。

基于stm32的关于spi总线编程


#include "stm32f10x.h"

// 假设SLAVE设备的SCK管脚是PB13,MISO管脚是PB14,MOSI管脚是PB15,片选管脚是PB12
// 定义SPIHandle结构体
SPI_HandleTypeDef hspi1;

// SPI中断服务函数
void SPI1_IRQHandler(void)
{
    HAL_SPI_IRQHandler(&hspi1);
}

// 初始化SPI总线
void SPI1_Init(void)
{
    // 配置SPI为全双工模式,时钟极性为低电平,时钟相位为后沿采样
    hspi1.Init.Mode = SPI_MODE_MASTER;
    hspi1.Init.Direction = SPI_DIRECTION_2LINES;
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
    hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
    hspi1.Init.NSS = SPI_NSS_SOFT;
    hspi1Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; // 根据实际时钟频率调整
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi1.Init.CRCPolynomial = 7; // 通常设置为7或16

    // 初始化SPI
    if (HAL_SPI_Init(&hspi1) != HAL_OK)
    {
        // 初始化失败处理
    }
}

int main(void)
{
    // 系统初始化
    HAL_Init();
    
    // 配置时钟
    RCC_ClocksTypeDef RCC_Clocks;
    RCC_GetClocksFreq(&RCC_Clocks);
    
    // 初始化SPI总线
    SPI1_Init();
    
    // 发送数据
    uint8_t tx_data = 0xFF;
    
    // 循环发送数据
    while (1)
    {
        // 发送数据
        if (HAL_SPI_Transmit(&hspi1, &tx_data, 1, HAL_MAX_DELAY) != HAL_OK)
        {
            // 发送失败处理
        }
        
        // 延时
        HAL_Delay(1000);
    }
}
  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值