STM32F103学习笔记——SPI读写Flash(三)

  此系列文章是小白学习STM32的一些学习笔记。小白第一次写笔记文章,有不足或是错误之处,请多体谅和交流!

1.FLASH指令编码表

  我们将FLASH芯片的各个指令用宏定义的方式定义下来,这样相对于纯16进制指令,使用的时候清晰明了。在这里插入图片描述

2.读取FLASH芯片ID函数

  读取FLASH的ID函数编写如下:

u32 SPI_FLASH_ReadID(void)
{
	u32 Temp=0,Temp0=0,Temp1=0,Temp2=0;
	SPI_FLASH_CS_LOW();
	SPI_FLASH_SendByte(W25X_JedecDeviceID);
	Temp0=SPI_FLASH_SendByte(Dummy_Byte);
	Temp1=SPI_FLASH_SendByte(Dummy_Byte);
	Temp2=SPI_FLASH_SendByte(Dummy_Byte);
	SPI_FLASH_CS_HIGH();
	Temp = (Temp0<<16)|(Temp1<<8)|Temp2;
	return Temp;
}

  最后一步操作,是合并三个字节,得到完整的芯片ID。

3.FLASH写使能以及读取当前状态函数

  对FLASH进行写操作之前,需要对写操作使能。

void SPI_FLASH_WriteEnable(void)
{
	SPI_FLASH_CS_LOW();
	SPI_FLASH_SendByte(W25X_WriteEnable);
	SPI_FLASH_CS_HIGH();
}

  FLASH的读写操作需要一定时间,所以需要一个函数判断是否在忙碌状态。FLASH芯片内部有一个状态寄存器,其第0位即是忙碌与否状态标志位。
  根据指令,我们读取此状态寄存器,然后判断第0位是否为1,如果为1就是忙碌状态,继续等待,直到为0,忙碌状态结束,然后可以开始其他操作。其代码如下:

#define WIP_Flag 0x01
void SPI_FLASH_WaitForWriteEnd(void)
{
	u8 FLASH_Status = 0;
	SPI_FLASH_CS_LOW();
	SPI_FLASH_SendByte(W25X_ReadStatusReg);
	do
	{
		FLASH_Status = SPI_FLASH_SendByte(Dummy_Byte);
	}while((FLASH_Status & WIP_Flag)==SET);
	//取出第零位判断是否为1,是的话继续循环,否的话结束while;
	SPI_FLASH_CS_HIGH();
}

4.FLASH扇区擦除

  由于FLASH存储器特性,它只能将存储单元状态由1改为0,而不能将0改为1。因此,对FLASH写数据前,需对扇区进行擦除,即将所有单元置1,然后写数据,如果数据是1,即不需改变;如果数据是0,即将其由1改为0,故而完成数据的写入操作。
  擦除一般多个字节进行:

擦除单位V大小
扇区擦除(Sector Erase)4KB
块擦除(Block Erase)64KB
正片擦除(Chip Erase)整块芯片

  扇区擦除,先发送指令,紧接着发送三个字节作为地址。
  Tips:扇区擦除指令发送前,也需要写使能指令。

1 /**
2 * @brief 擦除 FLASH 扇区
3 * @param SectorAddr:要擦除的扇区地址
4 * @retval 无
5 */
6 void SPI_FLASH_SectorErase(u32 SectorAddr)
7 {
8 /* 发送 FLASH 写使能命令 */
9 SPI_FLASH_WriteEnable();
10 SPI_FLASH_WaitForWriteEnd();
11 /* 擦除扇区 */
12 /* 选择 FLASH: CS 低电平 */
13 SPI_FLASH_CS_LOW();
14 /* 发送扇区擦除指令*/
15 SPI_FLASH_SendByte(W25X_SectorErase);
16 /*发送擦除扇区地址的高位*/
17 SPI_FLASH_SendByte((SectorAddr & 0xFF0000) >> 16);
18 /* 发送擦除扇区地址的中位 */
19 SPI_FLASH_SendByte((SectorAddr & 0xFF00) >> 8);
20 /* 发送擦除扇区地址的低位 */
21 SPI_FLASH_SendByte(SectorAddr & 0xFF);
22 /* 停止信号 FLASH: CS 高电平 */
23 SPI_FLASH_CS_HIGH();
24 /* 等待擦除完毕*/
25 SPI_FLASH_WaitForWriteEnd();
26 }

