0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于MM32F0140的SPI与W25Q80通信

灵动MM32MCU 来源:灵动MM32MCU 2023-09-21 17:26 次阅读

前提

查看MM32F0140的MiniBoard原理图,SPI挂载了W25Q80。

45ab9e50-585f-11ee-939d-92fbcf53809c.png

一、SPI介绍

串行外设接口,Serial Peripheral Interface。一种高速的、全双工、同步的串行通信总线。主要应用于EEPROM、FLASH、AD转换器,还有数字信号处理器和数字信号解码器之间。

SPI 支持同时发送和接收数据,采用主从工作方式。SPI 通过 4 个引脚与外部器件相连,分别是:

MOSI:主设备输出、从设备输入引脚。传输方向为主设备发送到从设备。

MISO:主设备输入、从设备输出引脚。传输方向为从设备发送到主设备。

SCK:串行时钟信号,由主设备产生并提供给从设备。

NSS:片选信号,从设备选择。

下图示意主、从设备之间一对一通信时的连接情况:

45bdcf08-585f-11ee-939d-92fbcf53809c.png

主设备负责发起通信请求,从设备负责响应,从设备通过 SCK 引脚得到主设备提供的时钟信号,从而使得主、从设备均使用同一个时钟进行同步的全双工通信。对于从设备而言,MOSI 引脚输入来自主设备的发送数据,MISO 引脚输出响应数据传给主设备。

SPI 需要根据从机特性,选配时钟极性(CPOL)和时钟相位(CPHA),比如从机时钟空闲时为低电平,且在时钟信号的第一个跳变沿采样,此时时序见下图:

45d4b2b8-585f-11ee-939d-92fbcf53809c.png

二、W25Q80介绍

W25Q80是一种串行闪存存储器,主要特点包括:

容量:8 Mbit(1 MB)的存储容量,可以存储大量数据。

SPI接口:采用SPI接口进行数据通信,具备高速的数据传输能力。

快速读取:支持快速的连续读取操作,可提供高效的读取性能。

块擦除:支持块擦除功能,可以批量擦除数据,提高擦除效率。

低功耗:采用低功耗设计,适用于对功耗要求较高的应用场景。

W25Q80可以划分为 4096 个扇区,每个扇区包含 256 个页,每个页的大小为 256 字节。

下图为W25Q80的指令:

45e8d8b0-585f-11ee-939d-92fbcf53809c.png

三、例程

1.介绍

本例程实现SPI与W25Q80通信,SPI查询W25Q80的设备号,并全片擦除后写入数据,再读取出来,看写入的数据与读取的数据是否一致。

2.编码详情

1)初始化配置SPI,速度为PCLK1(36MHz)的32分频,约为1.125MHz;

SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStructure.SPI_DataWidth=8;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_32;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_Init(SPI2,&SPI_InitStructure);
exSPI_DataEdgeAdjust(SPI2,SPI_DataEdgeAdjust_FAST);
SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Tx);
SPI_BiDirectionalLineConfig(SPI2,SPI_Direction_Rx);
SPI_Cmd(SPI2,ENABLE);

2)编写SPI发送和读取数据的函数

uint32_twriteAndReadData(uint8_tdata)
{
SPI_SendData(SPI2,data);
while(1){
if(SPI_GetFlagStatus(SPI2,SPI_FLAG_TXEPT)){
break;
}
}
while(1){
if(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXAVL)){
returnSPI_ReceiveData(SPI2);
}
}
}

3)获取W25Q80的设备ID

SPI_CSInternalSelected(SPI2,ENABLE);//片选
writeAndReadData(0x9F);//读ID指令
ID|=writeAndReadData(0x00)<< 16;
    ID |= writeAndReadData(0x00) << 8;
    ID |= writeAndReadData(0x00);
    SPI_CSInternalSelected(SPI2, DISABLE); // 取消片选
    printf("

read device id: %X", ID);

4)全片擦除W25Q80,并检查状态等待擦除完成

SPI_CSInternalSelected(SPI2,ENABLE);
writeAndReadData(0x06);//写使能
SPI_CSInternalSelected(SPI2,DISABLE);

SPI_CSInternalSelected(SPI2,ENABLE);
writeAndReadData(0xC7);//全片擦除指令
SPI_CSInternalSelected(SPI2,DISABLE);

SPI_CSInternalSelected(SPI2,ENABLE);
writeAndReadData(0x05);//读状态寄存器
while(1){
temp=writeAndReadData(0x00);
if((temp&0x01)==0x0)//擦除完成
break;
}
SPI_CSInternalSelected(SPI2,DISABLE);
printf("

erasecomplete");

5)写数据,并检查状态等待写完

for(i=0;i< 256; i++) txData[i] = i;
    SPI_CSInternalSelected(SPI2, ENABLE);
    writeAndReadData(0x06);// 写使能
    SPI_CSInternalSelected(SPI2, DISABLE); 

    SPI_CSInternalSelected(SPI2, ENABLE);
    writeAndReadData(0x02); // 页编程
    writeAndReadData(0x00); // 页地址
    writeAndReadData(0x00);
    writeAndReadData(0x00);
    for (i = 0; i < 256; i++)
    {
        writeAndReadData(txData[i]);
    }
    SPI_CSInternalSelected(SPI2, DISABLE); 

    SPI_CSInternalSelected(SPI2, ENABLE);
    writeAndReadData(0x05); // 读状态寄存器
    while(1) {
        temp = writeAndReadData(0x00);
        if((temp & 0x01) == 0x0) // 页编程完成
            break;
    }
    SPI_CSInternalSelected(SPI2, DISABLE);
    printf("

page programm complete");

6)读数据,并打印出来

SPI_CSInternalSelected(SPI2,ENABLE);
writeAndReadData(0x03);//读数据
writeAndReadData(0x00);//页地址
writeAndReadData(0x00);
writeAndReadData(0x00);
for(i=0;i< 10; i++)
    {
        rxData[i] = writeAndReadData(0x00);
    }
    SPI_CSInternalSelected(SPI2, DISABLE); 
    printf("

read data completely
");
    for (i = 0; i < 10; i++) 
        printf("
rxDate[%d] = %d", i, rxData[i]);

3.串口输出结果

下图为串口输出数据,基本符合程序流程和结果。

469c2834-585f-11ee-939d-92fbcf53809c.png

4.逻辑分析仪

下图为逻辑分析仪截取的发送接收图片,可以清楚的看到当前SCK速度接近1.125MHz,以及发送数据也符合预期。

46b155f6-585f-11ee-939d-92fbcf53809c.png







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 解码器
    +关注

    关注

    9

    文章

    1143

    浏览量

    40744
  • FlaSh
    +关注

    关注

    10

    文章

    1635

    浏览量

    148048
  • EEPROM
    +关注

    关注

    9

    文章

    1020

    浏览量

    81620
  • AD转换器
    +关注

    关注

    4

    文章

    250

    浏览量

    41420
  • CPHA
    +关注

    关注

    0

    文章

    8

    浏览量

    9385
收藏 人收藏

    评论

    相关推荐

    基于MM32F0140SPIW25Q80通信的实现方案

    串行外设接口,Serial Peripheral Interface。一种高速的、全双工、同步的串行通信总线。主要应用于EEPROM、FLASH、AD转换器,还有数字信号处理器和数字信号解码器之间。
    发表于 09-29 07:25 2244次阅读
    基于<b class='flag-5'>MM32F0140</b>的<b class='flag-5'>SPI</b>与<b class='flag-5'>W25Q80</b><b class='flag-5'>通信</b>的实现方案

    华邦存储器W25Q80, W25Q16, W25Q32系列的spi通讯

    华邦存储器W25Q80, W25Q16, W25Q32系列与stm32f1系列单片机的spi通讯2020.4.9
    发表于 12-22 19:37 30次下载
    华邦存储器<b class='flag-5'>W25Q80</b>, <b class='flag-5'>W25Q</b>16, <b class='flag-5'>W25Q</b>32系列的<b class='flag-5'>spi</b>通讯

    AN0052从MM32F0130移植到MM32F0140(英文版)

    AN0052 从MM32F0130移植到MM32F0140(英文版)
    发表于 02-22 18:43 0次下载
    AN0052从<b class='flag-5'>MM32F</b>0130移植到<b class='flag-5'>MM32F0140</b>(英文版)

    MM32F0140 产品手册(中文版)

    MM32F0140 产品手册(中文版)
    发表于 02-22 18:45 0次下载
    <b class='flag-5'>MM32F0140</b> 产品手册(中文版)

    MM32F0140 产品手册(英文版)

    MM32F0140 产品手册(英文版)
    发表于 02-22 18:45 0次下载
    <b class='flag-5'>MM32F0140</b> 产品手册(英文版)

    MM32F0140 用户手册(中文版)

    MM32F0140 用户手册(中文版)
    发表于 02-22 18:46 0次下载
    <b class='flag-5'>MM32F0140</b> 用户手册(中文版)

    MM32F0140 用户手册(英文版)

    MM32F0140 用户手册(英文版)
    发表于 02-22 18:46 0次下载
    <b class='flag-5'>MM32F0140</b> 用户手册(英文版)

    MM32F0140 勘误表(中文版)

    MM32F0140 勘误表(中文版)
    发表于 02-22 18:47 0次下载
    <b class='flag-5'>MM32F0140</b> 勘误表(中文版)

    MM32F0140 勘误表(英文版)

    MM32F0140 勘误表(英文版)
    发表于 02-22 18:48 0次下载
    <b class='flag-5'>MM32F0140</b> 勘误表(英文版)

    基于MM32F0140的UDS Bootloader学习笔记

    基于MM32F0140的UDS Bootloader学习笔记
    的头像 发表于 10-30 17:11 777次阅读
    基于<b class='flag-5'>MM32F0140</b>的UDS Bootloader学习笔记

    MM32F0140学习笔记——CRC

    MM32F0140学习笔记——CRC
    的头像 发表于 11-10 18:27 624次阅读
    <b class='flag-5'>MM32F0140</b>学习笔记——CRC

    MM32F0140 SPI学习笔记

    MM32F0140 SPI学习笔记
    的头像 发表于 09-26 16:51 603次阅读
    <b class='flag-5'>MM32F0140</b> <b class='flag-5'>SPI</b>学习笔记

    MM32F0140 DMA学习笔记

    MM32F0140 DMA 学习笔记
    的头像 发表于 09-18 16:57 711次阅读
    <b class='flag-5'>MM32F0140</b> DMA学习笔记

    MM32F0140 UART学习笔记

    MM32F0140 UART学习笔记
    的头像 发表于 09-26 16:45 767次阅读
    <b class='flag-5'>MM32F0140</b> UART学习笔记

    MM32F0140 GPIO学习笔记

    MM32F0140 GPIO学习笔记
    的头像 发表于 09-26 16:42 564次阅读
    <b class='flag-5'>MM32F0140</b> GPIO学习笔记