STM32再学习 -- 工程师眼中的SPI

发布者:平和的心情最新更新时间:2014-10-23 来源: 21ic关键字:STM32  工程师  SPI 手机看文章 扫描二维码
随时随地手机看文章
前些天,有位网友谈到通过FPGA来实现SPI通讯。通过帖子的回复发现好多网友对SPI通讯还有些疑惑,于是今天就带着大家从SPI的标准协议,SPI在STM32单片机上的配置及在74HC595逻辑芯片通讯的实例来全方面认识一下这个既复杂又简单的通讯协议。

SPI 是Serial Peripheral Interface的缩写,直译为串行外围设备接口,SPI是Motorola公司推出的一种同步串行通讯方式,是一种四线同步总线,因其硬件功能很强,与SPI有关的软件就相当简单,使MCU有更多的时间处理其他事务。这里要说明一下,专利在电子行业还是很关键的,因此,部分其它厂商将SPI通讯协议更名以规避高昂的专利费,但其硬件处理方式是一样的,只是换了一个名称而已,例如德仪单片机里的SSI通讯。

常用的SPI通讯方式是标准四线制,如下图电路示意图所示:

1.jpg

MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。

MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。

SCK:串口时钟,作为主设备的输出,从设备的输入

NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。

MOSI脚相互连接,MISO脚相互连接。这样,数据在主和从之间串行地传输(MSB位在前)。通信总是由主设备发起。主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传数据。这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设备通过SCK脚提供。

比较复杂的是这个从选择(NSS)脚。其有两种模式:软件NSS模式与硬件NSS模式。

软件NSS模式下:在该模式下说得简单一些就是此引脚当作普通的GPIO来使用。其输入/输出的功能与操作GPIO是一样的。我们通过STM32来操作片外设备时多采用此模式。

硬件NSS模式下:此模式又下分两种情况:情况一、NSS输出被使能:当STM32工作为主SPI,并且NSS输出已经使能,这时NSS引脚被拉低,所有NSS引脚与这个主SPI的NSS引脚相连并配置为硬件NSS的SPI设备,将自动变成从SPI设备;情况二、NSS输出被关闭:允许操作于多主环境。

硬件的连接我们说完了,下面我再来介绍时钟线与信号线。

在学习数字逻辑电路时,我们都听老师讲过数据的锁存方式,例如上升沿锁存等。我们的SPI通讯方式在硬件上非常灵活的处理数据锁存方式,通过两个参数的配置提供了四种不同的数据传输模式,如下图所示:

2.jpg
3.jpg

从上图我们可以看出,当CPHA置高时,其数据锁存在第二个时钟边沿;CPHA清零时,数据锁存在第一个时钟边沿。而CPOL参数置高时,数据锁存在时钟信号的下降沿,时钟线空闲状态为常高,反之,数据锁存在时钟信号的上升沿,空闲状态为常低。

对于数据的发送过程,帧格式也是可以修改的,例如可以选择MSB方式(最高位先发送)或是LSB方式(最低位先发送),还可以选择插入CRC校验的方式等,这里对于这些高级的应用,由于本文片幅有限就不再详细讲解了。

接下来,我们通过STM32单片机对于SPI外设的初始化过程再来看一下SPI的硬件标准。

void SPI_init(void)

{

RCC_APB2PeriphClockCmd(sFLASH_CS_GPIO_CLK | sFLASH_SPI_MOSI_GPIO_CLK | sFLASH_SPI_MISO_GPIO_CLK |

sFLASH_SPI_SCK_GPIO_CLK, ENABLE);

/*!< 配置SPI的外设时钟,并使能 */

RCC_APB2PeriphClockCmd(sFLASH_SPI_CLK, ENABLE);

/*!< 配置SCK引脚 */

GPIO_InitStructure.GPIO_Pin = sFLASH_SPI_SCK_PIN;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //此处根据具体应用而设置,例如可配置为开漏输出

GPIO_Init(sFLASH_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);

/*!< 配置MOSI引脚 */

GPIO_InitStructure.GPIO_Pin = sFLASH_SPI_MOSI_PIN;

GPIO_Init(sFLASH_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);

/*!< 配置MISO引脚 */

GPIO_InitStructure.GPIO_Pin = sFLASH_SPI_MISO_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(sFLASH_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);

/*!< 配置NSS引脚为GPIO输出 */

GPIO_InitStructure.GPIO_Pin = sFLASH_CS_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(sFLASH_CS_GPIO_PORT, &GPIO_InitStructure);

/*!< SPI配置 */

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //数据线两线,双向全双半

SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //CPOL置高,时钟线在闲时常高,下降沿锁存数据

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CPHA置高,则第二个时钟沿锁存数据

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //从引脚为软件配置方式

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //SPI时钟频率为4分频

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //MSB最高位优先发送

SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC检验公式选择第7项

SPI_Init(sFLASH_SPI, &SPI_InitStructure);

/*!< 使能SPI */

SPI_Cmd(sFLASH_SPI, ENABLE);

}

