嵌入式物联网之SPI接口原理与配置

嵌入式物联网之SPI接口原理与配置,第1张

本实验采用W25Q64芯片

W25Q64是华邦公司推出的大容量SPI

FLASH产品,其容量为64Mb。该25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件。W25Q64将8M字节的容量分为128个块,每个块大小为64K字节,每个块又分为16个扇区,每个扇区4K个字节。W25Q64的最小擦除单位为一个扇区,也就是每次必须擦除4K个字节。所以,这需要给W25Q64开辟一个至少4K的缓存区,这样必须要求芯片有4K以上的SRAM才能有很好的 *** 作。

W25Q64的擦写周期多达10W次,可将数据保存达20年之久,支持27~36V的电压,支持标准的SPI,还支持双输出/四输出的SPI,最大SPI时钟可达80Mhz。

一。SPI接口原理

(一)概述
高速,全双工,同步的通信总线。

全双工:可以同时发送和接收,需要2条引脚

同步: 需要时钟引脚

片选引脚:方便一个SPI接口上可以挂多个设备。

总共四根引脚。

(二)SPI内部结构简明图
MISO: 做主机的时候输入,做从机的时候输出

MOSI:做主机的时候输出,做从机的时候输入

主机和从机都有一个移位寄存器,在同一个时钟的控制下主机的最高位移到从机的最高位,同时从机的最高位往前移一位,移到主机的最低位。在一个时钟的控制下主机和从机进行了一个位的交换,那么在8个时钟的控制下就交换了8位,最后的结果就是两个移位寄存器的数据完全交换。

在8个时钟的控制下,主机和从机的两个字节进行了交换,也就是说主机给从机发送一个字节8个位的同时,从机也给主机传回来了8个位,也就是一个字节。

(三)SPI接口框图
上面左边部分就是在时钟控制下怎么传输数据,右边是控制单元,还包括左下的波特率发生器。

(四)SPI工作原理总结
(五)SPI的特征
(六)从选择(NSS)脚管理
两个SPI通信首先有2个数据线,一个时钟线,还有一个片选线,只有把片选拉低,SPI芯片才工作,片选引脚可以是SPI规定的片选引脚,还可以通过软件的方式选择任意一个IO口作为片选引脚,这样做的好处是:比如一个SPI接口上挂多个设备,比如挂了4个设备,第二个用PA2,第三个用PA3,第四个用PA4作为片选,我们

跟第二个设备进行通信的时候,只需要把第二个片选选中,比如拉低,其他设备的片选都拉高,这样就实现了一个SPI接口可以连接个SPI设备,战舰开发板上就是通过这种方法来实现的。

(七)时钟信号的相位和极性
时钟信号的相位和极性是通过CR寄存器的 CPOL 和 CPHA两个位确定的。

CPOL:时钟极性,设置在没有数据传输时时钟的空闲状态电平。CPOL置0,SCK引脚在空闲时为低电平,CPOL置1,SCK引脚在空闲时保持高电平。

CPHA:时钟相位 设置时钟信号在第几个边沿数据被采集

CPHA=1时:在时钟信号的第二个边沿
CPOL=1,CPHA=1,

CPOL=1表示时钟信号在没有数据传输时即空闲时的状态为高电平。如果CPHA=1,那么数据就在时钟信号的第二个边沿即上升沿的时候被采集。

CPOL= 0,CPHA=1, CPOL=0表示时钟信号在没有数据传输时即空闲时的状态为低电平。

如果CPHA=1,那么数据就在时钟信号的第二个边沿即下降沿的时候被采集。

CPHA=0时:在时钟信号的第一个边沿
CPOL=1,CPHA=0,

CPOL=1表示时钟信号在没有数据传输时即空闲时的状态为高电平。如果CPHA=1,那么数据就在时钟信号的第一个边沿即下降沿的时候被采集。

CPOL= 0,CPHA=0, CPOL=0表示时钟信号在没有数据传输时即空闲时的状态为低电平。

如果CPHA=1,那么数据就在时钟信号的第一个边沿即上升沿的时候被采集。

为什么要配置这两个参数

因为SPI外设的从机的时钟相位和极性都是有严格要求的。所以我们要根据选择的外设的时钟相位和极性来配置主机的相位和极性。必须要与从机匹配。

