STM32 Nucleo中级教程1:利用SPI总线构建NUCLEO-072RB和NUCLEO-302RB双机处理系统

作者: fengye5340
上传时间为: 2014-12-10 04:52 PM

在实现复杂控制系统中,采用单独的MCU处理起来会比较吃力,采用双MCU配合工作是不错的选择。目前cortex-m0内核定位低端,价格低廉,适合作为主控制器承担实时控制任务,对于需要复杂系统运算和高速数据采集的工作则交由cortex-m4内核器件负责,这样采用cortex-m0/m4双MCU核心的处理系统价格适中,鉴于STMCU的程序通用性佳,能够实现快速开发应用,比单独使用大容量FLASH和RAM的STM32F3/F4器件具有更好的性价比。在近距离双机通信中,采用并行接口总线是最合适的选择.因为时钟速率不同,在通信工程中,需要构建FIFO缓冲池或者FIFO芯片,开发时间较长。采用串行总线如USART/I2C/SPI等成本低、易于实现,程序开发时间短,是一般应用比较理解的选择方式。

在串行通信中,USART速率理论可以达4.5Mbps,I2C最高1M bps,SPI最高18Mbps。兼顾速率来考虑,采用SPI方式是目前比较好的选择。这一篇文章讲解一下利用SPI总线构建NUCLEO-072RB和NUCLEO-302RB开发平台的双机处理系统。第一部分讲解STM32 SPI的基本内容和SPI库函数介绍;第二部分,讲解NUCLEO-072RB和NUCLEO-302R8主从机通信代码实现。

一、STM32 SPI总线介绍及SPI库函数

STM32F0 SPI总线特点

1、3线全双工同步传输

2、2线半双工/单工同步传输

3、 时钟极性、相位以及数据位序(MSB或LSB)可设置

4、支持主设备、从设备,以及多主模式

5、 片选信号的软、硬件管理

6、硬件CRC(用于8位或16位长度的帧)

8、能触发中断的标志(TxE、RxNE、MODF、OVR、CRCERR、FRE)

9、可配置的时钟速度fPCLK/2,高达18MHz

10、BSY标志用于检查当前总线上是否有数据在传输

11、自动发送CRC的DMA传输(独立的发送、接收请求)

SPI的结构是这样的:

SPI数据帧格式

SPI根据时钟极性和相位不同分为四种通信方式

1、数据帧长度可设置:4位~16位

2、时钟极性、相位可配置

3、数据位序可设置:MSB或LSB

对于NSS引脚来说,

MCU作为主设备:

NSS做输入时,无论软件还是硬件管理,信号都要为高电平

NSS做输出时,只能是硬件管理,NSS引脚配置被拉低

MCU作为从设备:是否被选中来和主设备通信,由输入的片选电平决定

硬件管理:由NSS引脚电平决定,低电平表示被选中

软件管理:由SSI位决定,0表示被选中;NSS引脚可做它用

两个MCU利用SPI总线通信,主要是采用全双工方式进行,半双工方式速率较慢,不建议采用。下面是全双工方式的引脚连线图:

全双工模式:同时发送和接收数据,至少需要3条线:MISO、MOSI和SCK(NSS可选)

下面是STM32-NUCLEO-072RB和STM32-NUCLEO-302R8的硬件连线图:采用了PB3/PB4/PB5三个引脚,但分别属于不同的SPI模块

STM32的 SPI库函数

要理解SPI结构体定义SPI_InitTypeDef

下面是SPI_InitTypeDef结构体的各成员定义

有了结构体和成员的宏定义,利用下面的库函数,就可以实现SPI通信代码配置

stm32f0xx_spi.c定义的库函数

SPI_Init();

SPI_Cmd();

SPI_RxFIFOThresholdConfig();

SPI_NSSInternalSoftwareConfig();

SPI_SendData8();

SPI_ReceiveData8();

SPI_I2S_ITConfig();

SPI_I2S_GetFlagStatus();

SPI_I2S_GetITStatus();

SPI_I2S_ClearFlag();

一、KEIL-MDK代码实现

两个MCU通过查询的方式实现SPI通信,另外还有中断方式和DMA方式。这里通过按键控制发送不同的字符,当对方接收到字符后,实现LED灯的开关。
STM32-NUCLEO-072RB主机端代码实现

1、Keil-mdk工程模板中加入SPI.C文件,在includes.h文件中加入SPI.H头文件

2、在SPI.H头文件宏定义

3、主机端SPI1_Init()代码实现:

注意这里的SPI结构体的各参数设置要和从机的保持一致,模式设置为主机

4、主机端发送和接收函数的代码实现

5、主机端按键中断代码的实现

6、主机端main.c主函数代码实现 

将SPI初始化代码加入后,定义一个变量LED_Flag来不断查询从机发送的数据,如果是0x01,打开LED灯,如果是0x02,关闭LED灯。

STM32-NUCLEO-302R8从机端代码实现

因为NCULEO平台良好的可移植性,从机端代码配置类似。

1、Keil-mdk工程模板中加入SPI.C文件,在includes.h文件中加入SPI.H头文件

2、在SPI.H头文件宏定义

3、从机端SPI3_Init()代码实现

这里是SPI3模块,SPI模式里面设置为从机模式。

4、从机端发送和接收函数的代码实现

这个和主机代码是类似的

5、从机端按键中断代码的实现

6、从机端main.c主函数代码实现

对于从机来说,也一样,定义个SPI_Value变量来查询主机发送数据,根据数据开关LED灯。

实验连接图:

代码地址链接

http://www.eeboard.com/bbs/thread-39696-1-1.html

摩尔吧视频地址链接

http://www.moore8.com/courses/306


全部评论 ()

创建讨论帖子

登录 后参与评论
系统提示