STM32的SPI可以作为master,也可以作为slave,作为slave的例程比较少,今天经过几个小时的折腾,终于把数据获取出来了,经验证和元数据是一致的。现将源代码贴在这里,供有需要的人参考。
 
硬件连接:
STM32(作为从设备)    外部设备
PB12-SPI2-NSS------------>  CS
PB13-SPI2-SCK------------->CLK
PB14-SPI2-MISO----NC
PB15_SPI2-MOSI----------->data
 
STM32作为从设备的时候,获取数据的接口为MOSI(PB15),STM32只需要从SPI接口获取数据,不需要发送数据,因此MISO(PB14)悬空。
//SPI2作为从机接口配置
void SPI_slave(void) 

    GPIO_InitTypeDef GPIO_InitStructure; 
    SPI_InitTypeDef SPI_InitStructure;
    NVIC_InitTypeDef   NVIC_InitStructure; 
    
    //Enable SPI2 clock and GPIO clock for SPI2 and SPI 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); 
    //IO初始化 
    
    //Configure SPI2 pins: SCK, MISO and MOSI 
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12|GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
    GPIO_Init(GPIOB, &GPIO_InitStructure); 
 
 
    //1st phase: SPI2 slave 
    //SPI1 Config 
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly;//只接收,不发送,这个地方是重点,如果设置为单工通信是不能实现数据采集的。
    SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; //从机模式
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //数据位为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_4; 
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //MSB优先
    SPI_InitStructure.SPI_CRCPolynomial = 7; 
    SPI_Init(SPI2, &SPI_InitStructure); 
 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //使用中断进行接收,因此设置NVIC的优先机组,1表示1bit抢占优先级
    
    NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn; 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure); 
    
    /* Enable SPI2 RXNE interrupt */    
    SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE); 
 
    //Enable SPI2 
    //SPI_Cmd(SPI2, ENABLE); //先不启动SPI,在收到特定命令的时候再启动
}

//中断服务程序
void SPI2_IRQHandler(void) 

    //接收数据 
    //printf("SPI_IRQ %d\n",RxIdx);
    SPI2_Buffer_Rx[RxIdx++] = SPI_I2S_ReceiveData(SPI2);

 
 
int main(void)
{  
    int i;
SystemInit(); /* 配置系统时钟为 72M */   
LEDKEY_GPIOInit();
USART_GPIOInit();
SysTick_Configuration();
USART_Configuration(USART1, 9600);
SPI_slave(); 
LED1_ON;
  while (1)
  {
     if(RxIdx==50)//接收数据满,对数据进行处理
     {
        SPI_Cmd(SPI2, DISABLE);
        RxIdx=0;
        printf("rcv full\n");
        for(i=0;i<49;i++)
           printf("0x%02X\n ",SPI2_Buffer_Rx[i]);//串口输出获取的数据
     }
     if(GetKey()==1)
{
LED1_ON;
         SPI_Cmd(SPI2, ENABLE);//按键按下后,使能SPI2,然后在中断中接收数据
         RxIdx=0;//接收数据下标清零
         printf("key1\n");
}
if(GetKey()==2)
{
LED1_OFF;
}
 
  }
}