(八)数据帧的格式和状态标志
数据帧格式:根据CR1寄存器的LSBFIRST位的设置,数据可以MSB在前也可以LSB在前。

根据CR1寄存器的DEF位,每个数据帧可以是8位或16位。

(九)SPI中断
(十)SPI引脚配置 (3个SPI)
引脚的工作模式设置
引脚必须要按照这个表格配置。

二。SPI寄存器库函数配置

(一)常用寄存器
(二)SPI相关库函数
STM32的SPI接口可以配置为支持SPI协议或者支持I2S音频协议。默认是SPI模式,可以通过软件切换到I2S方式。

常用的函数:

1 void SPI_Init(SPI_TypeDef SPIx, SPI_InitTypeDef

SPI_InitStruct);//SPI的初始化

2 void SPI_Cmd(SPI_TypeDef SPIx, FunctionalState NewState); //SPI使能

3 void SPI_I2S_ITConfig(SPI_TypeDef SPIx, uint8_t SPI_I2S_IT,

FunctionalState NewState); //开启中断

4 void SPI_I2S_DMACmd(SPI_TypeDef SPIx, uint16_t SPI_I2S_DMAReq,

FunctionalState NewState);//通 过DMA传输数据

5 void SPI_I2S_SendData(SPI_TypeDef SPIx, uint16_t Data); //发送数据

6 uint16_t SPI_I2S_ReceiveData(SPI_TypeDef SPIx); //接收数据

7 void SPI_DataSizeConfig(SPI_TypeDef SPIx, uint16_t SPI_DataSize);

//设置数据是8位还是16位

8 其他几个状态函数

void SPI_Init(SPI_TypeDef SPIx, SPI_InitTypeDef

SPI_InitStruct);//SPI的初始化
结构体成员变量比较多,这里我们挑取几个重要的成员变量讲解一下:

第一个参数 SPI_Direction 是用来设置 SPI 的通信方式,可以选择为半双工,全双工,以及串行发和串行收方式,这里我们选择全双工模式

SPI_Direction_2Lines_FullDuplex。

第二个参数 SPI_Mode 用来设置 SPI 的主从模式,这里我们设置为主机模式 SPI_Mode_Master,当然有需要你也可以选择为从机模式

SPI_Mode_Slave。

第三个参数 SPI_DataSiz 为 8 位还是 16 位帧格式选择项,这里我们是 8 位传输,选择SPI_DataSize_8b。

第四个参数 SPI_CPOL 用来设置时钟极性,我们设置串行同步时钟的空闲状态为高电平所以我们选择 SPI_CPOL_High。

第五个参数 SPI_CPHA

用来设置时钟相位,也就是选择在串行同步时钟的第几个跳变沿(上升或下降)数据被采样,可以为第一个或者第二个条边沿采集,这里我们选择第二个跳变沿,所以选择

SPI_CPHA_2Edge

第六个参数 SPI_NSS 设置 NSS 信号由硬件(NSS 管脚)还是软件控制,这里我们通过软件控

制 NSS 关键,而不是硬件自动控制,所以选择 SPI_NSS_Soft。

第七个参数 SPI_BaudRatePrescaler 很关键,就是设置 SPI 波特率预分频值也就是决定 SPI 的时

钟的参数 , 从不分频道 256 分频 8 个可选值,初始化的时候我们选择 256 分频值

SPI_BaudRatePrescaler_256, 传输速度为 36M/256=140625KHz。

第八个参数 SPI_FirstBit 设置数据传输顺序是 MSB 位在前还是 LSB 位在前, ,这里我们选择

SPI_FirstBit_MSB 高位在前。

第九个参数 SPI_CRCPolynomial 是用来设置 CRC 校验多项式,提高通信可靠性,大于 1 即可。

设置好上面 9 个参数,我们就可以初始化 SPI 外设了。

初始化的范例格式为:

SPI_InitTypeDef SPI_InitStructure;

SPI_InitStructureSPI_Direction = SPI_Direction_2Lines_FullDuplex;

//双线双向全双工

SPI_InitStructureSPI_Mode = SPI_Mode_Master; //主 SPI

SPI_InitStructureSPI_DataSize = SPI_DataSize_8b; // SPI 发送接收 8 位帧结构

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

371

