STM32 学习笔记--SPI通信配置

SPI时序

SPI时序图如下:

这里写图片描述

STM32做为主机设计SPI时序一般选用CPOL=1/CPHA=1;

SPI通信配置

1、时钟使能。GPIO时钟使能RCC->APB2ENR,SPI时钟使能RCC->APB2ENR设置。
(为什么还要连接GPIO时钟,参见STM32参考手册8.1.4节。手册上这么说的:对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。)

2、配置GPIO工作模式。配置GPIO片选,由软件管理(即自定义引脚),推挽输出,上拉;
配置SPI引脚SCK、MOSI、MISO所用到的引脚为复用功能;GPIOX->CR1 GPIOX->ODR;

3、SPI设置工作模式。通过配置SPIx->CR1来设置SPI 的工作模式。配置工作模式为全双工,主机模式,SCK闲时电平为高,第二个时钟沿(上升沿)采样数据,内部从机选择软件管理模式。设置SPI的时钟频率(最大18MHZ),设置数据格式(MSB在前还是LSB在后),内部从机选择设置为主机(置1)。
这里写图片描述

这里写图片描述

4、使能SPI,启动传输。

5,因为SPI是同步输入输出的,在发送数据的时候已经在接受数据。通过检测SPIx->SR第一位的状态来决定要进行发送和接受数据。通过读取SPIx->DR位的来发送和接受数据。
SPIx->SR寄存器图:
这里写图片描述
SPIx->DR寄存器图
这里写图片描述

程序如下:

#include "spi.h"                  
//SPI口初始化
//这里针是对SPI1的初始化
void SPI1_Init(void)
{    
    RCC->APB2ENR|=1<<2;       //PORTA时钟使能    
    RCC->APB2ENR|=1<<12;      //SPI1时钟使能 

    //这里只针对SPI口初始化
    GPIOA->CRL&=0X000FFFFF; 
    GPIOA->CRL|=0XBBB00000;//PA5.6.7复用      
    GPIOA->ODR|=0X7<<5;    //PA5.6.7上拉

    //这里只针对SPI——CS口初始化
    GPIOA->CRL&=0XFFFFF0FF; 
    GPIOA->CRL|=0X00000300;//PA2推挽输出        
    GPIOA->ODR|=1<<2;    //PA2上拉

    SPI1->CR1|=0<<10;//全双工模式    
    SPI1->CR1|=1<<9; //软件nss管理
    SPI1->CR1|=1<<8;  

    SPI1->CR1|=1<<2; //SPI主机
    SPI1->CR1|=0<<11;//8bit数据格式 
    SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
    SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1  
    SPI1->CR1|=7<<3; //Fsck=Fcpu/256
    SPI1->CR1|=0<<7; //MSBfirst   
    SPI1->CR1|=1<<6; //SPI设备使能
    SPI1_ReadWriteByte(0xff);//启动传输(主要作用:维持MOSI为高)       
}   
//SPI1 速度设置函数
//SpeedSet:0~7
//SPI速度=fAPB2/2^(SpeedSet+1)
//APB2时钟一般为72Mhz
void SPI1_SetSpeed(u8 SpeedSet)
{
    SpeedSet&=0X07;         //限制范围
    SPI1->CR1&=0XFFC7; 
    SPI1->CR1|=SpeedSet<<3; //设置SPI1速度  
    SPI1->CR1|=1<<6;        //SPI设备使能 
} 
//SPI1 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)
{       
    u16 retry=0;                 
    while((SPI1->SR&1<<1)==0)//等待发送区空   
    {
        retry++;
        if(retry>0XFFFE)return 0;
    }             
    SPI1->DR=TxData;          //发送一个byte    
     retry=0;                
    while((SPI1->SR&1<<0)==0) //等待接收完一个byte  
    {
        retry++;
        if(retry>0XFFFE)return 0;
    }                               
    return SPI1->DR;          //返回收到的数据 
}
### STM32 使用 OLED 显示屏的学习笔记与教程 #### 关于 STM32 和 OLED 的基础知识 STM32 是一种基于 ARM Cortex-M 架构的微控制器系列,广泛应用于嵌入式开发领域。OLED(有机发光二极管)显示屏因其高对比度、低功耗等特点,在许多项目中被用作显示设备。为了实现 STM32 对 OLED 屏幕的支持,通常需要完成硬件连接以及软件驱动程序的设计。 以下是有关 STM32 驱动 OLED 显示屏的一些关键知识点: #### 硬件连接方式 在 STM32 中,OLED 通常通过 IIC(I²C)、SPI 或 UART 接口进行通信。其中最常见的是 IIC 协议,因为它只需要两根线即可完成数据传输,简化了硬件设计[^1]。具体的硬件连接方法可以参考实际使用的模块手册或相关文档。 #### 软件初始化过程 对于 STM32 来说,使用 OLED 显示屏的第一步是对屏幕进行初始化配置。这一步骤包括设置通信协议参数、定义屏幕分辨率以及其他必要的寄存器操作。以下是一个简单的初始化代码示例: ```c #include "stm32f10x.h" #include "OLED.h" int main() { SystemInit(); // 初始化系统时钟 OLED_Init(); // 初始化 OLED 模块 while (1) { OLED_ShowString(2, 1, "Hello"); // 在第 2 行第 1 列显示字符串 "Hello"[^3] } } ``` 上述代码展示了如何调用 `OLED_Init()` 函数来启动 OLED 并利用 `OLED_ShowString` 方法向屏幕上写入文字信息。 #### 数据打印至 OLED 屏幕 如果希望将来自串口的数据实时展示到 OLED 上,则需编写额外的功能逻辑处理接收到的信息并将其传递给 OLED 控制接口。例如,可以通过中断服务例程捕获串口输入流,并逐字符绘制到指定位置上[^2]。 #### 进阶功能扩展 除了基本的文字输出外,还可以尝试实现更复杂的图形化界面效果,比如加载位图图像或者支持多语言字体渲染等功能。这些都需要深入理解底层库文件结构及其 API 定义说明。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值