IIC(Inter-Integrated Circuit)协议也称为I2C总线,是一种串行通信协议,通常用于连接低速外设。它由Philips(现在的NXP Semiconductors)公司于1980年代初开发,现在已经成为一个标准。IIC总线只需要两条数据线,分别是串行数据线(SDA)和串行时钟线(SCL),这使得它成为一种非常简单的接口。它适用基于芯片的通信,例如连接传感器、存储器或数字信号处理器等。
在IIC协议中,总线上有一个主设备和多个从设备。主设备掌控着总线上的通信过程,负责发起、控制、停止通信。而从设备则需要等待主设备的请求,接收或发送数据。主设备和从设备之间的数据交换采用帧格式,每个帧通常包含地址、数据和控制信息。主设备根据从设备的地址来选中要通信的设备,从设备则根据控制信息进行相应的操作。IIC协议可以支持多个从设备连接到同一个主设备,为系统设计提供了更大的灵活性。
I2C总线通常使用两种电压电平,即高电平(VH)和低电平(VL)。高电平为2.5V至5.5V,低电平为0V至0.3V;这些电压电平范围是根据I2C规范确定的。I2C总线有不同的传输速率可选,包括标准模式(100 kbps)、快速模式(400 kbps)以及高速模式。传输速率的选择取决于应用的需求和设备的支持能力。为避免信号冲突,微处理器(MCU)必须只能驱动SDA和 SCL在低电平,即开漏输出。设置为开漏模式主要是为了保护器件和防止干扰。
- 防止干扰:多个器件共享同一条数据线(SDA)和同一条时钟线(SCL),如果采用推挽输出模式,多个器件的输出将会叠加在数据线上,造成信号干扰,严重时会损坏器件或导致通信错误。而采用开漏输出模式,则各个器件的输出只有拉低数据线的部分,不会干扰彼此,从而提高了总线的可靠性和抗干扰能力。
- 防止短路:在开漏输出模式下,由于器件的输出只有拉低数据线的部分,如果两个或多个器件同时输出,也不会造成短路。而如果采用推挽输出模式,两个或多个器件同时输出时,可能会形成短路。比如主设备输出高电平,从设备输出低电平。
因设置为开漏模式,需要连接一个外部的上拉电阻(例如:10k)将信号提拉至高电平。故I2C总线中的SDA(数据线)和SCL(时钟线)通常都连接了上拉电阻,以确保逻辑高电平的稳定性。上拉电阻的阻值通常在2.2kΩ至10kΩ之间,具体取决于总线的电容负载和通信距离。
I2C总线的最大线缆长度和传输容量受到一定限制。在标准模式下,最大线缆长度大约在1米左右,而在快速模式下,最大线缆长度约为0.3米。此外,线缆上的总线容量也会对传输速率产生影响。
IIC只有两根通信线,因此它数据传输是基于时钟信号的。各个设备在时钟信号的控制下进行数据的收发操作。下面是IIC总线的几个重要的时序:
在IIC总线中,时钟线由主设备控制,每个数据位在时钟边沿更新,传输的最高速率取决于总线上最慢的设备。一般来讲,IIC总线的通信速率比较慢,通常在几百kbps的范围内。如果需要更高的传输速率,可以采用其他通信协议,如SPI协议、CAN协议等。
I2C通信流程按照以下步骤进行:
- 主控向总线发送开始信号。
- 主控将要通信的设备地址和读写位(R/W)发送到总线上。
- 设备接收到地址后发送应答信号,主控接收到应答信号后发送数据或继续发送地址。
- 设备接收到数据后发送应答信号,主控接收到应答信号后可以继续发送数据或者停止通信。
- 主控向总线发送停止信号。
发送数据流程:
接收数据流程:
速率:I2C总线有标准模式(100 kbit/s)和快速模式(400 kbit/s)两种传输模式,还有更快的扩展模式和高速模式可供选择。
器件地址:每个设备都有唯一的7位或10位地址,可以通过地址选择来确定与谁进行通信。
总线状态:I2C总线有五种状态,分别是空闲状态、起始信号、结束信号、响应信号、数据传输。
数据格式:I2C总线有两种数据格式,标准格式和快速格式。标准格式是8位数据字节加上1位ack/nack(应答/非应答)位,快速格式允许两个字节同时传输。
由于SCL和SDA线是双向的,它们也可能会由于外部原因(比如线路中的电容等)出现电平误差,而从而导致通信出错。因此,在IIC总线中,通常使用上拉电阻来保证信号线在空闲状态下的电平为高电平。
STM32F103C8T6上带有2个硬件I2C外设,它是一个内部电路,允许与外部I2C接口进行通信。
硬件I2C模块的时序控制是由硬件电路和寄存器控制来实现的,这些电路和寄存器负责生成时钟和控制数据线的电平变化,使其符合I2C通信协议的时序要求,能够自动处理I2C通信所需的时序信号,确保数据的传输在正确的时间轴上进行。通过硬件I2C模块的自动控制,时序控制可以更加准确和可靠,从而提高通信的成功率。
硬件I2C还可以支持中断和DMA。它可以通过中断或DMA方式与处理器进行通信。这使得处理器可以在数据传输期间进行其他任务,提高了系统的效率和性能。
STM32F103C8T6的硬件I2C模块上只支持标准模式(100 kHz)和快速模式(400 kHz),以满足不同应用场景下的通信需求。
(1)软件初始化
需要配置I2C控制器的相关参数,以确保适合所连接设备的通信需求。这包括设置I2C速率、地址模式、设备地址等。
(2)设置START
发送一个起始信号至I2C总线,通过设置I2C控制器的开始位来启动发送过程。可以通过标志位SBSEND 判断起始信号是否发送完毕,发送完毕时SBSEND标志位会由硬件置一。
(3)清除SBSEND
SBSEND为起始信号发送完成标志位,当起始信号发送完成时,会由硬件置一。图中为10位地址模式,需要清除起始信号标志位才可进行下一步,但是如果是7位地址模式,该标志位不可清除,否则无法进行下一步。
(4) 清除ADDSEND位
如果地址为10位地址模式,则需要发送两次地址,分别是地址高位和地址低位,先发送高位再发送低位。发送完成ADD10SEND和ADDSEND会由硬件置一,需要我们分别清除地址发送完成标志位ADD10SEND和ADDSEND。
如果地址为7位地址模式,则只需要发送一次地址,并等待标志位ADDSEND由硬件置一后,清除ADDSEND标志位。
(5) 写入字节数据
写入数据之前,为了防止数据冲突,需要确保发送寄存器里的数据为空。可以通过判断标志位TBE判断寄存器中的数据是否为空,为空时TBE标志位由硬件置一。发送数据之后需要判断从机是否产生应答,通过BTC标志位判断是否发送成功,当发送成功时,BTC由硬件置一。
(6) 设置STOP
设置STOP即发送停止信号。
(1)再次设置START
重新发送起始信号,需要注意的是重新发送之前,必须要先发送停止信号释放总线,让硬件I2C成为空闲状态后,才可重新发送起始信号。否则无法进行下一步。
(2)清除SBSEND
SBSEND为起始信号发送完成标志位,当起始信号发送完成时,会由硬件置一。图中为10位地址模式,需要清除起始信号标志位才可进行下一步,但是如果是7位地址模式,该标志位不可清除,否则无法进行下一步。
(3) 清除ADDSEND位
如果地址为10位地址模式,在清除ADDSEND位之前,需要发送两次地址,分别是地址高位和地址低位,先发送高位再发送低位。发送完成ADD10SEND和ADDSEND会由硬件置一,需要我们分别清除地址发送完成标志位ADD10SEND和ADDSEND。如果地址为7位地址模式,则只需要发送一次地址,并等待标志位ADDSEND由硬件置一后,清除ADDSEND标志位。
(4) 读取字节数据
接收数据可以通过判断标志位RBNE确定当前寄存器中是否有数据。RBNE标志位为数据寄存器为空标志位,当数据寄存器中有接收到数据时,会由硬件将RBNE标志位置一,之后我们可以将数据寄存器里的数据取出。读取数据完成之后,我们需要发送应答给从机,从机才会发送下一个数据。通过使能ACK应答位,硬件I2C会自动通过硬件方式发送应答。
(5)清除ACKEN,设置STOP
当最后一个数据需要发送非应答信号时,通过将ACK应答位失能,即可发送非应答位。非应答位发送完成之后,紧跟着发送停止信号。
软件I2C是指通过在程序中编写代码来实现I2C通信协议。它利用通用输入输出(GPIO)引脚来模拟I2C的数据线(SDA)和时钟线(SCL),通过软件控制引脚的电平变化来传输数据和生成时序信号。与硬件I2C相比,软件I2C的优势在于不需要特定的硬件支持,可以在任何支持GPIO功能的微控制器上实现。它利用了微控制器的通用IO引脚来实现I2C通信协议。
软件I2C的实现通过编程方式来模拟I2C的主机和从机设备。通过逐位地读取和写入GPIO引脚的状态,并根据I2C协议的时序要求进行相应的操作,实现数据的传输和通信。软件I2C的灵活性较高,可以根据应用需求进行定制和扩展。它可以处理多个从机设备,并支持多主机环境。因此,软件I2C广泛应用于资源受限的MCU系统,特别是那些需要与多个外部设备进行通信的应用。
尽管软件I2C的性能相对于硬件I2C较低,但在一些低速通信和简单通信需求的场景下,软件I2C是一种经济实用的解决方案。
硬件I2C是指通过专门的硬件模块来处理I2C通信协议。大多数现代微控制器和一些外部设备已经集成了硬件I2C模块,这些硬件模块负责处理I2C通信的细节,包括生成正确的时序信号、自动处理信号冲突、数据传输和错误检测等。可以直接使用硬件引脚连接,无需编写时序的代码。
使用硬件I2C通常相对简单,开发者无需编写复杂的代码来处理通信协议的细节。硬件模块可以直接与外部设备连接,通过专用的引脚进行数据和时钟传输,从而实现高效且可靠的通信。
在选择软件I2C还是硬件I2C时,需要考虑应用需求和硬件资源。软件I2C适用于资源受限的系统,可以在任何支持GPIO的微控制器上实现,但相对性能较低。硬件I2C通常性能更好,但需要硬件支持,并且可能占据一些特定的引脚资源。
双向传输:I2C总线支持双向传输,可以通过SDA线同时传输主设备和从设备之间的数据,节约了总线的资源。
系统集成:I2C总线可以快速集成到芯片中,减少系统实现的逻辑复杂性,提高了设计效率。
多设备共享:I2C总线可以通过地址传输实现多个设备与主控器的通信,使得多个设备可以共享总线,并直接交互。
高可靠性:I2C总线使用逻辑层次的代替电气信号来表示数据传输,具有更高的传输可靠性。
带宽不高:I2C总线的传输速度限制在400 kbps,相比较于SPI总线和CAN总线,带宽相对较低。
时序要求严格:I2C总线传输数据需要严格遵循时序要求,特别是在高速传输过程,时序容易受到干扰,造成通信失败。
最长电缆长度有限:虽然I2C总线可以通过中继器扩展总线长度,但是由于信号线受到干扰,信号衰减和时序要求等问题,电缆最长长度一般限制在1~2米之间。
总之,I2C总线具有双向传输、系统集成、多设备共享等优点,但传输速度相对较低,时序要求严格且最长电缆长度有限等缺点。
I2C总线是应用最广泛的通信接口之一,以下是几个常见的应用例子:
- 温度计传感器:常见的温度计传感器,如SHT31、LM75等,都采用I2C接口,其通过I2C总线将温度数据传输到主控器进行处理。
- LED驱动器:LED驱动器,如PCA9685,常用于控制LED灯的亮度和颜色,其通过I2C总线和主控器通信,可实现快速和精确定时。
- OLED显示屏:OLED显示屏通过I2C总线与主控器通信,可实现高清晰度的图形显示,应用于像表盘、智能手表、电子血压计等低功耗设备之中。
- 触摸屏控制器:常见的15寸及以下触摸屏控制器,如STMPE610,都采用I2C接口,这些控制器可提供触摸检测和X/Y坐标的读取等功能。
- 电流电压采集:电流或电压采集芯片,如INA219,可通过I2C总线和主控器通信,实现精确高速的电流电压数据采集,应用于电源管理和工业自动化等领域。
上述只是常见的应用例子之一,I2C总线在许多领域都有广泛的应用,具有性价比高、易于移植等优点。
以SHT20温湿度传感器作为实验案例。通过软件IIC的方式与其进行通信,获取周围环境的温度与湿度状况。
SHT20是一种数字式温湿度传感器,它采用电容式测量技术,具有高准确度和稳定性,并采用标准的I2C数字接口进行通信。SHT20的测量范围涵盖了温度-40到+125°C和相对湿度0到100%RH。它广泛应用于空气质量监测、气象监测、恒温恒湿控制、食品贮藏等领域。
SHT20温湿度传感器的相关参数,见下图:
一般使用软件I2C功能,都需要有以下几个步骤:
- 配置引脚
- 配置I2C时序
- 确定通信步骤
在使用软件实现I2C通信时,需要选择合适的引脚来作为数据线(SDA)和时钟线(SCL)。通常情况下,可以选择任何可编程的通用输入输出(GPIO)引脚作为软件I2C的引脚。对于软件I2C,需要至少两个引脚用于数据线(SDA)和时钟线(SCL),并确保这些引脚能够满足I2C通信协议的时序要求。以下是一般的引脚说明:
- 数据线(SDA):用于传输数据的引脚。在软件I2C中,需要将该引脚设置为输出模式(用于主设备发送数据)与输入模式(用于主设备接收数据)。在通信期间,需要通过控制数据线的电平变化来实现数据的传输。
- 时钟线(SCL):用于控制数据传输的时钟信号的引脚。在软件I2C中,需要将该引脚设置为输出模式,通过控制时钟线的电平变化来生成时钟脉冲,以控制数据线的传输。
需要注意的是,选取合适的引脚时要考虑以下几个方面:
- 支持输入/输出配置:引脚需要支持在软件中配置为输入或输出模式,并能够通过程序动态地进行切换。
- 硬件限制和冲突:确保选取的引脚没有被分配给其他硬件功能或外设,以避免冲突。
- 电气特性:引脚的电气特性应满足I2C总线的标准要求,例如正确的电平和驱动能力。
需要注意的是,软件I2C的实现需要更多的程序代码和计算,相对于硬件I2C,软件I2C在处理器效能和时序控制方面更加敏感。因此,在选择引脚时,还需要考虑处理器的性能和可编程性能。
为了保证代码的可维护性和可移植性,这里将相关的功能进行的宏定义。
SDA引脚和SCL引脚的宏定义如下:
bsp_sht20.h文件
要操作 GPIO 引脚,必不可少的就是开启时钟、配置模式、配置输出、设置功能等,还是这一系列的操作。
引脚初始化配置如下:
关于I2C的时序部分,已在章节【IIC数据传输】进行说明,这里不在进行叙述。
我们要实现的是通过案例SHT20温湿度传感器读取周围环境的温湿度情况。要进行I2C通信,需要知道其器件地址。并且了解如何与其进行通信。
SHT20温湿度传感器的I2C地址为0x80。I2C地址是一个用于在总线上识别设备的7位地址。对于SHT20传感器,其地址的最高7位已经预设为固定值0b1000_000(0b代表二进制)。最低一位用于标识读操作或写操作,读操作为1,写操作为0。因此,SHT20的I2C地址在写操作时可以表示为0b1000_0000(0x80),读操作时表示为0b1000_0001(0x81)。
在main.c中调用SHT20_Read函数,采集周围环境的温湿度。
串口输出结果:
SPI(Serial Peripheral Interface)是一种同步串行通信协议,用于在微控制器和外部设备之间进行数据传输。它由一个主设备(通常是微控制器MCU)和一个或多个从设备组成,即一主多从模式。它通常用于短距离、高速、全双工的通信,它在许多嵌入式系统和电子设备中被广泛应用,如存储器芯片、传感器、显示器驱动器、无线模块等。
在SPI协议中,主设备是通信的发起方和控制方,而从设备则是被动接收和响应主设备的命令和数据。主设备通过时钟信号来同步数据传输,同时使用多个双向数据线来实现数据的传输和接收。
SPI协议是一种全双工通信方式,意味着主设备和从设备可以同时发送和接收数据。它还使用一种选择信号(通常称为片选或使能信号),用于选择与主设备进行通信的特定从设备。
- 主设备通过MOSI线向从设备发送数据。在每个时钟周期中,主设备将一个位发送到MOSI线上,从设备在下一个时钟周期中读取该位。
- 从设备通过MISO线向主设备发送数据。在每个时钟周期中,从设备将一个位发送到MISO线上,主设备在下一个时钟周期中读取该位。
- 数据传输可以是全双工的,即主设备和从设备可以同时发送和接收数据。
- 数据传输的长度可以是可变的,通常以字节为单位。
- 数据传输可以是单向的,即主设备只发送数据或只接收数据。
- 数据传输可以是多主设备的,即多个主设备可以与多个从设备进行通信。
SPI主要使用4根线,时钟线(SCLK),主输出从输入线(MOSI),主输入从输出线(MISO)和片选线(CS)。
主设备是通过片选线选择要与之通信的从设备。每个从设备都有一个片选线,当片选线为低电平时,表示该从设备被选中。(也有一些设备以高电平有效,需要根据其数据手册确定)。主设备通过控制时钟线的电平来同步数据传输。时钟线的上升沿和下降沿用于控制数据的传输和采样。SPI的主从接线方式需要对应,主从机设定后身份固定。
SPI接线示意:
SPI协议定义了多种传输模式,也称为SPI模式或时序模式,用于控制数据在时钟信号下的传输顺序和数据采样方式。SPI的传输模式主要由两个参数决定:时钟极性 (CKPL) 和相位 (CKPH)。
常见的SPI模式:
选择SPI模式的决策通常取决于从设备的规格要求和通信协议。不同的设备可能采用不同的模式,所以在与特定从设备通信之前,必须了解从设备所需的SPI模式。如果没有明确指定SPI模式,通常可以根据从设备的规格手册或通信协议选择最常见的模式0或模式3进行尝试。此外,还需要注意SPI模式时钟的频率限制,以确保主设备和从设备之间的时钟频率匹配。
SPI与IIC类似,都分有软件SPI和硬件SPI,软件SPI部分不再讲解,本章节着重讲解硬件SPI。STM32F103C8T6具有两个硬件SPI(串行外设接口)模块,用于实现与外部设备的高速串行通信。每个硬件SPI模块都具有独立的寄存器和控制信号,可以配置为主模式或从模式。
使用硬件SPI的优势:
支持中断和DMA:硬件SPI可以与中断控制器和DMA控制器配合使用,实现数据的高效处理和传输。
硬件缓冲区:硬件SPI具有内部缓冲区,可以在主机和外设之间进行数据中转,提高数据的传输效率。
高速传输:硬件SPI使用硬件模块进行数据传输,速度通常比软件实现的SPI更快。
SPI是一种常见的串行通信接口,广泛应用于数字和模拟电子设备之间的通信。它具有简单、高效和灵活的特点,因此与I2C一样,在各种领域都被广泛采用。
在存储器和闪存芯片领域,SPI协议被用于与存储器芯片(如EEPROM、SRAM)和闪存芯片(如SD卡、SPI Flash)进行通信。通过SPI协议,这些芯片可以与主控制器进行数据交换,实现数据的高速读写和存储。
SPI协议在显示器和液晶屏领域也有广泛的应用。许多液晶显示器和OLED显示器使用SPI协议传输图像数据和控制信号。
还有传感器领域、通信领域等,需要注意的是,SPI协议是一种点对点的通信协议,一般通过主从架构进行通信,其中一个设备充当主设备,其他设备充当从设备。
我们使用FLASH模块W25Q64来进行SPI应用实验。
W25Q64是一种常见的串行闪存器件,它采用SPI(Serial Peripheral Interface)接口协议,具有高速读写和擦除功能,可用于存储和读取数据。W25Q64芯片容量为64 Mbit(8 MB),其中名称后的数字代表不同的容量选项。不同的型号和容量选项可以满足不同应用的需求,比如W25Q16、W25Q32、W25Q128等。通常被用于嵌入式设备、存储设备、路由器等高性能电子设备中。
W25Q64闪存芯片的内存分配是按照扇区(Sector)和块(Block)进行的,每个扇区的大小为4KB,每个块包含16个扇区,即一个块的大小为64KB。
采购链接:W25Q64购买链接
资料下载链接:https://pan.baidu.com/s/1Ja9SLPanIVsQZKmxhAFTfw
资料提取码:8888
- 容量: 64M-bit / 8M-byte
- 时钟频率:≤104MHz
- 工作电压:2.7~3.6V
- 尺寸:14mm × 15mm
W25Q64存储芯片,其引脚的说明,见下图:
它与STM32F103C8T6的连接如下:
需要注意的是,我们使用的是硬件SPI方式驱动W25Q64,因此我们需要确定我们设置的引脚是否有硬件SPI外设接口。在数据手册中,PA4~7可以复用为SPI1的4根通信线。
我们先在h文件进行定义:
使用到了硬件SPI外设,我们需要开启对应的硬件SPI时钟,并且开启引脚的复用功能。
根据W25Q64的数据手册,得到以下配置:
- SPI配置为了全双工模式,可以同时发送与接收数据;
- STM32F103C8T6配置为主机模式,由STM32F103C8T6产生时钟,与从机W25Q64进行通信;
- 数据的传输以8位进行传输,因为W25Q64有时需要传输8位,有时需要传输16位,有时直接传输24位。为了同时兼容3种长度的传输,选择了以8位数据位进行传输。
- W25Q64支持两种模式,模式0和模式3,这里极性相位配置选择了模式3,即时钟极性为1,时钟相位为1。
- 片选方式选择软件控制片选。在硬件SPI中,一个SPI只有一个片选线,这会导致硬件SPI如果选择硬件控制片选信号,只能控制一个从机。我们是希望能够一个SPI可以控制多个从机,因此选择软件方式片选,片选线可以随意设定。
- 时钟分频选择2分频,根据W25Q64的数据手册说明,W25Q64的SPI时钟可以达到133MHz,而我们的SPI1的时钟来源为APB2=72MHz,SPI的配置中必须要求进行分频,我们就选一个最小的,W25Q64完全可以兼容。
- 字节顺序选择高位在前。
SPI的初始化完成,我们需要准备SPI读写步骤。SPI我们配置为了全双工模式,即可以读也可以写。为确保发送和接收数据成功,在发送时,需要确保发送缓冲区里的数据发送完毕,即发送缓冲区为空,才可以进行下一个数据的发送;在接收时,需要确保接收缓冲区里有数据才能够进行接收。
根据W25Q64的数据手册可知,读取ID的指令有很多个,ABH/90H/92H/94H/8FH等。而90H的命令,在数据手册中给出了其读取的时序图。
读取步骤:
- 将CS端拉低为低电平;
- 发送指令 90H(1001_0000);
- 发送地址 000000H(0000_0000_0000_0000_0000_0000);
- 读取制造商ID,根据数据手册可以知道制造商ID为EFh;
- 读取设备ID,根据数据手册可以知道设备ID为16h;
- 恢复CS端为高电平;
实现代码:
在进行写入操作之前,需要使用到写使能(Write Enable)命令。写使能的作用是启用对闪存芯片的写入操 作。在默认情况下,闪存芯片处于保护状态,禁止对其进行写入操作,主要是为了防止误操作对数据的损坏。写使 能命令可以解除这种保护状态,将闪存芯片设置为可以进行写入操作。
通过发送写使能命令,闪存芯片将进入一个特定的状态,使得后续的写入命令可以被接受和执行。在写入数据 之前,需要发送写使能命令来确保闪存芯片处于可写状态。然后,才能发送写入命令将数据写入指定的存储位置。 使用写使能命令可以有效地保护数据的完整性和安全性,防止误操作对数据进行写入或者修改。同时,也能够确保 数据的一致性,避免写入过程中出现错误或者干扰。因此,在使用W25Q64进行写入操作时,需要先发送写使能命 令,以确保闪存芯片处于可写状态,再进行数据的写入操作。
W25Q64的数据手册中,关于写使能的时序如下:
操作步骤:
- 将CS端拉低为低电平;
- 发送指令 06H(0000_0110);
- 恢复CS端为高电平;
具体实现代码如下:
在W25Q64的数据手册中,有3个状态寄存器,可以判断当前W25Q64是否正在传输、写入、读取数据等,我们每一次要对W25Q64进行操作时,需要先判断W25Q64是否在忙。如果在忙的状态,我们去操作W25Q64,很可能会导致数据丢失,并且操作失败。而判断是否忙,是通过状态寄存器1的S0为进行判断,状态寄存器1的地址为0X05。
读取状态寄存器的时序图如下:
- 拉低CS端为低电平;
- 发送指令05h(0000_0101);
- 接收状态寄存器值;
- 恢复CS端为高电平;
具体实现代码如下:
W25Q64闪存芯片的内存分配是按照扇区(Sector)和块(Block)进行的,每个扇区的大小为4KB,每个块包含16个扇区,即一个块的大小为64KB。
W25Q64闪存芯片的扇区擦除是指将某个特定扇区中的数据全部擦除的操作。擦除操作会将扇区中的所有数据都置为1(即0xFF),恢复到初始状态。
扇区擦除操作是一种高级操作,需要小心谨慎地使用。在实际应用中,通常会结合编程逻辑和相应的控制器来管理闪存芯片的擦除和写入操作,以确保数据的安全性和完整性。
扇区擦除的时序图如下:
- 拉低CS端为低电平;
- 发送指令20h(0010_0000);
- 发送24位的扇区首地址;
- 恢复CS端为高电平;
具体实现代码如下: 以下代码跟扇区擦除时序图有一些差别,多了忙判断和写使能。
现在写入数据的前置步骤:擦除数据->写使能->判断忙 我们都完成了,只剩下将数据写入到对应地址中保存即可。
具体写入数据代码如下:
读取数据的时序图如下:
- 拉低CS端为低电平;
- 发送指令03h(0000_0011);
- 发送24位读取数据地址;
- 接收读取到的数据;
- 恢复CS端为高电平;
具体实现代码如下:
创建两个文件,分别命名为spi_flash.c和spi_flash.h。往里面写入完整代码:
spi_flash.c
spi_flash.h
在main.c中编写如下代码:
验证现象:验证读写功能。
- 读取到ID为 EF16;
- 先读数据,发现数据是空的。
- 写入数据 "嘉立创"。
- 再读数据,发现读出的数据为 "嘉立创"。
- 结束后清空Flash。
创建两个文件,分别命名为spi_flash.c和spi_flash.h。往里面写入完整代码:
spi_flash.c
spi_flash.h
在main.c中编写如下代码:
验证现象:验证读写功能。
- 读取到ID为 EF16;
- 先读数据,发现数据是空的。
- 写入数据 "嘉立创"。
- 再读数据,发现读出的数据为 "嘉立创"。
- 结束后清空Flash。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/15283.html