嵌入式小白跟随江科大学习笔记 -- 2024.4.6

一、SPI外设

        SPI外设简介:

STM32 内部集成了硬件 SPI 收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻 CPU 的负担
可配置 8 /16 位数据帧、高位先行 / 低位先行
时钟频率: f PCLK / (2, 4, 8, 16, 32, 64, 128, 256),PCLK就是外设时钟,APB2的是72MHz,APB1的是36MHz
支持多主机模型、主或从操作
可精简为半双工 / 单工通信
支持 DMA
兼容 I2S 协议,一种数字音频传输协议
STM32F103C8T6 硬件 SPI 资源: SPI1(APB2) 、SPI2(APB1)

        SPI框图:

此处配置的为低位先行的模式,由LSBFIRST控制位进行控制;MOSI和MISO部分交叉相连因为STM32可以做主机也可以做从机,可以进行主从模式转换, 从机模式下两引脚功能翻转,MOSI作为输入走交叉路线数据进入寄存器;全双工的通信发送和接收寄存器是分离的,半双工是一体的;NSS引脚的作用更倾向于多主机模型的实现,所以我们在实验中不直接使用NSS来指定从机,而是指定一个GPIO口来执行SS的作用

        SPI基本结构:

传输时序

        主模式全双工连续传输

此模式借助缓冲区进行连续传输,但是相对复杂不方便封装,如果对性能没有极致要求不使用,所以本节使用非连续传输的方法

此时序并不是常规的发送数据1-接收数据1-发送数据二-接收数据二,而是发送数据一--发送数据二--接收数据一--发送数据三--接收数据二

非连续传输:

此时序条例更清晰,在发送一个数据后会等待回传的数据读取完成后再发送下一个数据

1.等待TXE为1,写入TDR

2.等待RXNE为1,读取RDR数据

不断重复上述过程就是非连续传输的时序 ,因此方便封装在一个函数中需要使用时就调用,但是相应的,此时序会导致字节间产生间隙,拖慢整体节奏,在SCK频率低的时候影响不大,但在频率非常高的时候会严重的拖后腿,因此想要更高的效率则需要使用连续传输或者直接引入DMA进行数据的转运

二、硬件SPI通信读写W25Q64实验

        此实验就是将上一小节的软件SPI读写的底层函数实现方式由软件改为硬件

配置步骤

        1.开启SPI时钟,初始化GPIO,其中SCK、MOSI是硬件外设控制的输出引脚,配置为复用推挽输出,MISO为上拉输入

        2.结构体配置SPI外设,使能SPI

        3.参考时序进行数据交换

部分库函数解释

//将数据写入TDR中
void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);

//将RDR中的数据读出
uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);

//8或16位数据帧格式选择
void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize);

代码部分

因为只改变了底层代码的部分所以此处只放置MySPI底层部分代码

#include "stm32f10x.h"                  // Device header

//封装指定设备线的电平改变函数
void MySPI_W_SS(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)BitValue);
}

void MySPI_Init(void){
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//通用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
 	GPIO_Init(GPIOA, &GPIO_InitStructure); 
	
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//外设控制的复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5|GPIO_Pin_7;
 	GPIO_Init(GPIOA, &GPIO_InitStructure); 
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6;
 	GPIO_Init(GPIOA, &GPIO_InitStructure); 
	
	SPI_InitTypeDef SPI_S;
	SPI_S.SPI_Mode=SPI_Mode_Master;//主机模式
	SPI_S.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//全双工双向通信
	SPI_S.SPI_DataSize=SPI_DataSize_8b;//8位数据帧
	SPI_S.SPI_FirstBit=SPI_FirstBit_MSB;//高位现行
	SPI_S.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_128;//128分频
	SPI_S.SPI_CPOL=SPI_CPOL_Low;//默认高电平
	SPI_S.SPI_CPHA=SPI_CPHA_1Edge;//第一边沿采样 
	SPI_S.SPI_NSS=SPI_NSS_Soft;//软件NSS
	SPI_S.SPI_CRCPolynomial=7;//CRC校验多项式,默认7
	SPI_Init(SPI1,&SPI_S);
	
	SPI_Cmd(SPI1,ENABLE);
	
	MySPI_W_SS(1);//SS设置默认高电平

}

//时序基本单元:起始信号
void MySPI_START(void)
{
	MySPI_W_SS(0);
}

//终止信号
void MySPI_STOP(void)
{
	MySPI_W_SS(1);
}

//硬件根据时序控制数据交换
uint8_t MySPI_SwapByte(uint8_t ByteSend)
{
	while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)!=SET);//等待TXE
	SPI_I2S_SendData(SPI1,ByteSend);//ByteSend写入TDR,然后再自动转入移位寄存器,写入数据后TXE自动清除
	while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)!=SET);//等待RXNE
	return SPI_I2S_ReceiveData(SPI1);//返回收到的数据,读取数据后RXNE自动清除
}

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
u-boot-2016.11.tar.bz2是一个开源软件项目的压缩文件。该压缩文件是u-boot引导加载程序的源代码和相关文件的打包形式。u-boot(Universal Bootloader)是一款用于嵌入式系统的开源引导加载程序,用于初始化硬件并启动操作系统。 u-boot-2016.11.tar.bz2文件的扩展名.tar.bz2表示它是使用tar和bzip2两种工具进行压缩的。.tar是一个常用的文件打包工具,它可以将多个文件和目录打包成一个文件。.bz2是一个压缩工具,可以将文件进行高效压缩。 要使用u-boot-2016.11.tar.bz2文件,首先需要将其解压缩。可以使用tar命令进行解压缩,命令为tar -xjf u-boot-2016.11.tar.bz2。这将解压缩文件,并将源代码和其他相关文件提取到当前目录下。 解压缩后,可以在提取出的文件中找到u-boot引导加载程序的源代码和相关文件。可以根据需要进行定制和编译,生成适合特定硬件平台的引导加载程序。u-boot支持多种处理器架构和开发板,可以根据需要进行配置。 根据u-boot-2016.11.tar.bz2文件的版本号来看,它是2016年11月发布的版本。这意味着该版本已经存在一段时间,并可能具有稳定性和经过验证的特性。对于需要使用u-boot的开发者和嵌入式系统制造商,这个版本可以作为一个可靠的基础进行开发和定制。 总之,u-boot-2016.11.tar.bz2是u-boot引导加载程序的源代码和相关文件的压缩包。解压缩后,可以通过定制和编译源代码,生成适合特定硬件平台的引导加载程序。这个版本已经存在一段时间,并可能具有可靠的特性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值