SPI_InitStructureSPI_CPHA = SPI_CPHA_2Edge;//第二个跳变沿数据被采样

SPI_InitStructureSPI_NSS = SPI_NSS_Soft; //NSS 信号由软件控制

SPI_InitStructureSPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //预分频

256

SPI_InitStructureSPI_FirstBit = SPI_FirstBit_MSB; //数据传输从 MSB 位开始

SPI_InitStructureSPI_CRCPolynomial = 7; //CRC 值计算的多项式

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

(三)程序配置步骤
三。W25Qxx配置讲解

(一)电路图
片选用的PB12

W25Q64 是华邦公司推出的大容量SPI FLASH 产品,W25Q64 的容量为 64Mb,该系列还有 W25Q80/16/32

等。ALIENTEK 所选择的 W25Q64 容量为 64Mb,也就是 8M 字节。(1M=1024K)

W25Q64 将 8M 的容量分为 128 个块(Block),每个块大小为 64K 字节,每个块又分为 16个扇区(Sector),每个扇区 4K

个字节。W25Q64 的最少擦除单位为一个扇区,也就是每次必须擦除 4K 个字节。这样我们需要给 W25Q64 开辟一个至少 4K 的缓存区,这样对 SRAM

要求比较高,要求芯片必须有 4K 以上 SRAM 才能很好的 *** 作。

W25Q64 的擦写周期多达 10W 次,具有 20 年的数据保存期限,支持电压为 27~36V,W25Q64 支持标准的

SPI,还支持双输出/四输出的 SPI,最大 SPI 时钟可以到 80Mhz(双输出时相当于 160Mhz,四输出时相当于 320M),更多的 W25Q64

的介绍,请参考 W25Q64 的DATASHEET。

在往一个地址写数据之前,要先把这个扇区的数据全部读出来保存在缓存里,然后再把这个扇区擦除,然后在缓存中修改要写的数据,然后再把整个缓存中的数据再重新写入刚才擦除的扇区中。

便于学习和参考再给大家分享些spi 的资料

stm32之SPI通信

>1 MAX121芯片的性能与特点
MAX121芯片是一个带串行接口的14位模数转换集成电路(ADC),它包含有跟踪/保持电路 的一个底飘溢、底噪声、掩埋式齐纳电压基准电源。它的转换速度快、功率消耗底、采样速率高达308 ks/s点,满量程输入电压范围为±5V,功耗为210 mW。可与大多数流行的数字信号处理器的串行接口直接接口,该输入可以接收TTL或CMOS的信号电平,时钟频率为01-55MHz。
MAX121芯片的功能方框图如图1所示。它有16脚和20脚模式,16脚有DIP和SO封装,20脚有 SSOP封装。特点如下:
14位分辨率;29 μS转换时间/308 ks/s吞吐率;400 ns采样时间;底噪声和低失真:78Db SINAD-85Db THD;±5V双极性输入范围,可时承受±15V的过电压;210 mW功耗;可用连续转换模式;30 ppm/C,-5V内部基准源;与DSP处理器接口;16脚DIP和SO封装,20脚SSOP封装。
极限参数:VDD对DGND 03-+6V;VSS对DGND +03--7V;AIN对AGND±15V;AGND对DGND ±03V数字输入对DGND(CS,CONVST,MODE,CLKIN,INVCLK,INVFRM);-03(Vdd+03V);数字输出对DGND(SFRM,FSTRT,SCLK,SDATA )+03(Vdd+03V);连续功率消耗(TA=+70 ℃)
强度超出上述极限参数可能导致器件的永久性损坏。这些仅仅是极限参数,并不意味着在极限参数条件下,或在任何其他超出技术规范规定的工作条件下,器件能有效地工作。延长在极限参数条件下的运行时间,会影响器件的可靠性。
2 工作电路
MAX121运用逐次比较技术和跟踪/保持(T/H)电路,将模拟信号转换为14位串行数据输出 码。其控制逻辑接口很容易与大多数微处理器(霵)和数字信号处理器(DSP)相连接,在大多数应用中只需要很少几个无源元件。T/H电路不需要外接电容。
21 模拟输入跟踪与保持
根据等效输入电路分析,给出ADC的模拟比较器的采样结构。内部缓冲器给保持电容充电,以减小转换期间所要求的采集时间。模拟输入端呈现6k输入电阻及与其并联的10pF电容。
在两次转换之间,缓冲器输入通过输入电阻连接到AIN端。当转换开始时,缓冲器与AIN端 断开,对输入信号采样。在转换结束时,缓冲器输入端又连接到AIN端,而且保持电容跟踪 输入电压。无论何时,只要转换没有进行,T/H就处于跟踪模式。在转换开始以后,保持模 式启动时间接近10 ns(窗口延迟)。从一次转换到下一次转换延迟变化的典型时间为30 ps(窗口抖动)。
22 电路时钟频率
MAX121工作时需要一个与TTL,CMOS电平兼容的时钟,时钟频率的范围从01-55 MHz。为满足2个时钟周期400 ns采集时间的要求,最大时钟频率限制在5MHz。由于内部T/H 电压下降速率的限制,所有模式的时钟频率不应低于01MHz。
23 输出数据格式
转换结果以16位串行数据流输出,前14位为数据位(首先为MSB),后2位为零。输出数据 为二进制补码形式。在CLKIN的上升沿,数据在SDATA端同步输出。
输出数据可用FSTRT或者SFRM输出来分帧。FSTRT(平常为低)低于MSB1个时钟周期变为高。FSTRT的下降沿SDATA端输出MSB。
SFRM输出(当INVFRM=Vdd时通常为高)变为低的同时,MSB出现在SDATA端。16个时钟周期以后 SFRM变为高电平。通过输入接到数字地,可反转SFRM的极性。要求每次转换最少为18个时钟周期,以获得有效SFRM输出
3 TMS320高速串行接口
31 上电后的初始化
如果满足下列条件,上电后MAX121的首次转换将是有效的。提供16个时钟脉冲使T/H进入跟踪模式,再加上跟踪模式中数据采集的最小时间400 ns。确保基准源已经稳定。每1μF基准源旁路电容的稳定时间是05 ms(对22μF电容为11ms)。
32 串行时钟最大速率
与数字信号处理器接口时,MAX121的串行时钟最大速率取决于处理器的串行数据输入所要 求的最小建立时间和ADC的时钟与数据的最大延迟时间。MAX121有两种方法将数据读入处理器。 CLKIN是MAX121的输入时钟,而SCLK是使数据移位进入处理器的串行时钟,支持异步数据传输的场合。tSU是处理器串行数据输入端所要求的数据建立最小时间;tCD是MAX121的CL KIN到SCLK最大延时时间;tSC是MAX121的SCLK到SDATA的最大延时时间。MAX121 的SCLK输出驱动处理器的串行接口,此时可从以上议程中去掉tCD项,并允许使 用更快的时钟频率。在这种情况下,串行时钟最大速度由下式计算
fCLKIN=1/2(tSU+tSC)
33 高速数据串行接口
MAX121的CLKIN由外部时钟振荡器驱动。TMS320的XF0 I/O口驱动MAX121输入端为低,启动 一次转换。TMS320的CLKR(接收时钟)端配置为输入,并由 MAX121的SCLK输出端驱动。MAX 121的SDATA输出端数据在时钟的上升沿改变状态,而在时钟下降沿,数据被锁存到TMS320的 DR输入端。这样可提供1/2个时钟周期,以满足TMS320DR输入端所需要的数据建立和保持时间。 MAX121SCLK和SDATA之间的最大时滞在+25时为65ns,所以1/2个时钟周期足以满足要求的建立和保持时间。
MAX121的FSTRT输出驱动TMS320的FSR输入,以对数据分帧。FSTRT输出的下降沿指示MSB已准备好,可被锁存。在下一个时钟下降沿,MSB被锁存在TMS320。使用这种接口,TMS320可接收16位字(在TMS320串行口整体控制寄存器中,RLEN=01),于是14位数据被时钟同步移入DSP,同时跟随两位尾随的0。
4 结论
近几年来,随着便携式、手提式电子产品的日益增多,MAXIM系列产品的应用也越来越广 泛,这里详细介绍了MAX121芯片在数字信号处理高速串行接口电路方面的应用。同时MAX121集成电路也在语言识别和合成、DSP伺服合成、频谱分析等领域都有广泛的应用。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/13320643.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-14
下一篇 2023-07-14

发表评论

登录后才能评论

评论列表(0条)

保存