stm32作为spi的从机使用例程相关推荐

  1. STM32做SPI主机用得多,SPI从机玩过吗?

    STM32如何配置为SPI从机? 前言 在平常的开发中,很多时候我们使用SPI都是使用主机模式去驱动一些传感器.存储器等等,很少会用到SPI从机.有时候,我们又需要STM32的SPI配置为从机去接收数 ...

  2. FPGA作为从机与STM32进行SPI协议通信---Verilog实现

    一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...

  3. FPGA作为从机与STM32进行SPI协议通信

    1.SPI协议简要介绍 (1)SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上 ...

  4. 基于stm32、spi协议的Fatfs文件系统移植(附完整代码下载)

    开发环境:Window 7 32bit 开发工具:Keil uVision4 硬件:stm32f103vct6 目录 1.硬件设计: 2.软件设计 1.SPI收发数据 2.向SD卡发送的命令格式: 3 ...

  5. stm32中spi可以随便接吗_STM32的SPI模式读写FLASH芯片全面讲解

    例程完整代码: SPI协议简介 SPI协议,即串行外围设备接口,是一种告诉全双工的通信总线,它被广泛地使用在ADC,LCD等设备与MCU间通信的场合. SPI信号线 SPI包含4条总线,分别为SS,S ...

  6. 实验 STM32 基于SPI的OLED屏显示

    STM32 基于SPI的OLED屏显示 一.任务要求 二.显示自己的学号和姓名 1.例子程序的改写 (1)下载资料 (2)解压后找到文件,并用KEIL打开. (3)改写程序 2.连接硬件 3.运行结果 ...

  7. STM32的SPI模式读写FLASH芯片全面讲解

    SPI协议简介 SPI协议,即串行外围设备接口,是一种告诉全双工的通信总线,它被广泛地使用在ADC,LCD等设备与MCU间通信的场合. SPI信号线 SPI包含4条总线,分别为SS,SCK,MOSI, ...

  8. 基于STM32的SPI基本介绍

    STM32---SPI(DMA)通信的总结(库函数操作) 本文主要由7项内容介绍SPI并会在最后附上测试源码供参考: 1.     SPI的通信协议 2.     SPI通信初始化(以STM32为从机 ...

  9. stm32中spi可以随便接吗_stm32之SPI通信协议实例详解

    之前一直对SPI通信一知半解,所以想抽空把它搞得明白一些.考虑到之前是结合Flash芯片来学的,十分不直观,而且主要把时间和精力都花在Flash芯片的datasheet和驱动上了,SPI通信也没学好. ...

最新文章

  1. 2022-2028年中国高等职业教育产业投资分析及前景预测报告
  2. 【刷算法】LeetCode- 两数之和
  3. 新闻更新php html,phphtml 新闻发布系统,运用php+mysql,里面包括数据库和php文件。 Other systems 其他 249万源代码下载- www.pudn.com...
  4. 百度搜索打不开第二页_北易信息:百度爱采购适合做优化推广吗
  5. Racket 6.7最新版本:提供对Android App的支持及改进的REPL等等
  6. python idea控制台中文乱码_python 解决cv2绘制中文乱码问题
  7. Tensorflow笔记(基础): 图与会话,变量
  8. Python+Selenium学习笔记10 - send_keys上传文件
  9. Linux使用技巧9--用dpkg管理你的软件
  10. 前置++与后置++的要点分析
  11. Exchange Server 2016 独立部署/共存部署 (七)—— DAG功能测试
  12. 吴恩达深度学习5.3笔记_Sequence Models_序列模型和注意力机制
  13. mysql拒绝远程连接_解决Mysql数据库拒绝远程连接和忘记密码的问题
  14. android的listview单项中包含RadioButton,实现RadioButton的单选显示效果
  15. dnn神经网络_Facebook AI新研究:可解释神经元或许会阻碍DNN的学习
  16. 多核处理器互联网络拓扑结构
  17. numpy.percentile()函数
  18. 漫画研发之九:浑水好摸鱼
  19. 如何更改eclipse项目文件中文件包的显示格式
  20. Android开发丶一步步教你实现okhttp带进度的列表下载文件功能

热门文章

  1. RUN 文件安装 postgresql8.4.12
  2. 财务自由之路 读书笔记 第六章 债务
  3. Go语言笔记----GoMoudle
  4. 打开网络adb 调试
  5. 计算机组成原理-宝典
  6. spring-cloud-context源码解读
  7. 编程入门:零基础想要学好C/C++编程?那你一定要看看这五个步骤!
  8. python中按钮位置设定_tkinter Python中的按钮位置(网格)
  9. Python学习笔记:part 1
  10. 新浪云服务器注册免费,新浪免费云空间SAE注册及云豆获取方法