历史上的今天
今天是:2025年04月25日(星期五)
2020年04月25日 | STM32 SPI笔记(基于寄存器)
2020-04-25 来源:eefocus
1.说在前面:最近尝试操作VS1053音频模块 使用的数据传输方法使用SPI协议,打算学一下SPI的配置方式
2.SPI
2-1:SPI(Secial Periperal interface),作为四线的通信接口,有着MISO MOSI SCLK和CS
MISO:主进从出
MOSI:主出从进
SCLK: 时间信号
CS:片选信号
2-2:CPHA和CPOL
CPHA为时钟相位,可以配置为1/0,控制数据的采样方式,设置为0的时候,控制在时钟周期的第一个跳变沿进行数据采集,设置为1的时候在第二个跳变沿进行采集
CPOL为时钟极性,可以配置为1/0,控制空闲状态的时钟极性,设置为0的时候空闲状态为低电平,设置为1空闲状态为高电平
时序图:

3.配置思路
3-1:设置SPI1的时钟和复用引脚时钟(spi_clock APB2ENR的12位)
在设置设置PA5 6 7(SCK MISO MOSI)为复用模式
3-2:设置工作模式(说实话 库函数设置采用结构体方式看起来很清晰,寄存器直接对SPI->CR1进行设置)
设置主/从机模式 数据的位数和时间记性和相位以及SPI时钟的时钟频率
oid 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上拉
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为高)
}
3-3:SPI的速度设置以及使能(对SPI->CR1配置)
使能位:SPI1->CR1|=1<<6;
//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设备使能
}
3-4:发送数据配置(检查发送区的数据是否进行发送(发送区是否为空)SPI1->SR的最低位是否为0)
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; //返回收到的数据
}
3-5:spi的作用范围为EEPROM FLASH RTC AD等 是一种高速全双工,同步的通信总线
上一篇:Stm32 iic初始化介绍
史海拾趣
|
PCB啊总算画的差不多了,总算还是赶得上SOSO的进度的。。。。。画的很急。。。也很粗糙。。。。不过应该没啥太大问题的。。。。 先上张图吧 资料等会再传。。。。白天再修修改改。。。。先睡觉去了。。。。。。。 ********* ...… 查看全部问答> |
|
我要做一个操作寄存器读写的工具,之前查了资料是用virtualalloc,和virtualcopy两个函数就能搞定,但是又发现CE6.0上不能用virtualcopy了,要用流接口驱动来实现。流接口的每个函数应该怎么定义,我要实现几个函数啊?… 查看全部问答> |
|
各位大侠: 不知有没有熟悉上海鼎为通讯有限公司的没,我不久前拿到该公司的offer,想对该公司做进步的了解,在这里向各位大侠请教: (一)该公司目前发展怎么样,前景如何? (二)我进该公司的职位是驱动软件师,不知该部门有没有牛人,能 ...… 查看全部问答> |
|
MULTI BIN的问题请看看还有哪位朋友能把debug的信息给我看看么(要KernelInit之后的 谢谢) 我用的是三星的BSP,MULTI BIN方式的(wince5.0)我的问题现象如下: Windows CE Kernel for ARM (Thumb Enabled) Built on Jun 24 2004 at 18:21:58 ProcessorType=0926 Revision=5 sp_abt=ffff5000 sp_irq=ffff2800 sp_undef=ffffc800 ...… 查看全部问答> |
|
本人现在笔记本上已经带有一块无线网卡,想通过编写无线通信程序,通过发送命令实现对移动小车的无线控制(其上也有无线接收模块),只是短距离的无线控制。 现在通信的数据格式已经定义好了,但不知道如何通过编程来实现,请各位大侠指教! 有的 ...… 查看全部问答> |
|
用到了定时器,串口DMA.程序写的应该是比较规范了重点解决了串口DMA方式接收.不能连续收不同大小数据的问题只贴main函数了~/******************************************************************************** Function Name : main* Descri ...… 查看全部问答> |
|
【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第二十二章 ADC实验 第二十二章 ADC实验 本章我们将向大家介绍STM32的ADC功能。在本章中,我们将使用STM32的ADC1通道0来采样外部电压值,并在TFTLCD模块上显示出来。本章将分为如下几个部分:22.1 STM32 ADC简介22.2 硬件设计22.3 软件设计22.4 下载验证 22.1 STM32 AD ...… 查看全部问答> |




