stm32----SPI协议

目录

一、概述

二、特点

三、数据传输

四、IIC和SPI协议之间的异同

五、STM32F1芯片上的SPI


一、概述

SPI(Serial Peripheral Interface,串行外围设备接口),是Motorola公司提出的一种同步串行接口技术,是一种高速、全双工、同步通信总线,在芯片中只占用四根管脚用来控制及数据传输,节约了芯片pin的数目,同时为PCB在布局上节省了空间。正是由于这种简单易用的特性,现在越来越多的芯片上都集成了SPI技术。这4根线分别是:MOSI(主机输出从机输入)、MISO(主机输入从机输出)、SCLK(时钟同步)、CS(片选线)。

寻址方式:和IIC不同的是,IIC采用的是通过广播目标从机ID的方式来找到想要通信的从机设备。而SPI里面则是通过使能片选线CS(即chip select)的方式来选择目标从机,至于片选信号是高电平还是低电平则需视实际情况而定,通常采用较多的是低电平进行片选操作。还需要注意一点,同一时刻主机只能与一个从机进行通信。

二、特点

  1. 采用主从模式(Master-Slave)的控制方式,支持单Master多Slave

SPI规定了两个SPI设备之间通信必须由主设备Master来控制从设备Slave。一个Master可以通过提供clock以及对Slave进行片选(Slave Select)来控制多个Slave,但同一时刻只能选择一个从机进行通信。SPI协议还规定Slave设备的clock由Master通过SCK管脚提供给Slave,Slave本身不能产生或控制clock,没有clock则Slave不能正常工作。

2、采用同步方式(Synchronous)传输数据

Master会根据将要交换的数据产生相应的时钟脉冲,组成时钟信号,时钟信号通过时钟极性(CPOL)和时钟相位(CPHA)控制两个SPI设备何时交换数据以及何时对接收数据进行采样,保证数据在两个设备之间是同步传输的。

3、数据交换

SPI设备间的数据传输被称为数据交换,因为SPI协议规定一个SPI设备不能在数据通信过程中仅仅充当一个发送者(Transmitter)或者接受者(Receiver)。在每个clock周期内,SPI设备都会发送并接收1 bit数据,相当于有1 bit数据被交换了。数据传输高位在前,低位在后(MSB first)。

在数据传输过程中,每次接收到的数据必须在下一次数据传输之前被采样也就是要马上从信号线中读取过来,可以理解为一个只能存放一个快递的快递站中的快递到了,得马上去取,不然会影响接下来的快递,如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能被丢弃,导致SPI物理模块最终失效。因此在程序中一般都会在SPI传输完数据后,读取SPI设备里的数据,即使这些数据在程序里是无效的。

SPI总线四种工作方式 

SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。

   时序详解:

CPOL:时钟极性选择,为0时SPI总线空闲为低电平,为1时SPI总线空闲为高电平

CPHA:时钟相位选择,为0时在SCK第一个跳变沿采样,为1时在SCK第二个跳变沿采样

通信过程举例 

比如当CPOL = 1,CPHA=1的时候,此时,SCK空闲电平状态为高电平,并在第二个时钟沿开始采样,第一个时钟沿开始进行输出。

在时钟线第一个跳变沿,发送器将会在数据线上发送一位数据,如果要发送1则将数据线拉高,如果要发送0则将数据线拉低,过段时间以后,此时数据线上的状态已经确定,即数据已经发出了,紧接着在第二个跳变沿,接收器将会从数据线上接收一位数据。一个字节占8位,所以只需要8个时钟周期(一个时钟周期有两个边沿)即可完成一个字节数据的传输。与IIC不同的是,SPI是没有应答信号的

三、数据传输

SPI是一个环形总线结构,由SS (CS)、SCK、SDI、SDO构成,时序很简单,在SCK的控制下,两个双向移位寄存器进行数据交换。寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。SSPSR控制数据移入移出SSPBUF,controller确定SPI总线的通信模式。

SSPBUF:Synchronous Serial Port Buffer,泛指SPI设备里面的内部缓冲区,一般在物理上是以FIFO的形式,保存传输过程中的临时数据;

SSPSR:Synchronous Serial Port Shift Register,泛指SPI设备里面的移位寄存器,根据设置好的数据位宽把数据移入或移出SSPBUF;

Controller:泛指SPI设备里面的控制寄存器,通过配置寄存器来设置SPI总线的传输模式。

通常情况下,只需要对四个pin进行编程即可控制SPI设备之间的数据通信:

SCK(Serial Clock):主要作用是Master向Slave传输时钟信号,控制数据交换的时机和速率;

SS/CS(Slave Select/Chip Select):用于Master片选Slave,使被选中的Slave能够被Master访问;

