武林教你学PIC32(十七)SPI操作M25P16 FLASH存储器

发布者:mu22最新更新时间:2017-02-17 来源: eefocus关键字:武林  PIC32  SPI操作  M25P16  FLASH  存储器 手机看文章 扫描二维码
随时随地手机看文章

首先介绍下TI 的 M25P16,它是 16Mbit(2Mbyte)的FLASH存储器,与常用的华邦公司的W25X16,ATMEL公司的AT51DB161比较接近。最高支持50M的SPI时钟,存储器可以以1到256字节byte,使用页编程操作将2M的容量分为32个块(Block),每个块含有256页,每页里有256字节宽带,因此整个存储器包含8192页或者2,097,152字节。操作命令为:

我们根据这些命令,做好下面封装函数:

//需要外接函数

extern unsigned char SPI_FLASH_SendByte(unsigned char ch);

extern unsigned char SPI_FLASH_ReadByte(unsigned char ch);

//高级函数

u32 SPI_FLASH_ReadID(void);//读取芯片ID正确发回0X202015

u8 SPI_FLASH_ByteRead(u32 ReadAddr);//读一个数据

void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead);

 

void SPI_FLASH_PageWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite);//页写

void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite);

 

void SPI_FLASH_SectorErase(u32 SectorAddr);//扇区擦除

void SPI_FLASH_BulkErase(void);//全部擦除

void SPI_Flash_PowerDown(void); //进入掉电模式 

void SPI_Flash_WAKEUP(void);//唤醒 

//底层函数

void SPI_FLASH_WriteEnable(void);

void SPI_FLASH_WriteDisable(void);

void SPI_FLASH_WaitForWriteEnd(void);

 

我们申请到的FLASH模块与SPI2连接,如图所示:

 


主函数里面实现这样的测试功能:首先测试芯片的型号,看是不是TI M25P16芯片,然后擦除扇区,再写入要测试的数据,最后读回来看是不是这些内容。


主函数代码:

#include "usart2.h"

#include "spi2.h"

#include "m25p16.h"

#include "led.h"

/* Private typedef -----------------------------------------------------------*/

typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;

/* Private define ------------------------------------------------------------*/

#define  FLASH_WriteAddress     0x00100

#define  FLASH_ReadAddress      FLASH_WriteAddress

#define  FLASH_SectorToErase    FLASH_WriteAddress

#define  sFLASH_ID       0x202015

 

#define  BufferSize (countof(Tx_Buffer)-1)

 

/* Private macro -------------------------------------------------------------*/

#define countof(a) (sizeof(a) / sizeof(*(a)))

/* Private variables ---------------------------------------------------------*/

uint8_t Tx_Buffer[] = "\n\r欢迎访问EEFOUCS MIPS社区 http://mips.eefocus.com/bbs/index_list.html\r\n SPI Flash Test Example: communication with an TI M25P16 SPI FLASH\r\n";

uint8_t Index, Rx_Buffer[BufferSize];

volatile TestStatus TransferStatus1 = FAILED, TransferStatus2 = PASSED;

uint32_t FlashID = 0;

/* Private function prototypes -----------------------------------------------*/

TestStatus Buffercmp(uint8_t *pBuffer1, uint8_t *pBuffer2, uint16_t BufferLength);

int main(void)

{

       usart2_init(9600);

       init_spi2();

       LED_INIT();

        /* Get SPI Flash Device ID */

      FlashID = SPI_FLASH_ReadID();

      printf("\r\n Device ID is 0x%X \r\n", FlashID);

      if (FlashID == sFLASH_ID)

       {

         /* Turn on LED1 */

         LED1_ON();//表明检测到FLASH芯片

      

         printf("\r\n ST M25P16 Identitied!\r\n");

      

         /* Perform a write in the Flash followed by a read of the written data */

         /* Erase SPI FLASH Sector to write on */

         SPI_FLASH_SectorErase(FLASH_SectorToErase);

      

         printf("Tx_Buffer:%s", Tx_Buffer);

        

         /* Write Tx_Buffer data to SPI FLASH memory */

         SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize);

      

         /* Read data from SPI FLASH memory */

         SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);

        printf("Rx_Buffer:%s", Rx_Buffer);

         /* Check the corectness of written dada */

         TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);

        

      

         /* Perform an erase in the Flash followed by a read of the written data */

         /* Erase SPI FLASH Sector to write on */

         SPI_FLASH_SectorErase(FLASH_SectorToErase);

      

         /* Read data from SPI FLASH memory */

         SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);

      

         /* Check the corectness of erasing operation dada */

         for (Index = 0; Index < BufferSize; Index++)

         {

           if (Rx_Buffer[Index] != 0xFF)//因为擦除后都为0XFF

           {

             TransferStatus2 = FAILED;

             break;

           }

         }

        

         /* TransferStatus2 = PASSED, if the specified sector part is erased */

         /* TransferStatus2 = FAILED, if the specified sector part is not well erased */

      

         if((PASSED == TransferStatus1) && (PASSED == TransferStatus2))

         {

             /* OK: Turn on LED2 */

             LED2_ON();

             printf("\r\n M25P16 Test Suceed!\n\r");

         }

         else

         {

             LED4_ON();

             printf("\r\n -->Failed: M25P16 Test Failed!\n\r");

         }

       }

       else

       {

         /* Error: Turn on LED3 */

         LED3_ON();

         printf("\r\n M25P16 not detected!\n\r");

       }

       while(1);

}

