当前位置:   article > 正文

STM32 通过HAL库实现双机SPI程序烧录之一SPI双机通信_hal_spi_receive_it

hal_spi_receive_it

 一、实现SPI双机通信

主要功能:STM32F407VET6作为主机,STM32F103ZET6作为从机实现F4通过SPI接口发送数据给F1进行串口打印功能

主要是使用STM32cubemx进行相关配置(使用这个软件不能只用于生成代码,要学会读懂生成的每一句代码这样才方便后期调试,不然出现问题根本找不到)

二、主机F4相关配置

1、配置SYS

选择Serial Waire进行调试(通常都选这个)

2、配置RCC

3、配置串口

配置波特率(并未开启串口中断,不需要使用) 

串口重定向(方便使用printf进行打印,这里我添加在usart.c文件夹下)

  1. #include "usart.h"
  2. /* USER CODE BEGIN 0 */
  3. #include "stdio.h"
  4. struct __FILE
  5. {
  6. int handle;
  7. };
  8. FILE __stdout;
  9. //定义_sys_exit()以避免使用半主机模式
  10. void _sys_exit(int x)
  11. {
  12. x = x;
  13. }
  14. //重定义fputc函数
  15. int fputc(int ch, FILE *f)
  16. {
  17. while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
  18. USART1->DR=(uint8_t)ch;
  19. return ch;
  20. }
  21. /* USER CODE END 0 */
  22. UART_HandleTypeDef huart1;
  23. /* USART1 init function */

4、配置SPI接口

配置模式未主机模式,开启NSS位进行片选(可以增加稳定性)

IO端口:

注:注意SPI的极性和相位要和从机保持一致

5、配置时钟树

直接选择最大即可

6、代码部分

在while循环直接添加

  1. uint8_t data[5] = {0x00,0x11,0x22,0x33,0x44};
  2. for(int i=0; i<fnum;i++)
  3. {
  4. HAL_SPI_Transmit_DMA(&hspi1,&ReadBuffer[i],1);
  5. HAL_Delay(1);
  6. }

至此,F4部分基本配置完成,接下来才是重点!!

三、从机F1相关配置

1、配置SYS

同上

2、配置RCC

同上

3、配置串口

同上

4、SPI配置

选择从机模式,输入片选,以及极性和相位

5、开启SPI中断相关

开启SPI中断,从机主要是采取中断的方式进行接收

6、时钟树配置

 同意配置最大即可

 生成代码,进入代码内部进行编写

7、修改中断函数

在stm32f1xx_it.c文件下找到SPI2_IRQHandler添加一下内容及开启中断重复接收

  1. /**
  2. * @brief This function handles SPI2 global interrupt.
  3. */
  4. void SPI2_IRQHandler(void)
  5. {
  6. /* USER CODE BEGIN SPI2_IRQn 0 */
  7. /* USER CODE END SPI2_IRQn 0 */
  8. HAL_SPI_IRQHandler(&hspi2);
  9. /* USER CODE BEGIN SPI2_IRQn 1 */
  10. while(HAL_SPI_Receive_IT(&hspi2,(uint8_t *)spi_buffer, RXBUFFERSIZE) != HAL_OK)
  11. {
  12. }
  13. /* USER CODE END SPI2_IRQn 1 */
  14. }

编写中断回调函数

 添加在stm32f1xx_it.c最后即可

  1. void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef* spiHandle)
  2. {
  3. if(spiHandle->Instance == SPI2)
  4. {
  5. if(spi_rx_cnt < SPI_REC_LEN)
  6. {
  7. ReadBuffer[spi_rx_cnt] = spi_buffer[0];
  8. spi_rx_cnt++;
  9. printf("buffer: 0x%x\r\n",spi_buffer[0]);
  10. }
  11. }
  12. }

8、主函数添加

HAL_SPI_Receive_IT(&hspi2,(uint8_t *)spi_buffer, RXBUFFERSIZE);

至此从机相关也编写完毕,在SPI回调函数中,会打印接收到的内容如下:

 出现已下现象即可表明通信成功!!!完成了SPI双机烧录的第一步,下一章讲讲解STM32从SD卡读取bin文件并通过SPI接口发送给从机

需要源代码的请留言,创造不易欢迎点赞收藏,感谢支持

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/50737
推荐阅读
相关标签
  

闽ICP备14008679号