SDO/MOSI(Serial Data Output/Master Out Slave In):在Master上也被称为Tx-channel,作为数据的出口,主要用于SPI设备发送数据;

SDI/MISO(Serial Data Input/Master In Slave Out):在Master上也被称为Rx-channel,作为数据的入口,主要用于SPI设备接收数据。

四线制SPI:CS,SCK(同步时钟),MOSI(master out slaver in),MISO:全双工

三线制SPI:CS,SCK,DIO:半双工,只能分时进行收发

注意在主机开始接收从机数据的时候,同时要发一个0xFF给从机。

原来是spi 主机在接收的时候也把移位寄存器中的数据通过mosi发送出去了,从slave看,它通过miso发送数据给master的同时也接收来自master mosi上的数据。因为spi协议是没有反馈信号的,所以slave在发送数据的同时接收到的数据如果是slave能够识别的一个命令值的话那么这时就会对slave产生影响了。这时slave就会按照新的命令运行,然而这个命令是master在接收slave数据时不经意发送出去的,它本身是不打算发送出去的。为了解决master在接收数据的同时误发命令,所以在接收数据之前先写0xff进入移位寄存器。这样master在接收来自slave的数据的同时发送0xffslaveslave不识别0xff这个命令自然就不会影响它本身的运行了。

上面说了一大堆东西,现在你就会发送其实也不一定要写0xff是不是啊?是的,只要接收数据之前往移位寄存器写一个slave无法识别的数据就行了。

四、IIC和SPI协议之间的异同

相同点:

  1. 均采用串行同步的通信方式
  2. 均采用TTL电平,传输举例和应用场景较为类似。(RS232则采用负逻辑电平)
  3. 均采用主从工作方式。

不同点:

  1. IIC为半双工,SPI为全双工(也可配置为半双工模式)
  2. IIC有应答机制、SPI无应答机制
  3. IIC通过总线广播从机设备地址方式进行寻址,SPI通过片选线进行寻址
  4. IIC空闲电平状态固定为高电平(上拉电阻),SPI的SCLK空闲电平状态取决于时钟极性CPOL。

五、STM32F1芯片上的SPI

1、STM32F1的SPI 接口提供两个主要功能,支持 SPI 协议或 I2S 音频协议。STM32F1的SPI时钟最高可以到 36MHz,支持 DMA功能。STM32F1的SPI内部结构图:

标号1

SPI接口引脚,其中有MOSI、MISO、SCK、NSS(即CS)。

我们在配置的时候,需要查看原理图,其中MOSI、MISO、SCK需要单独配置,至于片选线NSS我们通常使用一个普通IO口就可以了,具体引脚参考电路原理图通过软件拉高拉低来产生片选信号。

我们可以查看中文参考手册关于芯片架构章节发现SPI1是挂接在APB2总线上的,SPI2和SPI3挂接在APB1总线上,根据SPI工作频率特性,SPI理论最大频率是其所在总线的一半,即SPI1理论最大工作频率可达72/2=36MHz,SPI2和SPI3理论最大工作频率可达36/2=18MHz。

标号2

是用于产生SCK频率的波特率发生器,我们是SCK时钟信号是波特率发生器根据SPI_CR1寄存器的BR0~BR2这几个位进行控制的。这几个位可以绝对时钟分频因子。

具体可以查看中文参考手册:

标号3

数据控制逻辑。SPI的MOSI和MISO都连接在数据移位寄存器当中。数据移位寄存器内容来源于接收缓冲区和发送缓冲区,还有MOSI和MISO。

假设将此SPI设备(即单片机)配置为主模式,如果是发送数据,则数据通过发送缓冲区进入到移位寄存器,再通过MOSI将数据发送出去。接收数据则是通过MISO将数据接收进来,接收到移位寄存器并进入接收缓冲区,再进入到总线进行传输。

标号4

寄存器单元。用于控制SPI的相关工作模式,包括主从模式,低位先行还是高位先行,波特率分频是多少,一次传送8位还是16位等等,具体的参考中文参考手册。

  1. SPI配置步骤(只是例子,具体的还得看实际芯片原理图和手册)

(1)使能SPI及对应GPIO端口时钟并配置引脚的复用功能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

(2)初始化SPI,包括数据帧长度、传输模式、MSB和LSB顺序等

void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);

typedef struct

