简介
1.单片机型号:STM32L431RCT6
2.方式:硬件上的回环测试
3.使用软件:CubeIDE
一、 软件配置
1.硬件原理图
通过原理图我们可以看出对于我们较为重要的四个管脚为:PA15、PC10、PC11、PC12;下面来配置这四个管脚
1.1 SPI协议配置
接下来配置一些参数
注意:
1.Data Size 要选择8bits,要不然会出现 收发数据不一致的情况(笔者最开始设置的就是4bit然后出现了收发不一致困扰了我整整两天),选择8bit的原因是在多种协议和传感器中,8 位数据帧是标准格式。例如,许多传感器和显示器模块也采用 8 位数据帧进行通信。当然在一些特殊场合下也可以选择其他大小进行传输。
2.注意哦,我们的NSS SignalType选择了软件,所以等下我们要自己进行配置CS片选信号哦。
1.2 片选信号配置
由原理图我们可以看到PA15为片选信号,我们首先要将他配置成输出模式
上面刚刚提到了要对其进行软件选择(片选信号低电平时有效)
#define CS_PIN GPIO_PIN_15
#define CS_PORT GPIOA
#define cs_low() HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_RESET)
#define cs_high() HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_SET)
二、代码处理
1.生成的代码
配置完成后,便可自动生成代码,下面是初始化spi3生成的一些代码,是对我们刚刚配置的做出的一些具体解释
void MX_SPI3_Init(void)
{
/* USER CODE BEGIN SPI3_Init 0 */
/* USER CODE END SPI3_Init 0 */
/* USER CODE BEGIN SPI3_Init 1 */
/* USER CODE END SPI3_Init 1 */
hspi3.Instance = SPI3;
hspi3.Init.Mode = SPI_MODE_MASTER;
hspi3.Init.Direction = SPI_DIRECTION_2LINES;
hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi3.Init.NSS = SPI_NSS_SOFT;
hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi3.Init.CRCPolynomial = 7;
hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
if (HAL_SPI_Init(&hspi3) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI3_Init 2 */
/* USER CODE END SPI3_Init 2 */
}
不做过多展示
2. 我们需要添加的代码
在进行通信之前我们需要知道大概的通信过程,简言之就是 拉低片选信号->发送数据、接收数据->通信结束,拉高片选信号
创建一个spi3_flash.c1,添加代码
#include "main.h"
#include "spi.h"
#include "usart.h"
#include "gpio.h"
#include <stdio.h>
#include "spi3_flash.h"
#define Dummy_Byte 0xff
#define SPI_TIMEOUT 1000 // 设置超时为 1000 毫秒
uint8_t SPI_FLASH_Sendbyte(uint8_t byte)
{
uint8_t r_data = 0;
HAL_StatusTypeDef status = HAL_SPI_TransmitReceive(&hspi3, &byte, &r_data, 1, SPI_TIMEOUT);
printf("Sent: 0x%02X, Received: 0x%02X, Status: %d\n", byte, r_data, status);
return r_data;
}
uint8_t SPI1_FLASH_Readbyte(void)
{
uint8_t t_data = Dummy_Byte; // 发送一个 Dummy_Byte
uint8_t r_data = 0;
HAL_StatusTypeDef status = HAL_SPI_TransmitReceive(&hspi3, &t_data, &r_data, 1, SPI_TIMEOUT);
printf("Sent: 0x%02X, Received: 0x%02X, Status: %d\n", t_data, r_data, status);
return r_data;
}
在main.c中做如下修改:
uint8_t sentData, receivedData;
sentData = 0x55;
cs_low();
SPI_FLASH_Sendbyte(sentData);
cs_high();
cs_low();
receivedData = SPI1_FLASH_Readbyte();
cs_high();
printf("Sent data: 0x%02X, Received data: 0x%02X\n", sentData, receivedData);
三、运行结果
如果有问题,欢迎各位和笔者私下交流哦