Cubemx配置STM32与PC进行SPI协议收发实例以及逻辑分析仪的简单使用

引言

从上一篇文章发布已经过了3个月了,期间一直在准备面试,上个月初,新工作也找到了,准备去一家上市公司,下周入职,期间租房,看房,搬家花了很多时间,再加上五一又被封了1周,这周开始正式投入工作。
这个项目是在老公司的最后一个项目(尽量把上个公司的东西做完,好聚好散),为某军队做的一个射频组件,我负责配置其中锁相环以及数控衰减器的控制工作,以及单片机与上位机的SPI通信,在这篇文章中,我会详细讲一下如何使用Cubemx工具配置SPI协议(包括主机与从机)以及一款逻辑分析仪的使用方法。

Cubemx配置SPI协议

在SPI协议之前,使用串口比较多一些,因为电脑没有SPI接口,因此需要使用电路板进行转换,在网上查了很多转接板,大概思路都是在转接板上再搭载一个单片机,这样就变成了STM32的SPI与转接板的单片机进行SPI通信,转接板上的单片机再把数据通过串口用USB输入到电脑的上位机中(这里的转接板与上位机必须要是一一对应的,因为要通过上位机向转接板上的单片机配置东西)在这里推荐一款我用的(不是广告),感觉还可以
在这里插入图片描述

单片机做主机模式,向上位机中发数据

在这里插入图片描述

int main(void)
{
  /* USER CODE BEGIN 1 */
  uint8_t printData[] = {0X55,0X05};
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_SPI1_Init();
  MX_SPI2_Init();
  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    #if 1
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);

    if(HAL_SPI_Transmit(&hspi2,printData,1,1000) == HAL_OK) //发送用这个函数就行
      printf("send seccess!!!\n");
    
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
    #endif
	HAL_Delay(500);
  }
  /* USER CODE END 3 */
}

整个过程没有什么好说的,配置好后,调用HAL_SPI_Transmit()这个函数就行,要注意的是片选信号默认为高电平,发送数据的时候,要先拉低片选,发送完后,再拉高片选。
在这里插入图片描述
上位机能够接收到数据,上位机的操作,卖家的pdf写的很详细,我这里只演示。

单片机做从机模式,上位机向STM32单片机发数据

在这里插入图片描述
main.c文件


/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "spi.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE BEGIN PV */
uint8_t receive[1];
uint8_t receBuff[4096];
uint8_t RX_STA = 0;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
   if(hspi->Instance==SPI1)
  {
    receBuff[RX_STA] = receive[0];
    RX_STA++;
  }
  printf("success into receive it\n"); 
}

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
  uint8_t printData[] = {0X55,0X05};
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_SPI1_Init();
  MX_SPI2_Init();
  /* USER CODE BEGIN 2 */
  HAL_SPI_Receive_IT(&hspi1, receive, 1); //打开接收中断
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

    for(int i = 0; i <= RX_STA; i++)
      printf("%x\n",receBuff[i]);
    
		HAL_Delay(500);
  }
  /* USER CODE END 3 */
}

然后还需要在stm32f1xx_it.c文件中,添加

void SPI1_IRQHandler(void)
{
  /* USER CODE BEGIN SPI1_IRQn 0 */

  /* USER CODE END SPI1_IRQn 0 */
  HAL_SPI_IRQHandler(&hspi1);
  /* USER CODE BEGIN SPI1_IRQn 1 */
  HAL_SPI_Receive_IT(&hspi1, receive, 1);
  /* USER CODE END SPI1_IRQn 1 */
}

这样就可以触发接收中断了
在这里插入图片描述
使用串口助手,发现成功接收到了22
在这里插入图片描述
这样SPI的接收与发送就做完了。

逻辑分析仪的使用方法

做嵌入式,特别是通信协议的时候,看波形是必备的,可以方便排查问题,在这个项目中我还买了一个逻辑分析仪20多块钱,很好用(做测试的时候,最好买几个测试夹子)
在这里插入图片描述
然后能够很轻松的看波形
在这里插入图片描述
使用方法,卖家资料很全我就不赘述了,然后自己写的时序也能方便的与仪器的时序图进行对应
在这里插入图片描述
在这里插入图片描述

总结

到这里,单片机的SPI通信基本讲完了,希望自己的技术能够继续进步,在下个岗位上继续发光发热,我觉得嵌入式这个方向还是可以的,虽然比不上互联网,但是对比其他工科行业还是挺有优势的(除了垄断国企,同学在烟草太爽了),嵌入式的应用面很广,各种智能化设备,汽车制造,芯片配套,好好干钱还是可以的,继续加油!

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值