{

uint16_t SPI_Direction;   //设置SPI的单双向模式

uint16_t SPI_Mode;       //设置 SPI 的主/从机端模式

uint16_t SPI_DataSize;  //设置 SPI 的数据帧长度,可选 8/16 位

uint16_t SPI_CPOL;     //设置时钟极性 CPOL,可选高/低电平

uint16_t SPI_CPHA;    //设置时钟相位,可选奇/偶数边沿采样

uint16_t SPI_NSS;  //设置 NSS 引脚由 SPI 硬件控制还是软件控制

uint16_t SPI_BaudRatePrescaler;//设置时钟分频因子

uint16_t SPI_FirstBit;   //设置 MSB/LSB 顺序

uint16_t SPI_CRCPolynomial; //设置 CRC 校验的表达式

}SPI_InitTypeDef;

SPI_Direction:用于设置 SPI 的通信方向,可设置为双线全双工(SPI_Direction_2Lines_FullDuplex),双线只接收(SPI_Direction_2Lines_RxOnly),单线只接收(SPI_Direction_1Line_Rx)、单线只发送模式(SPI_Direction_1Line_Tx)。

SPI_Mode:用于设置 SPI 工作在主机模式(SPI_Mode_Master)或从机模式(SPI_Mode_Slave ),这两个模式的最大区别为 SPI 的 SCK 信号线的时序, SCK 的时序是由通讯中的主机产生的。若被配置为从机模式, STM32 的 SPI 外设将接受外来的 SCK 信号。

SPI_DataSize:用于设置SPI通信的数据帧长度,可以选择8位(SPI_DataSize_8b)或者 16 位(SPI_DataSize_16b)。

SPI_CPOL:用于设置时钟极性,可设置为高电平(SPI_CPOL_High)或低电平(SPI_CPOL_Low )。

SPI_CPHA:用于设置时钟相位,也就是选择在串行同步时钟的第几个跳变沿(上升或下降)数据被采样,可以为 SPI_CPHA_1Edge(在 SCK 的奇数边沿采集数据) 或SPI_CPHA_2Edge (在 SCK 的偶数边沿采集数据) 。

SPI_NSS:用于设置NSS引脚的使用模式,可以选择为硬件模式(SPI_NSS_Hard )与软件模式(SPI_NSS_Soft ),在硬件模式中的 NSS信号由 SPI 硬件自动产生,而软件模式则需要我们使用相应的 GPIO 端口来控制。

SPI_BaudRatePrescaler:用于设置波特率分频因子,分频后的时钟即为 SPI 的 SCK 信号线的时钟频率。可设置为 fpclk 的 2、 4、 6、 8、 16、 32、 64、 128、 256 分频。

SPI_FirstBit:用于设置数据传输顺序是 MSB 位在前还是 LSB 位在前。

SPI_CRCPolynomial:用于设置 CRC 校验多项式,提高通信可靠性。

举例

SPI_InitTypeDef  SPI_InitStructure;

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工

SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始

SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式

SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

(3)使能(开启)SPI

void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState);

(4)SPI数据传输

void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);

uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);

(5)查看SPI传输状态

FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);

使用较多的是发送完成标志(SPI_I2S_FLAG_TXE)和接收完成标志(SPI_I2S_FLAG_RXNE)

SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE);

  1. EN25QXX介绍

EN25QXX 是大容量 SPI FLASH 产品,EN25Q64的容量是64Mb(8M字节),EN25Q128 的容量为 128Mb(16M字节),该系列还有EN25Q08/16/32/64 等。我们开发板上使用的是EN25Q16,学习这个芯片可以参考华邦公司的W25Q128芯片,因为它们是完全兼容的。所以我们以W25Q128进行介绍。

W25Q128 将 16M 的容量分为 256 个块( Block),每个块大小为 64K 字节,每个块又分为16 个扇区( Sector),每个扇区 4K 个字节。 W25Q128 的最小擦除单位为一个扇区,也就是每次必须擦除 4K 个字节。这样我们需要给 W25Q128 开辟一个至少 4K 的缓存区,这样对 SRAM 要求比较高,要求芯片必须有 4K 以上 SRAM 才能很好的操作。

