Slave模式设置

SPI的使用,Master端的很多,Slave端的不好找,也很少,能参考的也很少,后面具体来看一下:
Slave端的初始化程序和Master端的只有一行不同
hspi1.Init.Mode = **SPI_MODE_SLAVE;**其它完全一致。
初始化代码:

/* SPI1 init function */
void MX_SPI1_Init(void)
{hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_SLAVE;hspi1.Init.Direction = SPI_DIRECTION_2LINES;hspi1.Init.DataSize = SPI_DATASIZE_8BIT;hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;hspi1.Init.NSS = SPI_NSS_HARD_INPUT;hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;hspi1.Init.TIMode = SPI_TIMODE_DISABLE;hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;hspi1.Init.CRCPolynomial = 10;if (HAL_SPI_Init(&hspi1) != HAL_OK){Error_Handler();}
}void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(spiHandle->Instance==SPI1){/* SPI1 clock enable */__HAL_RCC_SPI1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**SPI1 GPIO Configuration    PA4     ------> SPI1_NSSPA5     ------> SPI1_SCKPA6     ------> SPI1_MISOPA7     ------> SPI1_MOSI */GPIO_InitStruct.Pin = CHX_NSS_Pin|CHX_SCLK_Pin|CHX_MOSI_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = CHX_MISO_Pin;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(CHX_MISO_GPIO_Port, &GPIO_InitStruct);/* SPI1 interrupt Init */HAL_NVIC_SetPriority(SPI1_IRQn, 5, 0);HAL_NVIC_EnableIRQ(SPI1_IRQn);}
}

收发数据函数

数据收发同时进行:

HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)

数据收:(可选)

HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)

数据发:(可选)

HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
要注意的是,数据收和数据发其实也同时进行了对应的数据发和数据收工作,只是没关注,所以没拿数据;

对应的回调函数

收发回调函数

void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)

收数据回调函数(可选)

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)

发数据回调函数(可选)

void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
有点乱对不对,实际就都只用第一个就好了,传数的时候同时进行收发,那么回调就只要重写收发回调函数,其它4个不用理它,我们的主要数据收发工作就在这个回调函数中了。如果硬要用其它那几个,那么就要一一对应着用,用了收就要写收数据回调,否测它是不会跳去收发数据回调的。发送数据同样的。
回到我们的应用中来,因为我用的是中断方式,HAL库中要我们干两件事:

  1. 重写它的回调函数;
  2. 在初始化完SPI的时候调用一次HAL_SPI_TransmitReceive_IT();
    好了,我们看代码:
// SPI先发生一次调用,把00放入缓冲区,待主机来取
void SPI1_init_IT(void)
{cmd_flag = false;cmd = 0;memset(spi_txbuff,0,32);memset(spi_rxbuff,0,32);HAL_SPI_TransmitReceive_IT(&hspi1,spi_txbuff,spi_rxbuff,1);
}

初始化完SPI接口后,进行一次收发调用,这个函数是不阻塞的,但是数据已经放到缓冲区了,因为从机没有SPI时钟,所以这里数据是不会立刻传给主机的,只有等主机来通讯的时候,这1个字节才会送到主机的接叫缓冲区中,也就是说,这里的数据,将在下次通讯的时候发送出去。
这里长度可以是任意,因为我打算只1个传个标志,让主机知道接口正常所以就是个0,
再看回调函数

// SPI收发回调函数,收发结束回调到这里,因为实际是在中断里的,所以快速操作早点结束
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{double rx = 3.1415926;// 暂时只处理spi1的if(hspi==&hspi1){// 如果逻辑简单,就在这里处理收到的数据,数据会自动存在spi_rxbuff中,也就是你上次调用// HAL_SPI_TransmitReceive_IT 的时候指定的缓冲区中。// 如果逻辑复杂,就设置一个标志,再到主循环中去处理,当然,如果有跑操作系统,就去相应的任务中处理// 在这里,我们要传一个double型的数给Master端,stm32里面,它是8个字节的;HAL_SPI_TransmitReceive_IT(&hspi1, (uint8_t *)&rx, spi_rxbuff,sizeof(double));}
}

这里只发一个double型的数,PI回去。那么Master端要怎么做?

  1. 第一步,发一个字节的数据;[这个是用来占位的,把我们在初始化中那个字节用掉]
  2. 第二步,可以开始循环读8个字节来转回double型了
  3. 或者想干嘛干嘛,两边要统一就行。I am The King in this World!

总结

总体来说,没用的时候感觉很没方向,没注意spi的特点。其实在HAL库中它已经很好用了。

STM32的HAL库SPI操作(Slave模式)相关推荐

  1. 【STM32】HAL库 SPI DMA UART驱动开发

    零.瞎BB一些 最近真的是.....过得...些许艰难... 从实习到正式入职,在公司的项目组待了3个月左右了,同事.项目.代码.逻辑.架构都熟悉了,毕业后入职1个月的时间里,能给项目组改了几个bug ...

  2. 【STM32】HAL库-电源控制(低功耗模式)

    电源框图 STM32 的电源系统主要分为备份域电路.内核电路以及 ADC 电路三部分 备份域电路 STM32 的 LSE 振荡器.RTC.备份寄存器及备份 SRAM 这些器件被包含进备份域电路中,这部 ...

  3. 【STM32】HAL库 STM32CubeMX教程十四---SPI

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需 ...

  4. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  5. 【STM32笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)

    [STM32笔记]HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒.串口唤醒和回调无法一起使用.接收数据不全的问题) [STM32笔记]低功耗模式配置及避坑汇总 前文: blog.csd ...

  6. stm32 HAL库 Flash操作简介

    stm32 HAL库 Flash操作简介 目录 第一stm32,flash介绍 查看代码段,以判断代码长度 flash的基本操作规则 stm32 HAL库 Flash操作指南 stm32f1xx_ha ...

  7. 【STM32】HAL库 STM32CubeMX教程十二---IIC(读取AT24C02 )

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用. 但是 ...

  8. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(一)

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 本文 1首先讲解什么是FMC及SDRAM,W9825G6KH芯片原理,2基于CubeMx创建工程 ...

  9. 【STM32】HAL库 STM32CubeMX教程十一---DMA (串口DMA发送接收)

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

最新文章

  1. 如何做好网站开发项目需求分析(转)
  2. Linux扫盲篇:CentOS、Ubuntu、Gento
  3. python画一颗心_利用python画一颗心的方法示例
  4. response.setHeader各种用法 .
  5. idea启动前端vue项目(各种坑)
  6. 技术干货 | 应用上线前的“体检”,你知道需要检测哪些指标吗?
  7. java中catalina.out_catalina.out 和 catalina.log 的区别和用途
  8. 2021-2025年中国电器行业市场供需与战略研究报告
  9. Cesium:去除原生自带右上角弹窗
  10. Unity简单操作:Unity资源商店 Asset store下载文件夹的位置
  11. python超清壁纸_Python爬取5K分辨率超清唯美壁纸
  12. C语言4位BCD码加法器,四位二进制8421BCD码加法器
  13. 搜索引擎工作原理解析
  14. 手把手教你怎么从微软官方下载 Windos10 正版镜像
  15. python3注册全局热键
  16. java宠物之王-龙灵传说_宠物之王龙灵传说闯关秘籍
  17. 利用springMVC实现购物车结算功能
  18. Tensorflow+gensim实现文章自动审核功能
  19. mysql 中启动服务的命令 、登录命令、退出命令 mysql 的常用命令
  20. linux卡住重启_linux死机解决办法

热门文章

  1. c.k是怎样的一个人
  2. lib/libSciCamera.so: file not recognized: file format not recognized
  3. 苹果M1「徒有其表」?「地表最强」芯只能剪视频引知乎热议
  4. 排序算法时间复杂度的记忆方法
  5. 【soft6星评论】华兴源创成为科创板第一股
  6. c语言中assert函数,assert()函数用法总结
  7. 机器生成小说的可行性探索
  8. 腾讯视频 Python 爬虫项目实战 !
  9. 如何快速将访客模式快速恢复成管理员模式?
  10. 如何在线一键生成GIF表情包?三步完成mp4视频转gif