上面的源代码是示例是ST公司操作SPI flash的Demo示例。我们再以74HC595芯片的硬件操作操作来配置,初始化SPI外设。

我们先来看一下74HC595的硬件操作时序图:

4.jpg

从上图,我们可以看出,时钟线(SH_CP)在空闲状态为常低,并且为第一个时钟沿的上升沿锁存数据。因此,我们需要将上面配置初始化的两个参数修改为如下:

SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //CPOL置高,时钟线在闲时常低,上降沿锁存数据

SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //CPHA清零,则第一个时钟沿锁存数据

其它参数不做修改即可。上述源代码已经通过STM32F103与8片74HC595串联实验通过,示例完整工程源代码可以到电子产品世界论坛片自行查找、下载。

标准四线的SPI通讯不仅为我们节省了宝贵的单片机引脚数,而且其规范的硬件协议也为我们嵌入式软件编程提供了极大的便利。丰富的外围器件支持,例如SPI的flash存储,SPI接口的SD读卡器,SPI接口的网络通讯模块都已经非常普及,可以看到应用好外设SPI通讯已经成为一名工程师必要的技能之一。

关键字:STM32  工程师  SPI 引用地址:STM32再学习 -- 工程师眼中的SPI

上一篇:采用Cortex-M3的12位4-20mA环路供电型热电偶测量系统
下一篇:基于嵌入式云技术的油井液位远程测试系统

推荐阅读最新更新时间:2024-03-16 13:43