TestStatus Buffercmp(uint8_t *pBuffer1, uint8_t *pBuffer2, uint16_t BufferLength)

{

  while(BufferLength--)

  {

    if(*pBuffer1 != *pBuffer2)

    {

      return FAILED;

    }

 

    pBuffer1++;

    pBuffer2++;

  }

 

  return PASSED;

}


关键字:武林  PIC32  SPI操作  M25P16  FLASH  存储器 引用地址:武林教你学PIC32(十七)SPI操作M25P16 FLASH存储器

上一篇:武林教你学PIC32(十八)单总线DS18B20温度传感器
下一篇:武林教你学PIC32(十六)模拟I2C LM75温度传感器

推荐阅读最新更新时间:2024-03-16 15:33

存储器产线加速半导体产能扩展
  根据市场研究公司IC Insights的资料,新的半导体制造产线——特别是DRAM 存储器 的导入,预计将推动2018年和2019年的 晶圆 总产能高于平均水准。下面就随网络通信小编一起来了解一下相关内容吧。   IC Insights最新的全球 晶圆 产能报告显示,2018年和2019年 晶圆 产能预计将成长8%,较2018年至2019年间晶圆产业的年平均成长更高约5%。   去年由于DRAM和NAND闪存库存短缺导致价格上涨,这使得半导体产业的销售额首次突破了4,000亿美元。据世界半导体贸易统计组织(WSTS)统计,去年 存储器 营收成长了61.5%,其中,DRAM销售额增加76.8%,NAND销售额则增加了47.5%