5.FLASH的页写入

  目标扇区擦除结束后可以进行数据写入,页写入一次性最多可以向FLASH传输256字节的数据。

1 /**
2 * @brief 对 FLASH 按页写入数据,调用本函数写入数据前需要先擦除扇区
3 * @param pBuffer,要写入数据的指针
4 * @param WriteAddr,写入地址
5 * @param NumByteToWrite,写入数据长度,必须小于等于页大小
6 * @retval 无
7 */
8 void SPI_FLASH_PageWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite)
9 {
10 /* 发送 FLASH 写使能命令 */
11 SPI_FLASH_WriteEnable();
12 
13 /* 选择 FLASH: CS 低电平 */
14 SPI_FLASH_CS_LOW();
15 /* 写送写指令*/
16 SPI_FLASH_SendByte(W25X_PageProgram);
17 /*发送写地址的高位*/
18 SPI_FLASH_SendByte((WriteAddr & 0xFF0000) >> 16);
19 /*发送写地址的中位*/
20 SPI_FLASH_SendByte((WriteAddr & 0xFF00) >> 8);
21 /*发送写地址的低位*/
22 SPI_FLASH_SendByte(WriteAddr & 0xFF);
23 
24 if (NumByteToWrite > SPI_FLASH_PerWritePageSize)
25 {
26 NumByteToWrite = SPI_FLASH_PerWritePageSize;
27 FLASH_ERROR("SPI_FLASH_PageWrite too large!");
28 }
29 
30 /* 写入数据*/
31 while (NumByteToWrite--)
32 {
33 /* 发送当前要写入的字节数据 */
34 SPI_FLASH_SendByte(*pBuffer);
35 /* 指向下一字节数据 */
36 pBuffer++;
37 }
38 
39 /* 停止信号 FLASH: CS 高电平 */
40 SPI_FLASH_CS_HIGH();
41 
42 /* 等待写入完毕*/
43 SPI_FLASH_WaitForWriteEnd();
44 }

6.从FLASH读取数据

  发送了指令编码及要读的起始地址后,FLASH 芯片就会按地址递增的方式返回存储矩阵的内容,读取的数据量没有限制,只要没有停止通讯,FLASH 芯片就会一直返回数据。

1 /**
2 * @brief 读取 FLASH 数据
3 * @param pBuffer,存储读出数据的指针
4 * @param ReadAddr,读取地址
5 * @param NumByteToRead,读取数据长度
6 * @retval 无
7 */
8 void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead)
9 {
10 /* 选择 FLASH: CS 低电平 */
11 SPI_FLASH_CS_LOW();
12 
13 /* 发送 读 指令 */
14 SPI_FLASH_SendByte(W25X_ReadData);
15 
16 /* 发送 读 地址高位 */
17 SPI_FLASH_SendByte((ReadAddr & 0xFF0000) >> 16);
18 /* 发送 读 地址中位 */
19 SPI_FLASH_SendByte((ReadAddr& 0xFF00) >> 8);
20 /* 发送 读 地址低位 */
21 SPI_FLASH_SendByte(ReadAddr & 0xFF);
22 
23 /* 读取数据 */
24 while (NumByteToRead--)
25 {
26 /* 读取一个字节*/
27 *pBuffer = SPI_FLASH_SendByte(Dummy_Byte);
28 /* 指向下一个字节缓冲区 */
29 pBuffer++;
30 }
31 
32 /* 停止信号 FLASH: CS 高电平 */
33 SPI_FLASH_CS_HIGH();
34 }

