深入探索STM32的SPI功能:W25Q64 Flash存储器全攻略

2024-06-29 1179阅读

摘要

随着嵌入式系统对存储需求的增长,选择合适的存储设备变得尤为重要。W25Q64 Flash存储器以其8Mbit的存储容量和SPI接口的便捷性,成为STM32微控制器项目中的优选存储方案。本文将深入探索STM32的SPI功能,提供W25Q64 Flash存储器的全面集成指南,包括硬件配置、SPI接口编程和实际代码示例。

深入探索STM32的SPI功能:W25Q64 Flash存储器全攻略
(图片来源网络,侵删)

1. SPI通信基础

SPI是一种同步串行通信协议,广泛应用于微控制器与外设间的通信。主要特性包括:

  • 主从模式:一个主设备控制多个从设备。
  • 全双工通信:同时发送和接收数据。
  • 时钟同步:数据传输由主设备时钟信号同步。

    2. W25Q64 Flash存储器特性

    W25Q64是一款串行Flash存储器,具备以下特性:

    • 容量:8Mbit,即1M字节。
    • 组织:分为128个扇区,每扇区含16页,每页256字节。
    • 擦写次数:高达100万次。
    • 工作电压:2.7V至3.6V。

      3. 硬件连接

      W25Q64与STM32的硬件连接包括:

      • CS(片选)接至STM32 GPIO(如PA4)。
      • SCK(时钟)接至STM32 SPI时钟引脚(如PA5)。
      • MOSI(主设备数据输出)接至STM32 SPI MOSI引脚(如PA7)。
      • MISO(主设备数据输入)接至STM32 SPI MISO引脚(如PA6)。
      • VCC接3.3V,GND接地。

        4. SPI接口配置

        4.1 硬件SPI初始化

        硬件SPI初始化代码示例:

        void SPI_Hardware_Init(void) {
            GPIO_InitTypeDef GPIO_InitStructure;
            SPI_InitTypeDef SPI_InitStructure;
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB1Periph_SPI1, ENABLE);
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
            GPIO_Init(GPIOA, &GPIO_InitStructure);
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
            GPIO_Init(GPIOA, &GPIO_InitStructure);
            SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
            SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
            SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
            SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
            SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
            SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
            SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
            SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
            SPI_Init(SPI1, &SPI_InitStructure);
            SPI_Cmd(SPI1, ENABLE);
        }
        
        4.2 W25Q64初始化

        W25Q64初始化涉及SPI初始化和芯片特定设置。

        void W25Q64_Init(void) {
            SPI_Hardware_Init();
            // 发送W25Q64的复位指令(如果需要)
        }
        

        5. W25Q64 Flash存储器操作

        5.1 读取W25Q64 ID

        读取ID用于验证W25Q64芯片。

        uint16_t W25Q64_ReadID(void) {
            uint16_t id = 0;
            SPI_CS_Low();
            SPI_SendByte(0x90); // READ ID COMMAND
            id = SPI_ReceiveByte() 
            SPI_CS_Low();
            SPI_SendByte(0x02); // PAGE PROGRAM COMMAND
            SPI_SendByte(addr > 16);
            SPI_SendByte(addr >> 8);
            SPI_SendByte(addr);
            SPI_SendByte(data);
            SPI_CS_High();
            // 等待写入完成...
        }
        
        5.3 从W25Q64读取数据

        读取数据操作允许从指定地址读取信息。

        uint8_t W25Q64_ReadByte(uint32_t addr) {
            uint8_t data;
            SPI_CS_Low();
            SPI_SendByte(0x03); // READ DATA COMMAND
            SPI_SendByte(addr >> 16);
            SPI_SendByte(addr >> 8);
            SPI_SendByte(addr);
            data = SPI_ReceiveByte();
            SPI_CS_High();
            return data;
        }
        

        6. 完整示例代码

        以下是STM32与W25Q64通信的完整示例代码。

        int main(void) {
            SystemInit();
            W25Q64_Init();
            uint16_t id = W25Q64_ReadID();
            printf("W25Q64 ID: 0x%X\r\n", id);
            uint32_t testAddr = 0x000000; // 测试地址
            uint8_t testData = 0xAA; // 测试数据
            W25Q64_WriteByte(testAddr, testData); // 写入数据
            // 延迟一段时间,等待数据写入完成
            for (volatile int i = 0; i  
        

        7. 结论

        本文深入探索了STM32的SPI功能,并提供了W25Q64 Flash存储器的全攻略。从SPI通信的基础到W25Q64的特性,再到具体的硬件连接和SPI接口编程,本文为读者提供了全面的集成方案。示例代码进一步演示了如何在实际项目中应用这些知识,帮助读者深入理解和掌握SPI通信技术。

        ✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

        ❤欢迎关注我的知乎:对error视而不见

        代码获取、问题探讨及文章转载可私信。

        ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

        🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

        点击领取更多详细资料

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]