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