提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
@[TOC]SPI通信
前言
在自身学习时查找资料,没有一个系统的在RT中实现spi并测试的,都是进行ID的读写简单操作,因此在学习完后准备记录系统的一个学习spi的过程,配有详细源码,看完包会!!!结合自身学习一步步成功实现spi在w25qxx读写测试
- 首先讲解spi通信协议
- rt_thread中配置spi
- w25q128内存结构与命令
- spi在w25q128中的使用
-
**测试成功结果
**`
一、SPI通信协议
SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步通信总线,常用于短距离通讯,主要应用于 EEPROM、FLASH、实时时钟、AD 转换器、还有数字信号处理器和数字信号解码器之间。SPI 一般使用 4 根线通信,如下图所示:
-
MOSI –主机输出 / 从机输入数据线(SPI Bus Master Output/Slave Input)。
-
MISO –主机输入 / 从机输出数据线(SPI Bus Master Input/Slave Output)。
-
SCLK –串行时钟线(Serial Clock),主设备输出时钟信号至从设备。
-
CS –从设备选择线 (Chip select)。也叫 SS、CSB、CSN、EN 等,主设备输出片选信号至从设备。
主设备通过控制 CS 引脚对从设备进行片选,一般为低电平有效。任何时刻,一个 SPI 主设备上只有一个 CS 引脚处于有效状态,与该有效 CS 引脚连接的从设备此时可以与主设备通信。 -
SPI 的传输方式: SPI 总线具有三种传输方式:全双工、单工以及半双工传输方式。
– 全双工通信: 在任何时刻,主机与从机之间都可以同时进行数据的发送和接收。
– 单工通信: 在同一时刻,只有一个传输的方向,发送或者是接收。
– 半双工通信: 在同一时刻,只能为一个方向传输数据。 -
spi工作模式
二、 rt_thread中配置spi
1. spi1总线开放出来
-
STEP 1, open qspi driver framework support in the RT-Thread Settings file
– 在rt_thread的setting中打开spi -
STEP 2, define macro related to the qspisuch as
#define BSP_USING_QSPI
– 在board.h文件中spi打开宏定义文章来源:https://www.toymoban.com/news/detail-795503.html -
STEP 3, copy your qspi init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the end of board.c file such as
void HAL_QSPI_MspInit(QSPI_HandleTypeDef* hqspi)
– 在Cubmax中配置void HAL_SPI_MspInit(SPI_HandleTypeDef hspi)*文章来源地址https://www.toymoban.com/news/detail-795503.html
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
GPIO_InitTypeDef GPIO_InitStruct = {
0};
if(hspi->Instance==SPI1)
{
/* USER CODE BEGIN SPI1_MspInit 0 */
/* USER CODE END SPI1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_SPI1_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**SPI1 GPIO Configuration
PB3 ------> SPI1_SCK
PB4 ------> SPI1_MISO
PB5 ------> SPI1_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN SPI1_MspInit 1 */
/* USER CODE END SPI1_MspInit 1 */
}
}
- STEP 4, modify your stm32xxxx_hal_config.h file to support qspi peripherals. define macro related to the peripherals such as
#define HAL_QSPI_MODULE_ENABLED
– 在stm32xxxx_hal_config.h
文件中打开#define HAL_QSPI_MODULE_ENABLED
宏定义
2. 设备"spi10"挂载到spi1总线上
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include "W25Q128.h"
struct rt_spi_device *spi_dev;
int w25q_spi_device_init(void)
{
struct rt_spi_configuration cfg;
__HAL_RCC_GPIOB_CLK_ENABLE();
//先把设备挂载到总线上
rt_hw_spi_device_attach("spi1", W25Q_SPI_DEVICE_NAME, GPIOB, GPIO_PIN_14);
//查找设备
spi_dev = rt_device_find(W25Q_SPI_DEVICE_NAME);
cfg.data_width=8;
cfg.mode=RT_SPI_MASTER|RT_SPI_MODE_0|RT_SPI_MSB;
cfg.max_hz= 20 * 1000 *1000; /* 20M */
到了这里,关于全网最详细STM32在RT_thread中配置spi并成功使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!