本系列笔记内容、代码和图片均基于电子书《【野火®】零死角玩转STM32—F103-MINI》

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32F103是一款常用的ARM Cortex-M3系列的单片机,通过SPI接口来实现与外部设备的通信是常见的应用之一。以下是关于如何使用STM32F103的SPI接口来OLED显示屏的简要概述。 首先,确保已经按照需要的电气连接,将OLED显示屏与STM32F103连接起来,其中包括SCK、MOSI、CS(片选)以及DC(数据/命令切换)等信号线。 其次,配置SPI接口。首先,使能SPI时钟,选择合适的SPI通道,配置SPI模式以及时钟分频等参数。可以使用STM32CubeMX工具来简化配置过程。然后,根据OLED显示屏的规格,配置SPI通信的特殊需求,如数据宽度、传输模式、控制信号等。 接下来,编相关的代码来控制OLED显示屏。首先,确保OLED显示屏处于可用状态,并准备好相应的初始设置和功能配置。然后,使用SPI接口的函数将数据发送到OLED显示屏或从中取数据。SPI接口的函数可以通过库或者使用直接寄存器的方式实现。 在具体的数据传输过程中,需要根据OLED显示屏使用的协议来设置相应的数据格式和控制信号。例如,发送命令和数据之前,需要将DC信号切换到相应的状态;同时,在SPI通信完成之后需要切换CS信号的状态以结束通信。 最后,记得适时进行相关的错误处理和调试。可以根据实际需要来添加适当的延迟等待SPI数据传输完成以及OLED显示屏的响应。 总之,通过配置STM32F103的SPI接口以及编相应的代码,可以实现与OLED显示屏的数据。具体的实现方式需要根据OLED显示屏的规格和通信协议来确定。 ### 回答2: 在使用STM32F103芯片进行SPIOLED时,我们首先需要了解一些基本概念。 SPI(Serial Peripheral Interface)是一种串行通信协议,用于在微控制器或其他数字芯片之间进行全双工的数据通信。在SPI总线上,有一个主设备(通常是微控制器)和一个或多个从设备(如OLED显示屏)。主设备负责控制总线并发送数据,从设备负责接收数据并做出响应。 要在STM32F103芯片上使用SPIOLED,我们需要按照以下步骤进行操作: 1. 硬件连接:首先将STM32F103芯片的SPI引脚与OLED显示屏的SPI引脚连接。通常,STM32F103的SPI引脚由标有SCK(时钟线)、MISO(主设备输入,从设备输出)、MOSI(主设备输出,从设备输入)和NSS(片选信号)的引脚组成。 2. 初始化:在代码中,我们需要初始化SPI配置寄存器,设置SPI时钟相位、极性等参数,以及设置NSS引脚的控制方式。还需要初始化OLED显示屏,设置OLED的工作模式和其他参数。 3. 发送数据:通过SPI发送数据到OLED。我们可以使用SPI发送一个字节的数据或一串字节的数据,具体取决于要显示的内容。发送数据的函数通常会等待数据传输完成,然后返回结果。 4. 接收数据(如果需要):如果OLED显示屏返回一些数据,我们可以通过SPI接收数据的功能来取这些数据。接收数据的函数通常会等待数据传输完成,然后将接收到的数据返回。 通过以上步骤,我们就可以实现STM32F103芯片对OLED显示屏的SPI操作。具体的实现方法和代码可以参考STM32F103的相关文档或参考其他开源项目。 ### 回答3: STM32F103是意法半导体生产的一款32位微控制器,具有强大的性能和丰富的外设支持。SPI(Serial Peripheral Interface)是一种串行外设接口协议,用于在微控制器与外部设备之间进行高速数据传输。 要实现STM32F103与OLED的SPI,可以按照以下步骤操作: 1. 首先,需要将OLED连接到STM32F103的SPI端口。OLED通常具有SDA(数据线)、SCL(时钟线)、CS(片选线)、RES(复位线)等引脚,需要将它们连接到STM32F103对应的引脚(如PB14、PB13、PB12、PB11)。 2. 在STM32F103的代码中配置SPI外设。可以使用STM32CubeMX进行外设配置,选择SPI模块,并设置相应的引脚和参数(如波特率、数据位宽等)。 3. 编代码来初始化SPI外设。在代码中,需要初始化SPI控制寄存器的各个参数,如使能SPI、选择主从模式、设置数据传输顺序等。 4. 编代码来控制OLED的初始化。在初始化时,可以设置OLED的显示参数、清空显示缓存等。 5. 编代码来实现SPI入数据到OLED。通过编SPI发送数据的函数,将要显示的数据发送给OLED。 6. 编代码来实现SPI从OLED取数据。通过编SPI接收数据的函数,可以取OLED的状态信息或其他返回的数据。 7. 在主函数中调用相应的函数,完成SPI操作。可以先调用初始化函数,然后通过入数据和取数据函数进行SPI操作。 综上所述,通过对STM32F103的SPI外设配置和编相应的代码,可以实现与OLED之间的高速数据,可以灵活地控制OLED的显示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值