SPI协议硬件回环测试

简介

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);

三、运行结果

 

 

 如果有问题,欢迎各位和笔者私下交流哦

 

 

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值