STM32如何配置为SPI从机?

前言

在平常的开发中,很多时候我们使用SPI都是使用主机模式去驱动一些传感器、存储器等等,很少会用到SPI从机。有时候,我们又需要STM32的SPI配置为从机去接收数据,本文就是介绍如何使用探索者开发版配置SPI从机。

这里我们以探索者开发版标准库实验25 SPI实验为基础例程进行修改。这里我们把SPI从机只定义为一个接收,所以没有发送数据的操作。SPI的基础知识需要大家自己去学习,这里着重说明使用方法。

关注(开源电子网)公众号,后台回复:SPI
(免费领取项目文件)

接下来,我们来看一下具体代码实现。
SPI初始化函数修改为如下代码:

void SPI1_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);   //使能GPIOB时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);    //使能SPI1时钟//GPIOA3,4,5初始化设置GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;      //复用功能GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;       //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;   //100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;       //上拉GPIO_Init(GPIOA, &GPIO_InitStructure);              //初始化GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_SPI1); //PB3复用为 SPI1GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); //PB4复用为 SPI1
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1); //PB5复用为 SPI1//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly;  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;         //SPI工作模式:从机SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;  //SPI的数据大小:8位SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;           //时钟的空闲状态为高电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;          //时钟的偶数边沿数据被采样SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;            //NSS信号由硬件管理SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;    //数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7;              //CRC值计算的多项式SPI_Init(SPI1, &SPI_InitStructure);                 //初始化SPINVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  //抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;         //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);                                 //初始化NVICSPI_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);                   //开启中断SPI_Cmd(SPI1, ENABLE);        //使能SPI外设
}
这里特别需要几点:
① 主机和从机的工作模式要一致,即时钟极性和时钟相位要一样。
② 主机和从机的数据帧大小要一致,即8位或者16位。
③ 主机和从机的数据传输顺序要一致,即MSB或LSB。

以上代码跟原来程序不同点:
① SPI1的引脚使用的是PA4(SPI1_NSS),PA5(SPI1_CLK)和PA7(SPI1_MOSI)三个引脚即可了,因为不需要使用到发送功能,PA6(SPI1_MOSI)就不用配置了。(这些引脚复用信息可以查看原理图或者芯片数据手册)
② SPI_InitStructure.SPI_Direction设置为SPI_Direction_2Lines_RxOnly,即SPI设置为双线单向接收。这种情况下,主机的MOSI直接连接从机的MOSI即可。
③ NSS引脚的管理我们直接使用硬件管理,也就是需要对PA4(SPI1_NSS)进行操作,拉低就是选中,拉高就是释放片选。
④ 使能SPI的接收中断即SPI_ITConfig(SPI1, SOI_I2S_IT_RXNE, ENABLE),还需要设置NVIC。
⑤ 由于是只接收,所以不需要调用SPI1_ReadWriteByte函数去发送数据。
此外,我们还需要编写SPI中断服务函数,代码如下:

void SPI1_IRQHandler(void)
{uint8_t rec_data = 0;if (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_IT_RXNE) == SET){rec_data = SPI_I2S_ReceiveData(SPI1);printf("data:%x \r\n",rec_data);LCD_ShowNum(30, 190, rec_data, 3, 16);      //显示读到的字符串/* 清除接收中断 */SPI_I2S_ClearITPendingBit(SPI1, SPI_I2S_IT_RXNE);LED1=!LED1;}
}

当主机拉低片选,发送数据过来,那么从机就会进入到接收中断,并且通过SPI_I2S_ReceiveData函数去SPI1->DR寄存器中获取到数据。当然我们获取完数据之后还得清除一下接收中断标记。
具体接线图如下:

主机程序中通过按键发送不同数据,代码如下:

从机接收的数据在串口助手中显示出来,如下图:

通过这个简单的从机demo,大家就可以发挥想象做很多有趣的东西,把STM32弄成一个带有SPI接口的模组等等。

STM32做SPI主机用得多,SPI从机玩过吗?相关推荐

  1. STM32做主机------MCGS(昆仑通态)触摸屏做从机----modbus通讯设置

    目的:Stm32做modbus主机, mcgs触摸屏做从机. 将需要显示的数据发送给mcgs进行显示. 一.stm32主机程序 请见我的博文:https://blog.csdn.net/sym_sim ...

  2. Verilog实现SPI主机通信

    前言 在今年二月份的时候我写了一篇关于SPI模式的Verilog代码实现的博客(原文 ),当时由于时间关系,我只测试了SPI的一种通信模式(CPOL = 0, CPHA = 0),在该模式下通信正常, ...

  3. 非标准语法;请使用 _一文读懂使用MCU SPI访问具有非标准SPI接口ADC的方法

    好文章当然要分享啦~如果您喜欢这篇文章,请联系后台添加白名单,欢迎转载哟~ 问题 能否用MCU访问非标准SPI接口? 答案 可以,但可能需要做一些额外的努力. 当前许多精密模数转换器(ADC)具有串行 ...

  4. 使用MCU SPI访问具有非标准SPI接口ADC的方法

    关注.星标公众号,不错过精彩内容 整理:黄工 来源:亚德诺半导体 提问:能否用MCU访问非标准SPI接口? 答案:可以,但可能需要做一些额外的努力. 当前许多精密模数转换器(ADC)具有串行外设接口( ...

  5. STM32用cube配置FATFS模式下SPI读写SD卡

    要求:掌握SD卡协议原理,用STM32F103 完成对SD卡的数据读取(FAT文件模式) 目录 一.SD卡与FATS 1.SD卡 2.FATFS文件系统 二.工程实现 1.编译运行 2.接线 3.初始 ...

  6. STM32F103 SPI 主机模式分析

    STM32F103的SPI模块,跟通用SPI芯片的工作模式有些区别,手册上也没有特别注明,所以光看手册有时候还不容易理解. STM32上的不同之处在于SPI模块工作在主机模式时,模块内部有一个控制脚必 ...

  7. stm32 SD(SDSC)卡的学习与SPI 模式应用(卡槽介绍)

    这次的sd卡内容比较多,写的比较多,关于卡的命令和寄存器方面内容较多下面只是简要题一下,我们只需要指导如何使用即可,深入研究相对比较困难. 什么是SD 卡? SD 卡( Secure Digital ...

  8. ESP32学习笔记(19)——SPI(主机)接口使用

    一.SPI简介 SPI(Serial Peripheral Interface) 协议是由摩托罗拉公司提出的通讯协议,即串行外围设备接口,是一种高速全双工的通信总线.它被广泛地使用在 ADC.LCD ...

  9. STM32学习开发记录:W25Q16(FLASH)——SPI

    选用硬件:STM32F103 Nano开发板 板载有W25Q16 一.SPI协议简介 1.SPI的接线与数据 SPI:Serial Peripheral interface 串行外围设备接口 上图是S ...

  10. 国产W806 SPI主机/从机驱动程序

    一段时间芯慌后国外芯片价格飙升,国内芯片厂突然崛起:乘此机会使用了该芯片做了一批产品,经过一段时间测试芯片稳定性还可以,工作在电磁环境较差的电源监控中没有出现复位死机现象. 关于该国产芯片资料实在是很 ...

最新文章

  1. 四连问:API 接口应该如何设计?如何保证安全?如何签名?如何防重?
  2. Unity3D协程(转)
  3. UNIX再学习 -- 进程间通信之管道
  4. spring 获取url参数
  5. RT-Thread对GPIO操作两种方式的区别:1)通过设备操作接口2)直接通过通用GPIO设备驱动
  6. 数据结构探险——图篇
  7. Java文件的写入与读出
  8. 《批判性思维工具》—— 阅读内化(5)
  9. 第1章 初始JAVA
  10. sqlserver的文件导入到mysql_导入50G文件到mysql,然后再倒入sqlserver
  11. 法线贴图的实现【OpenGL】
  12. 深蓝卡通风人教版小学五年级英语课件PPT模板
  13. D2D与其他短距离通信技术
  14. 地鼠君黑盒测试--小白功能测试避雷经验分享
  15. EXP9 web安全基础实践
  16. Python地铁车票
  17. openfeign实现远程调用
  18. 微软云 azure 数据迁移之oracle11g dataguard
  19. 微信支付时appid 和openId不匹配
  20. 如何用3天时间快速摸清一个行业

热门文章

  1. 解决桌面IE图标无法删除方法
  2. 加速电脑启动,给电脑瘦身
  3. Table Compression Characteristics
  4. zabbix探究告警触发器Triggers
  5. axelor java快速开发平台和erp系统介绍
  6. 月赚千刀的国外联盟Lead项目,实操拆解
  7. linux添加ip白名单_centOS7 下利用iptables配置IP地址白名单的方法
  8. gt2怎么与微信连接不上服务器,华为WATCH GT2收不到通知消息怎么办?收不到短信微信消息的解决方...
  9. 外企做开发,爽吗?(HSBC篇)
  10. 涨姿势 - 了解各种常见的CO(CIO、CEO、CFO...)