[网络通信]
Flash产能不给力 UFS称霸江湖梦碎
UFS与eMMC均是新一代的手机储存接口规格。由于eMMC效能已经难以满足新一代的行动视讯应用,UFS也成为接替eMMC呼声最高的新接口。关于今年度eMMC与UFS的发展趋势,尽管UFS十分被看好,但在今年NAND Flash却出现市场持续短缺的状况,主要原因是因为各家NAND Flash厂商陆续从2D转入3D制程,而3D的制程更为复杂,使得制作时程拖得更长。此外,投入资本与扩厂都需要时间,这造成原本预期UFS市场应在2016年就可以起飞,却到今手机采用率还不到10%的窘境。 Flash供货短缺已经对市场造成了影响。 图为慧荣科技推出的SSD控制芯片解决方案。 目前推广UFS最积极的莫过于三星与高通,今年高通推出835系列处理器
[半导体设计/制造]
Microchip PIC32系列再添新成员
全球领先的整合单片机、混合信号、模拟器件和闪存专利解决方案的供应商 Microchip Technology Inc.(美国微芯科技公司)日前发布了公司旗下功耗最低、性价比最高的32位PIC32单片机(MCU)系列新品。此次推出的Microchip PIC32MM系列器件填补了公司旗下热销产品PIC24F XLP系列和PIC32MX系列之间的空白。此外,该系列也是首批集成了独立于内核的外设的PIC32器件,旨在消除CPU的工作负荷从而降低功耗和系统设计成本。Microchip还为PIC32MM系列器件提供了Microchip MPLAB 代码配置器(MCC)支持,以便简化和加速设计过程。 如今,物联网(IoT)、消费、工业控制和
[单片机]
Microchip <font color='red'>PIC32</font>系列再添新成员
STM32 "flash download failed - Target dll has been cancelled"错误解决办法
在用mdk通过stlink烧写官方例程到stm32f429I discovery时,烧写了十来个程序都没问题,突然在烧写一个程序时,弹出了“flash download failed - Target dll has been cancelled”,然后后续的烧写都失败了。 原因可能是其中一个程序将stm32开发板设置成了休眠模式,导致后续的烧写都失败了。 从keil论坛帖子中 看到可以通过st-link utility来将flash全部擦除就能烧写了。 从http://www.st.com/web/en/catalog/tools/PF258168下载st-link utility并安装,选择Target- Conn
[单片机]
STM32 flash download failed - Target dll has been cancelled"错误解决办法" />
相变存储器:能实现全新存储器使用模型的新型存储器
相变存储器:能实现全新存储器使用模型的新型存储器 从下面的几个重要特性看,相变存储器(PCM)技术均符合当前电子系统对存储器子系统的需求: 容量 因为消费电子、计算机、通信三合一的应用趋势,所有电子系统的代码量都以幂指数的速率增长,数据增长速率甚至更快。 带宽和能耗 在应用高度融合的电子系统中,为了加快上网速度,采用带宽衡量系统性能;为了增强产品的移动使用性,采用功耗评价系统性能。存储器设计必须支持市场对扩大带宽和降低功耗的日益增长的需求。非易失性固态存储器是降低功耗的最佳方法。 存储器系统 为提高电子系统的总体性能,设计人员越来越关注存储器系统的容量、技术性能、封装和接口等参数。 缓存 存储器系统
[电源管理]
相变<font color='red'>存储器</font>:能实现全新<font color='red'>存储器</font>使用模型的新型<font color='red'>存储器</font>
芯片世界的革新:从二维平面跨入三维空间
  全球物联网、大数据中心、智能家居、便携设备等应用的发展不断丰富着我们的物质生活和精神生活,这些应用的正常运行都离不开半导体数据存储 芯片 ——仅一片指甲盖面积大小的 芯片 区域就可以存放约300套《大英百科全书》文字内容的高科技产品。近年来,人类社会的数据量迅速激增,一年产生的数据就相当于人类进入现代化以前所有历史的总和,这对 存储器 芯片 的容量和存储密度提出了更高要求。下面就随半导体设计制造小编一起来了解一下相关内容吧。   传统半导体 存储器 芯片通过提高单位面积的存储能力实现容量增长,但在后摩尔时代已不可避免地面临单元间串扰加剧和单字位成本增加等瓶颈。因此,寻求存储技术阶跃性的突破和创新,是发展下一代 存储器 的主流思
[半导体设计/制造]
科林研发Kiyo(R)系列产品为高级存储器提供关键导体刻蚀
Kiyo F系列产品面向3D NAND和高级DRAM,提供在片性能(On-Wafer Performance)和量产所需的高生产率 面 向半导体行业提供创新晶圆制造设备和服务的全球主要供应商科林研发(Lam Research Corp.)(纳斯达克股票代码:LRCX)今天宣布,其Kiyo(R) F系列导体刻蚀系统将有助于3D NAND和高级DRAM进入量产。这些应用的关键刻蚀要求包括:3D NAND要求严格的关键尺寸(CD)一致性和控制,DRAM要求均匀的刻蚀深度。凭借独家专有的Mixed-Mode Pulsing(MMP)技术,Kiyo F系列既能提供高级存储器应用所需要的性能,同时又能保证高生产率。因此,该产品在面向高级存储器
[半导体设计/制造]
和利时PLC与Flash存储设备进行自由口通讯方案
1、引言 和利时LM系列PLC是杭州和利时公司自主研发的小型一体化PLC产品。LM系列PLC具有可靠性高、指令丰富、通讯能力强等特点。其支持六种编程语言,包括LD、IL、FBD、SFC、ST、CFC,能够适应多种PLC编程基础的人群。一些大的控制系统具有很多现场设备,其中一部分现场设备可能不支持标准的通讯协议,但是还需要与第三方控制设备进行数据通讯,任何一个厂商的PLC都不可能支持所有现场设备的数据通信协议。如何实 PLC与非标准协议的第三方设备进行互联呢,LM系列PLC推出了自由口的通讯方式,可以实现与任何协议的第三方设备进行互联。本文介绍的是LM系列PLC通过自由口与 Flash存储设备进行数据通讯。 2、LM
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved