⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi_flash_test.c

📁 XILINX FPGA的MICROBLAZE处理器的SPI FLASH loader程序
💻 C
字号:
//-----------------------------------------------------------------------------////     AVNET IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS"//     SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR//     XILINX DEVICES.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION//     AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION//     OR STANDARD, AVNET IS MAKING NO REPRESENTATION THAT THIS//     IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT,//     AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE//     FOR YOUR IMPLEMENTATION.  AVNET EXPRESSLY DISCLAIMS ANY//     WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE//     IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR//     REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF//     INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS//     FOR A PARTICULAR PURPOSE.//     //     (c) Copyright 2005 AVNET, Inc.//     All rights reserved.////-----------------------------------------------------------------------------//***************************************************************************////// File:         spi_flash_test.c// Date:         November 10, 2005// Created by:   Bryan Fletcher// Description:  Test the M25P16 Flash on the Xilinx Spartan-3E Starter Board//               // Notes://***************************************************************************//#include "xparameters.h"#include "xbasic_types.h"#include "xspi_l.h"#include "SF_commands.h"#define SCK_FASTER_THAN_20MHz 0        // Determines whether READ or FAST_READ is usedint main(void){  Xuint8   send_data[16], recv_data[16];  Xuint8   NumBytesRcvd, mfg_id, did_up, did_low, error, SF_sr;  Xuint16  sector_select, page_select;  Xuint16  spi_control_reg;  Xuint32  spi_ss_reg, i, j;  xil_printf("Serial Flash Test\n\r");		    Initialize_Spi_Controller(XPAR_SPI_FLASH_BASEADDR);
  
// Readback control register and compare with expected value//  spi_control_reg = XSpi_mGetControlReg(XPAR_SPI_FLASH_BASEADDR);//  xil_printf("%x\n\r",spi_control_reg);//  xil_printf("%x\n\r",INIT_CREG);
// The SPI core has an issue where SCK sometimes doesn't start up 
// immediately.  A delay is necessary.  The Block Protect (BP) bits
// are set to a known value.  When the value read back matches
// the written value, then the core is ready.  do  {      SF_write_status_register (XPAR_SPI_FLASH_BASEADDR, 0x1c);	SF_sr = SF_read_status_register(XPAR_SPI_FLASH_BASEADDR);	//xil_printf("SF SR = : %x \n\r", SF_sr);  }  while(SF_sr != 0x1C);//  SF_sr = SF_read_status_register(XPAR_SPI_FLASH_BASEADDR);//  xil_printf("SF SR = : %x \n\r", SF_sr);
// Turn off all BP bits to make the device writable//  do  {      SF_write_status_register (XPAR_SPI_FLASH_BASEADDR, 0x00);	//SF_sr = SF_read_status_register(XPAR_SPI_FLASH_BASEADDR);	//xil_printf("SF SR = : %x \n\r", SF_sr);  }//  while(SF_sr != 0x00);//  SF_sr = SF_read_status_register(XPAR_SPI_FLASH_BASEADDR);//  xil_printf("SF SR = : %x \n\r", SF_sr);// Get the Manufacturer's ID  // Set op-code to Read ID  send_data[0] = RDID;  // send_data[1:3] are don't care  // transfers 1:3 are to retrieve 3 byte ID on recv_data[1:3]
  // recv_data[0] is don't care
  
  //Enable the SPI controller core  XSpi_Set_Enable(XPAR_SPI_FLASH_BASEADDR);
  
  // Assert the select line manually to the SPI Flash  XSpi_mSetSlaveSelectReg(XPAR_SPI_FLASH_BASEADDR, SPI_FLASH_SELECT);
  
  // Transfer the op-code and retrieve the ID  spi_transfer(send_data, recv_data, 4);
  
  // Deselect the SPI Flash and disable the controller  XSpi_mSetSlaveSelectReg(XPAR_SPI_FLASH_BASEADDR, SPI_NONE_SELECT);  XSpi_mDisable(XPAR_SPI_FLASH_BASEADDR);  mfg_id       = recv_data[1];  did_up       = recv_data[2];  did_low      = recv_data[3];  xil_printf("Manufacturer Code = : %x \n\r", mfg_id);  xil_printf("Memory Type       = : %x \n\r", did_up);  xil_printf("Memory Capacity   = : %x \n\r", did_low);  xil_printf("M25P16 = 20, 20, 15\n\r");// Perform a Chip Erase  xil_printf("\n\rChip Erase Starting\n\r");  SF_bulk_erase(XPAR_SPI_FLASH_BASEADDR);  xil_printf("Chip Erase Complete - verifying\n\r");// Verify Chip Erase  SF_start_read(XPAR_SPI_FLASH_BASEADDR, 0x00, 0x00, 0x00, SCK_FASTER_THAN_20MHz);  error = 0;  for (i = 0; i < SF_BYTES/16; i++)  {    spi_transfer(send_data, recv_data, 16);    for (j = 0; j < 16; j++)    {      if(recv_data[j] != 0xFF)      {        xil_printf("Error at i = %x, j = %x\n\r", i,j);        j = 16;        i = SF_BYTES;        error = 1;      }    }  }  if(!error)    xil_printf("Erase verified\n\r");  SF_end_read (XPAR_SPI_FLASH_BASEADDR);// Write Test  xil_printf("\n\rData being written\n\r");  for(sector_select = 0; sector_select < SF_SECTORS; sector_select++)    for(page_select = 0; page_select < SF_PAGES_PER_SECTOR; page_select++)	{      SF_start_page_program (XPAR_SPI_FLASH_BASEADDR, sector_select, page_select, 0x00);      for (i = 0; i < SF_BYTES_PER_PAGE; i+=16)      {        for(j = 0; j < 16; j++)          send_data[j]  = i + j;        spi_transfer(send_data, recv_data, 16);      }      SF_end_page_program (XPAR_SPI_FLASH_BASEADDR);    }  xil_printf("Test Data Written; reading back\n\n\r", i);    // Readback all bytes  SF_start_read (XPAR_SPI_FLASH_BASEADDR, 0x00, 0x00, 0x00, SCK_FASTER_THAN_20MHz);  error = 0;  for (i = 0; i < SF_BYTES; i+=16)  {    spi_transfer(send_data, recv_data, 16);    //xil_printf("%x Data read was %x\n\r",i,recv_data[0]);    for(j = 0; j < 16; j++)	{      if(recv_data[j] != ((i + j) & 0xFF))	  {        xil_printf("Error at i = %x, j = %x\n\r", i,j);		xil_printf("Data read was %x\n\r", recv_data[j]);		xil_printf("Exp. data was %x\n\r", (i+j));        j = 16;        i = SF_BYTES;        error = 1;      }    }  }  if(!error)    xil_printf("Flash Test PASSED!\n\r");  SF_end_read (XPAR_SPI_FLASH_BASEADDR);  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -