如何采用STM32单片机实现SPI的驱动

发布者:快乐舞步最新更新时间:2024-04-22 来源: elecfans关键字:STM32  单片机  SPI  驱动 手机看文章 扫描二维码
随时随地手机看文章

前言:每学一个新知识,都会出现很多出错的情况,百度也查不出来,耗费很多时间,主要是不理解底层原理,没太多时间去理解,催得紧。SPI嘛,是人都知道干嘛用的,我一时半会也不知道怎么表达,百度最不缺的就是定义。缺的是实现过程,本少爷花了几十个积分搞了n多个实例,终于总结了要成功实现SPI要哪些奇葩的步骤。

如何采用STM32单片机实现SPI的驱动

正文:

---------------------------------------------配置SPI1的时钟------------------------------------

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE); //SPI1初始化

//RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);//用F0时,方法调错但不报错,搞了一天

---------------------------------------------配置GPIO------------------------------------

//用的PA4567,分别是片选,时钟,复位,MOSI,抱歉MISO当io口作复位了,不能触摸的显示屏,没卵用

//LCD显示屏涉及到DC,低电平发命令,高电平发数据

配置一下GPIO,都是50MHZ的,据说SPI的都是50,除了SCK和SDI(MOSI)是AF_PP,其他都是OUT_PP

因为硬件SPI和模拟SPI的主要区别就在于SCK和MOSI,一个方法帮你搞定了,简直嗨翻天

//DC Data/Command PB1

//CS 片选 PA4

//SCK 时钟 PA5

//REST 复位 PA6

//SDI 数据 PA7

是人都会配了,不会配的也不会学SPI了

---------------------------------------------配置SPI1------------------------------------

//重头戏

void SPI_cfg(void){

SPI_InitTypeDef SPI_InitStructure;

//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工

SPI_InitStructure.SPI_Direction =SPI_Direction_1Line_Tx; //少爷我只要输出

//设置SPI工作模式:设置为主SPI

SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

//设置SPI的数据大小:SPI发送接收8位帧结构

SPI_InitStructure.SPI_DataSize =SPI_DataSize_8b; //8位够了,16位不会用

//串行同步时钟的空闲状态为di电平

SPI_InitStructure.SPI_CPOL =SPI_CPOL_Low; //时序图说是低电平

//串行同步时钟的第1个跳变沿(上升或下降)数据被采样

SPI_InitStructure.SPI_CPHA =SPI_CPHA_1Edge; //时序图显示高电平采样

//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //不知有啥用

//定义波特率预分频的值:波特率预分频值为8

SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_8; //2到256,越低越快

//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //不知有啥用

//CRC值计算的多项式

SPI_InitStructure.SPI_CRCPolynomial = 7; //不知有啥用

//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

SPI_Init(SPI1, &SPI_InitStructure);

//使能SPI外设

SPI_Cmd(SPI1, ENABLE);

}

---------------------------------------------LCD里的发送命令的方法------------------------------------

//LCD里头还有很多清屏,显示图片汉字的方法,跟SPI没关系,不贴了

功能:液晶写入1字节数据

参数:u8 data

void LCD_WR_DATA8(uint8_t data)

{

LCD_CS_L; //片选低,使能有效

LCD_DC_H; //DC拉高传数据

SPI_I2S_SendData(SPI1, data);//这句话直接省去了我用for循环一个个移位发数据,爽到爆

while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//感觉有木有都一样,有放在前面的有放在后面的,只知道少了它的话,本来刷屏是蓝色,会变成别的颜色

Delay(1);//被这个延时害惨了,1天找不到错误,就因为没他,1到100都行,但是一少就出错。

Delay(1);//被这个延时害惨了,1天找不到错误,就因为没他,1到100都行,但是一少就出错。

Delay(1);//被这个延时害惨了,1天找不到错误,就因为没他,1到100都行,但是一少就出错。

(说三遍)

LCD_CS_H; //片选高,使能失效

}

结束语:出错都因为delay,不明觉厉

自己完成SPI之后,学到了很多说不出的知识。

好多句子不知道有什么用,都是一次次试的。


关键字:STM32  单片机  SPI  驱动 引用地址:如何采用STM32单片机实现SPI的驱动

上一篇:STM32单片机对Systick心跳定时器的设计
下一篇:基于STM32F4x9的LCD显示系统架构设计

推荐阅读最新更新时间:2026-03-23 10:49