基于STM32的嵌入式测控系统设计与实现
测控系统是水动力实验中的重要测试设备。在实验中有压力、拉力、加速度等物理量通过传感器转换成电压值,需要准确记录。虽然实验模型有很多种,但是共用传感器及测控系统,因此对测控系统的通用性和用户界面友好性提出了要求。本文采用嵌入式架构设计了测控系统。 本文设计的系统硬件基于STM32芯片,具有很强的扩展能力,易于移植,其外设单元资源丰富,能够达到系统要求的精度和范围。 1、硬件架构 采用嵌入式架构(见图1)的优点是通用性强,便于在多平台移植;主控芯片外围电路模块丰富,包括ADC、DA、CAN和SDIO等接口,独立完成对多种类型设备的测量、控制。芯片的主频高,运算能力也很强,适合嵌入复杂的算法。完全适合作为测控系统,具备系统升级
[单片机]
基于<font color='red'>STM32</font>的嵌入式测控系统设计与实现
STM32 外部 SRAM
STM32F103ZET6 自带了 64K 字节的 SRAM,对一般应用来说,已经足够了,不过在一些对内存要求高的场合,STM32 自带的这些内存就不够用了。比如跑算法或者跑 GUI 等,就可能不太够用 IS62WV51216 简介 IS62WV51216 是 ISSI(Integrated Silicon Solution, Inc)公司生产的一颗 16 位宽 512K(512*16,即 1M 字节)容量的 CMOS 静态内存芯片。该芯片具有如下几个特点: l 高速。具有 45ns/55ns 访问速度。 l 低功耗。 l TTL 电平兼容。 l 全静态操作。不需要刷新和时钟电路。 l 三态输出。 l 字节控制功能。支
[单片机]
STM32中使用printf打印串口数据的实现原理及方法
STM32中使用printf打印串口数据的实现原理 在C库中,printf()等输出流函数都是通过fputc()这个函数实现的,所以我们通过重映射的方式,修改这个函数的定义使它输出在STM32的寄存器中,便可以实现使用printf()函数在STM32串口上输出数据的功能。 盘点一下实现printf()函数打印字符串重定义到USART1的方法 方法一 1添加包含printf()函数的头文件:#include “stdio.h” 2.重写 stdio.h 头文件中的 int fputc(int ch, FILE *f) 函数 3.将该函数” int fputc(int ch, FILE *f) “放在main()函数能够调用到的文
[单片机]
STM32的各个MCU性能评判
1写在前面 我们经常听见某手机发布会,安兔兔跑分多少多少,其实这个跑分就是体现手机性能的一个指标。我们使用STM32开发产品,选择MCU时,一般会综合考虑MCU各方面性能。对于MCU来说,一个重要指标是功耗,还有一个重要指标就是性能。 当我们进入ST官方微控制器网页,就会发现ST将MCU划分为不同层次,如下图: https://www.st.com/en/microcontrollers.html 从上面层次关系,大致可以了解ST各MCU的功耗和性能。 2 STM32 CoreMark跑分 STM32家族的32位微控制器基于ARM Cortex®-M处理器设计,为用户提供新的自由度。 产品集高性能、实时性、数字信号处理
[单片机]
<font color='red'>STM32</font>的各个MCU性能评判
STM32笔记之九:打断它来为我办事,EXIT (外部I/O中断)应用
a) 目的:跟串口输入类似,不使用中断进行的IO输入效率也很低,而且可以通过EXTI插入按钮事件,本节联系EXTI中断。 b) 初始化函数定义: void EXTI_Configuration(void); //定义IO中断初始化函数 c) 初始化函数调用: EXTI_Configuration();//IO中断初始化函数调用简单应用: d) 初始化函数: void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; //EXTI初始化结构定义 EXTI_ClearITP
[单片机]
STM32平衡小车】平衡小车的PID环体会心得
平衡环: P可增加响应速度 P过小,响应太慢,不能达到直立。 P过大,会出现大幅度的低频抖动。 D可消除P大了之后产生的大幅低频抖动。 D过大,会出现高频抖动。 速度环: P可增加速度的响应,I和P有比例关系I=P/200. P过小,响应慢,出现的现象是加速减速慢,迟钝。 P过大,会出现低频抖动。 转向环 P过下,转弯不及时 P过大,大幅度抖动 两个东西待解决 1、左右轮编码器之和数值输出的范围确定 2、小车转向的gyro范围确定 一、机械中值的确定 不管是那个环,小车物理人为的短时直立,这个必须要做到,不然调试任何参数,任何环都是扯。 机械中值的确定方法,通过OLED上显示的陀螺仪倾角确定,存在某一个
[单片机]
STM32编程小总结
1.在主函数的正式调用里,RCC的配置一定要在各外设的函数调用之前。 2.外设调试出现问题时,一定先考虑是不是没有打开外设的时钟。并且RCC配置和外设时钟的打开要在配置寄存器之前。 3.使用模块化编程可以使程序简单易读,可移植性高,下一次调用方便。但是可能会出现很多问题,必须一一克服。 在主函数里,把需要用得到的各模块配置函数调用写入,这一点很重要。 4.模块化编程时,一定要确保模块的.c文件添加进了工程目录,否则会出现:Undefined Symbol的错误提示,这一点要牢记。 5.中断服务函数必须要写进stm32f10x.it.c里面。否则会出问题。 6.有时添加的模块太多可能会调试不出来,这时考虑把GPI
[单片机]
工程师们如何设计新一代自动化测试系统
  绪论:自动化测试系统的设计 挑战   测试管理人员和工程师们为了保证交付到客户手中的产品质量和可靠性,在各种应用领域(从设计验证,经终端产品测试,到设备维修诊断)都采用自动化测试系统。他们使用自动测试系统执行简单的“通过”或“失败”测试,或者通过它执行一整套的产品特性测试。由于设计周期后期产品瑕疵检测的成本呈上升趋势,自动化测试系统迅速地成为产品开发流程中一个重要的部分。这篇“设计下一代自动化测试”的文章描述了一些迫使工程团队减少测试成本和时间的挑战。这篇文章还深刻地洞察了测试管理人员和工程师们如何通过建立模块化软件定义型测试系统来克服这些挑战。这种测试系统在减少总体成本的同时,显著地增加了测试系统的吞吐量和灵活性。
[测试测量]
<font color='red'>工程师</font>们如何设计新一代自动化测试系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved