查看: 1147|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2018-9-18 06:28
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2014-12-10 16:52:57 | 显示全部楼层 |阅读模式
    分享到:
    在实现复杂控制系统中,采用单独的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灯。
    实验连接图:

    代码地址链接
    https://www.eeboard.com/bbs/thread-39696-1-1.html
    摩尔吧视频地址链接
    https://www.moore8.com/courses/306













    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-18 14:48 , Processed in 0.120754 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.