STM32入门开发:编写XPT2046电阻触摸屏驱动(模拟SPI)
一、环境介绍 单片机采用: STM32F103ZET6 编程软件: keil5 编程语言: C语言 编程风格: 寄存器开发. 目标芯片: XPT2046---标准SPI接口时序 二、XPT2046芯片介绍 2.1 功能 XPT2046是一颗12位的ADC芯片,可以当做普通的ADC芯片使用,但是一般都是用在电阻触摸屏上,方便定位触摸屏坐标。 图1: XPT2046内部原理图 图2:电阻触摸屏---引出的4条线就接在XPT2046的YNXNYPXP上 (XPT2046支持笔中断输出--低电平有效,这个引脚可以配置到单片机的中断脚上,或者轮询判断这个引脚状态,判断触摸屏是否已经按下) 可以单独买一个触
[单片机]
<font color='red'>STM32</font>入门开发:编写XPT2046电阻触摸屏<font color='red'>驱动</font>(模拟<font color='red'>SPI</font>)
WS2812灯珠(二)-- STM32 SPI+DMA方式驱动
通过硬件SPI的可以很巧妙的模拟出WS2812的通信时序,用spi的8位数据模拟ws281x的一位数据。 要将系统时钟设置为56M,SPI分频数设置为8,则SPI的通信频率为7M,1s/7M≈143ns 即传输一位数据的时间约为143纳秒(ns) 3*143 = 429ns 5*143 = 715ns 符合WS281X芯片的通信时序。 11111000 high level (十六进制:0XF8)表示WS281X的1码 11100000 low level (十六进制:0XE0)表示WS281X的0码 程序头文件部分: 通过宏的方式定义了灯珠个数和WS281X的0码和1码。 #ifndef __WS2812_
[单片机]
STM32:SPI驱动ADXL345
ADXL345为3轴数字加速度计。支持SPI或I2C访问。网上例子大多是I2C,这里使用4线SPI。 一、遇过的坑 调试过程花了几个小时,遇到一些小坑。 1.开始的时候,无论如何都无法读取芯片ID。这可是最基础的一步啊,SPI,I2C都试过。无奈之下,对照原理图与手册的管脚说明,发现Vs接到地了。其实这个管脚要接电源电压。老实说,一看名字还以为要接地,毕竟一般IC接地脚名字为Vss。让硬件工程师飞线修改。终于可以进行通信了。 2.发现数据跳动比较大。静止放置,也会出现很大的数据波动。看上去并不是噪声导致的。最后发现手册上对SPI速率与输出数据速率的相关性。重新修改SPI速率,输出数据终于稳定多了,再加上软件滤波,终于满
[单片机]
<font color='red'>STM32</font>:<font color='red'>SPI</font><font color='red'>驱动</font>ADXL345
STM32硬件SPI驱动0.96寸的OLED
1.OLED相关 参见—- 51 软件模拟SPI驱动OLED 2.硬件SPI 参见—- SPI专题(二)——STM32驱动FLASH(W25Q64) 3.驱动程序 驱动程序参照51单片机进行移植,只不过模拟的SPI换成STM32硬件SPI,不用再写时序部分的代码。对于STM32的硬件SPI,我们在驱动FLASH中已有介绍,这里就不再做介绍。 OLED引脚部分定义: #ifndef __OLED_H #define __OLED_H #include spi.h #include stm32f10x.h #include stm32f10x_conf.h #define Max_Column
[单片机]
STM32 软件模拟SPI时序驱动NRF24L01
其实stm32本身的硬件SPI也很好用,但是还是想用软件来模拟一下PSI的时序。 SPI 是一种高速的,全双工,同步串行的通信总线。SPI通信方式相当于是一个环形结构,由CSN、MISO、MOSI、SCLK四线组成,主要是在SCLK时钟线的驱动下,进行数据转换。 接下来直接上程序配置: 使用32模拟SPI时序的IO口配置,应该注意的是MISO应该选择模拟输入方式GPIO_Mode_IN_FLOATING。 以下是我的初始化部分: /*用于软件模拟SPI IO口宏定义区*/#define SPI_CS_PORT GPIOB#define SPI_CS_PIN GPIO_Pin_11#define SPI_CS_LOW
[单片机]
<font color='red'>STM32</font> 软件模拟<font color='red'>SPI</font>时序<font color='red'>驱动</font>NRF24L01
STM32微控制器SPI接口NSS管理分析
看了很多关于NSS片选信号配置的资料,感觉没有说清楚的,自己写了一些个人的看法,希望对大家有用。 首先看我们看下NSS的结构图,如下。 从上图中我们可以看出左边的NSS代表硬件的引脚,右边的internalnss是内部NSS,微处理器根据这个内部的NSS来确定不同的操作。 和NSS相关的寄存器标志位主要是SSM、SSI以及SSOE。SSM用来配置是硬件模式还是软件模式。SSI用来确定在软件模式下NSS输入的极性,SSOE用来决定是否允许内部NSS信号送出的NSS引脚上。 对NSS的管理有硬件模式和软件模式之分,所谓硬件模式(SSM=0,二选一处0端有效),就是内部NSS的信号来自于外部NSS引脚,是确确实实的硬东西(引脚)
[单片机]
<font color='red'>STM32</font><font color='red'>微控制器</font><font color='red'>SPI</font>接口NSS管理分析
通过优化单片机SPI驱动程序提高ADC吞吐量
在嵌入式系统中,使用单片机(MCU)通过SPI(Serial Peripheral Interface)接口与ADC(模拟到数字转换器)通信时,优化SPI驱动程序以提高ADC的吞吐量是一个重要的任务。以下是一些关键步骤和策略,可以帮助你实现这一目标: 1. 理解SPI协议和ADC要求 SPI协议:确保你完全理解SPI的时钟相位(CPHA)、时钟极性(CPOL)、数据位(通常是8位或更多)、以及帧格式(如是否使用起始位和停止位)。 ADC要求:了解ADC的转换速率、数据格式(如单端、差分输入)、分辨率(如8位、12位、16位等)以及是否需要额外的命令来启动转换。 2. 优化SPI时钟频率 时钟频率:在ADC和MCU的SPI接口允许的
[单片机]
STC8单片机OLED通过SPI硬件中断方式驱动(中)
前面的已经说了如何去初始化SPI了,接下来说说发送函数,先上代码 void OLED_Writ_Bus(uint8_t _data) { Delay20us(); if (SPI_Busy == 0) { SPI_Busy = 1; OLED_CS_Clr(); SPDAT = _data; } } SPI_Busy是一个状态机,判断SPI是否在忙碌,在OLED的例程中已经是软件模拟SPI,模拟的时钟跟不上硬件的速度,所以我们只需要稍加就该,把软件的模拟更换成硬件驱动就完事了,看看两者的速度差,软件模拟在400k左右,硬件驱动(中断)能达到3M左右,轮询在1M左右,拉低CS(SS)
[单片机]
STC8<font color='red'>单片机</font>OLED通过<font color='red'>SPI</font>硬件中断方式<font color='red'>驱动</font>(中)
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved