串行外设接口 (SPI) 总线是一个工作在全双工模式下的同步串行数据链路。它可用于在单个主控制器和一个或多个从设备之间交换数据。其简单的实施方案只使用四条支持数据与控制的信号线(图 1):
虽然表1中的引脚名称来自摩托罗拉开发的SPI标准,但具体集成电路的SPI端口名称往往与图1中所示的不同。
图 1:基本 SPI 总线
表 1:SPI 引脚名称分配
SPI 数据速率一般在1到70MHz的范围内,字长为从8位及12位到这两个值的倍数。
数据传输一般由数据交换构成。在主控制器向从设备发送数据时,从设备也向主控制器发送数据。因此主控制器的内部移位寄存器和从设备都采用环形设置(图 2)。
图2:双移位寄存器形成一个芯片间的环形缓存器
在数据交换之前,主控制器和从设备会将存储器数据加载至它们的内部移位寄存器。收到时钟信号后,主控制器先通过MOSI线路时钟输出其移位寄存器的MSB。同时从设备会读取位于SIMO的主控器第一位元,将其存储在存储器中,然后通过SOMI时钟输出其MSB。主控制器可读取位于MISO的从设备第一位元,并将其存储在存储器中,以便后续处理。整个过程将一直持续到所有位元完成交换,而主控器则可让时钟空闲并通过/SS 禁用从设备。
除设置时钟频率外,主控制器还可根据数据配置时钟极性和相位。这两个分别称为CPOL与CPHA的选项可实现时钟信号180度的相移以及半个时钟周期的数据延迟。图3是相应的定时图。
图3:时钟极性与相位的定时图
CPOL = 0 时,时钟空闲在逻辑 0 位置上:
如果CPHA = 0,数据在SCK的上升沿读取,在下降沿变化。
如果CPHA=1,数据在SCK的下降沿读取,在上升沿变化。
CPOL= 1 时,时钟在逻辑为高时空闲:
如果CPHA =0,数据在SCK的下降沿读取,在上升沿变化。
如果CPHA= 1,数据在SCK的上升沿读取,在下降沿变化。
在SPI中,主控制器可与单个或多个从设备通信。如果是一个单从设备,从设备选择信号可连接至从设备的本地接地电位,实现永久接入。对使用多个从设备的应用,可使用两种配置:独立从设备与菊花链从设备(图4)。
图4:主控制器与独立从设备(左)及菊花链从设备通信(右)
要与从设备单独通信,主控制器必须提供多重从设备选择信号。该配置通常用于必须单独访问多个模数转换器(ADC)及数模转换器(DAC)的数据采集系统中。
菊花链从设备只需要主控制器提供一个从设备选择信号,因为这种配置要求所有从设备同时启用,以确保数据不间断地流经该链路中的所有移位寄存器。典型应用是工业I/O 模块中的级联多通道输入串行器与输出驱动器。
关键字:串行外设接口 SPI 总线解析
引用地址:
串行外设接口(SPI)总线解析及应用
推荐阅读最新更新时间:2024-05-02 23:15
AVR单片机SPI简单应用
主机程序 #include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int /*----------------------------------------- 函数名称: void delay(uchar Da ta) 函数功能: 延时函数 参 数: 返 回 值: 无 -----------------------------------------*/ void delay(uchar Da ta) { uchar i; while(Da ta--) for(i=125;i 0;i--
[单片机]
stm32寄存器之spi2读写sd卡
看完sd卡读写,我也忍不住自己试一试 使用spi1的时候,程序运行成功,但是当我尝试用spi2 的时候,一次一次的fail,现在总结发现本身错在这几个地方,其中也有一些地方是大家的普遍错误: 1,自己尝试硬件的时候,一定要把硬件先连接好,这个是基础保障,不能急 2,spi1 的时钟是接在APB2上,是72MHZ,而spi2的时钟是接在APB1上的,是36MHZ 所以从SPI1转移到SPI2时一定要注意分频的问题 3,在学习板上使用spi接口的时候,一定要禁用掉使用这个接口的其余模块,我自己的学习板上就是,nrf2401与vs1003都用了SPI2接口,我的是要禁用掉vs1003就可以,禁用方法就是把vs10
[单片机]
MSP430 SD卡SPI读写操作(3) —— SD卡读写实现(以MSP430F5438A为例)
本节提供了MSP430F5438A SPI读写SD卡的示例代码,使用官方函数库msp430_driverlib_2_60_00_02,使用IAR for msp430 6.3通过编译。 本节代码未对SD卡进行区分,因此只针对SDHC卡进行操作,程序在金士顿 8GB SDHC microSD卡经过验证可以正常运行。 sdhc.h #ifndef _SDHC_H_ #define _SDHC_H_ #define SDHC_INIT_CLK 125000 #define SDHC_HIGH_CLK 3125000 #define SDHC_CS_PORT GPIO_PORT_P9 #define SDHC_CS_PIN
[单片机]
基于STM32F0的SPI通信的FLASH程序分析
一、GPIO的综合描述 stm32每一个GPIO端口拥有2个32bits的configuration寄存器(GPIOx_CRL,GPIOx_CRH),2个32bits的数据寄存器(GPIOx_IDR,GPIOx_ODR),1个32bits的set/reset寄存器(GPIOx_BSRR),1个16bits的reset寄存器(GPIOx_BRR)和1个32bits的Lock寄存器(GPIOx_LCKR)。 (一)每一个IO引脚都可以使用软件配置为以下几种模式: 1. 浮空输入 2. 带上拉输入 3. 带下拉输入 4. 模拟输入 5. 开漏输出——(此模式可实现hotpower说的真双向IO) 6. 推挽输出 7. 复用功能的推挽
[单片机]
基于SPI总线的无线数据传输系统设计
短程、便捷、廉价的无线通信技术正成为关注的焦点,使人们对它的需求越来越高。例如无线数据采集、无线设备管理和监控、无线抄表以及矿井下的无线通信等都是其典型应用。
1 系统总体结构
文中利用51单片机和无线数据收发芯片nRF905构成无线数据传输系统,给出了硬件和软件设计方案。其数据传输过程是:从传感器输入的模拟信号经AD采集后,将数据输入单片机,然后单片机将该发送数据,通过SPI接口发送给nRF905,nRF905将数据自动加上前导码和CRC码后将数据包发送。当接收端的nRF905接收到有效数据后,DR置高;单片机检测到DR为高电平后,复位TRX_CE引脚,使nRF905进入空闲模式,通过SPI接口从nRF905
[嵌入式]
STM32_SPI主从通信
今天讲解“STM32F103 SPI主从通信”,原本计划将这部分内容定在后面(第二阶段)来讲解,满足一位网友的问题“关于两块MCU的SPI通讯”,所以今天特地提前讲解了。 由于昨天讲解的是“SPI读写Flash”,MCU是作为SPI通信中的主机,今天主要讲解SPI通信的从机,我将我测试的主机和从机的代码分别打包供大家下载测试。 今天提供并讲解的软件工程,基于昨天的软件工程“SPI读写Flash”修改而来。若有疑问,请关注微信公众号“EmbeddDeveloper”获取更多信息。 今天的软件工程下载地址(360云盘 - 密码见微信): 主机: https://yunpan.cn/cPIJguDkjntYI 访问密码 7
[单片机]
关于STM32的SPI端口设置问题
在复用SPI总线时,必须先设置总线端口。读取其他ARM芯片(如NXP)一般很容易看出芯片的设置是否正确。不过对于STM32就容易让人迷惑了。例如,我们在使用SPI总线进行通信时,可以这样设置: GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用的推挽输出 恐怕大家对MISO端口的设置就会产生疑惑了
[单片机]
基于DSP+CPLD的断路器智能控制单元设计
摘要 :本文介绍了基于新型高性能数字信号处理器(DSP)芯片TMS320F2812和复杂可编程逻辑器件(CPLD)MAX7128实现的断路器智能控制单元设计。重点叙述了调理电路、F2812通信模块、CPLD模块的设计。采用嵌入式实时多任务操作系统μC/OS-Ⅱ作为系统软件平台,论述了系统软件和应用软件(任务的优先级、流程、通信与同步、通信协议等)的设计,并用VHDL语言实现执行电路的程序设计。该设计方案可提高断路器智能控制单元的可靠性,便于性能扩展。 随着计算机技术、信号检测技术及微电子技术的迅猛发展,对断路器控制单元的要求也不断提高,现代智能控制单元不仅要求具有自动保护、维护和信息传递功能,而且要求具备标准的通信协议
[工业控制]