W25Q128 的擦写周期多达 10W 次,具有 20 年的数据保存期限,支持电压为 2.7~3.6V,W25Q128 支持标准的 SPI,还支持双输出/四输出的 SPI,最大 SPI 时钟可以到 80Mhz(双输出时相当于 160Mhz,四输出时相当于 320M)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: STM32-ISO是一种特殊的STM32微控制器系列,其设计用于在噪声环境下提供高级别的电气隔离。这种电气隔离机制可以防止电感耦合、电容耦合和共模干扰等问题,从而增强系统的稳定性和可靠性。 使用零角度玩STM32-ISO,首先需要了解STM32-ISO的特点和功能。这些特点包括:双核设计、电气隔离技术、安全表面和故障保护等。双核设计使得STM32-ISO同时具备应用处理器和实时核,可以分别处理不同种类的任务,提高系统性能。电气隔离技术则确保信号在不同部分之间传输时不会相互干扰。安全表面保护系统免受未经授权的访问和攻击。故障保护机制可以防止系统在电气隔离失效时毁坏。 零角度玩STM32-ISO可以通过以下步骤实现: 1. 学习STM32-ISO的技术文档和参考手册,了解其硬件结构、内部模块和功能特性。同时要熟悉相关的开发工具和软件。 2. 了解使用STM32-ISO的典型应用场景。根据自己的需求,选择适合的开发板和模块。 3. 使用STM32CubeMX等工具进行代码生成和项目配置。根据实际应用需求,选择合适的外设模块和接口,配置GPIO、串口、定时器等功能。 4. 编写应用程序代码。使用C语言或其他支持的编程语言,结合STM32的开发库和驱动程序,实现特定的功能和算法。 5. 调试和测试应用程序。使用调试器或仿真器连接开发板,逐步调试代码并验证功能的正确性和稳定性。 6. 进一步优化和完善应用程序。根据测试结果和实际应用反馈,修复bug、改进性能或增加新功能。 通过以上步骤,我们可以全面了解STM32-ISO的特性,并在零角度上进行开发。这样能够最大限度地发挥STM32-ISO的性能优势,且保证系统的稳定性和可靠性,为特定的应用问题提供解决方案。 ### 回答2: STM32-ISO是一种基于ST Microelectronics的STM32微控制器的开发板,它专门设计用于开发与隔离有关的应用。隔离是指在电气和功能上分离电气系统的一种技术,以提高系统的安全性和可靠性。 使用STM32-ISO,可以便捷地实现对外部设备的隔离,从而保护主控器和其他关键部件免受电气干扰、过电压和过电流等问题的影响。这可以在很多应用场景中派上用场,比如工业自动化、医疗仪器、电力系统等。 要零角度玩STM32-ISO开发板,首先需要了解其硬件和软件特性。硬件方面,STM32-ISO集成了隔离电源电路和可编程逻辑电源电路,以分离主控器和外部设备。它还提供了丰富的接口,包括GPIO、I2C、SPI、UART等,方便与其他设备进行通信。 在软件方面,可以使用STM32Cube软件开发套件来编写代码。STM32Cube提供了丰富的开发工具和例程,可以帮助开发者快速上手。此外,还可以使用Keil MDK或者IAR Embedded Workbench等集成开发环境来进行开发。 零角度玩STM32-ISO可以从简单的实验开始,比如点亮LED灯。可以配置GPIO口为输出模式,并将其连接到板上的LED灯。通过编写相应的代码,可以控制LED灯的亮灭。 对于更复杂的应用,可以结合不同的外设模块,如传感器和执行器,同时进行阻隔控制和数据通信。例如,可以使用I2C接口与温度传感器进行通信,并将读取到的温度数据显示在液晶显示屏上。 总结而言,要零角度玩STM32-ISO,首先需要熟悉开发板的硬件和软件特性,然后通过简单的实验来熟悉开发流程。逐渐加深对开发板的理解,探索更多的应用场景,并结合外设进行更复杂的控制和通信操作。请开发者尝试使用STM32-ISO来实现自己感兴趣的项目,并通过不断学习和实践,进一步提高技术水平。 ### 回答3: STMicroelectronics的STM32系列是一款广泛应用于嵌入式系统的32位微控制器,具有高性能、低功耗和强大的扩展能力。而STM32-ISO则是基于STM32系列的特殊版本,能够实现隔离和保护,提供高级别的抗干扰能力和可靠性。 首先,STM32-ISO采用了进一步优化的硬件设计,以实现电气隔离,即通过在电路中添加隔离层来避免信号干扰和电气噪声的影响。这样可以确保系统在电气噪声较大的环境中仍能正常工作。 其次,STM32-ISO还配备了特殊的接口电路和通信协议,以实现与外部设备之间的隔离和保护。这些接口包括CAN总线、UART、SPI等,能够使STM32-ISO与其他设备进行安全可靠的通信。 另外,STM32-ISO还具备高级别的抗干扰能力,能够有效地抵御来自外界的电磁干扰和电气噪声。这是通过在电路设计中采用抗干扰措施和高质量的隔离材料来实现的。 最后,STM32-ISO支持丰富的软件开发工具和资源。开发者可以使用ST提供的官方开发环境和软件库来进行开发,同时还可以借助ST社区和论坛获取更多的技术支持和资源。 综上所述,STM32-ISO是一款强劲的嵌入式微控制器,通过电气隔离、接口保护、抗干扰能力以及软件开发工具的支持,能够在想要保证系统稳定性和可靠性的应用中发挥重要作用。无论在工业自动化、通信设备还是其他领域,STM32-ISO都是一个值得选择和使用的芯片。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钜锋王老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值