用nios读写串行flash-M25P16

2019-03-25 10:17发布

用了sopc里面的spi—controller,通过一下程序向flash的指定地址写一个数据,在从这个地址把数据读出来。

程序如下:

#include "system.h"
#include "altera_avalon_spi_regs.h"  //定义了SPI寄存器的基本信息
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"    //Altera自定义的一些数据类型
#include "altera_avalon_spi.h"        //提供了访问SPI的函数声明
#include <stdio.h>
#include "string.h"

/*========================
       写允许
* ===================*/
void write_enable(){  
    IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_0_BASE, 1); // ss_1 为片选
    usleep(200);
    IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_0_BASE , 0x06);
    usleep(200);
    IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_0_BASE, 0); // ss_0 为片选
}

/*========================
       写禁止
* ===================*/
void write_wrdi(){  
    IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_0_BASE, 1); // ss_1 为片选
    usleep(200);
    IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_0_BASE , 0x04);
    usleep(200);
    IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_0_BASE, 0); // ss_0 为片选
}


/*========================
    芯片擦除
* ===================*/
void chip_erease(void)
{
//    IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_0_BASE, 1); // ss_1 为片选
    write_enable();
    IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_0_BASE, 1); // ss_1 为片选
    usleep(200);
    IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_0_BASE , 0xc7);
    usleep(500);   
    IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_0_BASE, 0); // ss_0 为片选
    usleep(200);   
}


/*========================
  使能状态寄存器写
* ===================*/
void state_register_wr_en(void)
{
    IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_0_BASE, 1); // ss_1 为片选
    usleep(200);
    IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_0_BASE , 0x50);
    IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_0_BASE, 0); // ss_0 为片选
}

/*========================
  写状态寄存器
* ===================*/
void state_register_wr(void)
{
    IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_0_BASE, 1); // ss_1 为片选
    IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_0_BASE , 0x01);
    IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_0_BASE , 0x00);
    usleep(200);
    IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_0_BASE, 0); // ss_0 为片选
    usleep(200);
}


/*========================
  通过spi写一个字节数据
* ===================*/
void send_byte(alt_u8 data){
    IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_0_BASE, 1); // ss_1 为片选
    usleep(200);
    IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_0_BASE , 0x00);//发送地址
    IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_0_BASE , 0x01);//发送地址
    IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_0_BASE , 0x01);//发送地址
    IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_0_BASE , data);//发送数据
    usleep(200);
    IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_0_BASE, 0); // ss_0 为片选
}

/*========================
    读数据
* ===================*/
alt_u8 rev_byte(){
    alt_u8 data;
write_enable();
    IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_0_BASE, 1); // ss_1 为片选
    usleep(200);
    IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_0_BASE , 0x03);//发送读指令
    IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_0_BASE , 0x00);//发送地址
    IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_0_BASE , 0x01);//发送地址
    IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_0_BASE , 0x01);//发送地址
    write_wrdi();
    data = IORD_ALTERA_AVALON_SPI_RXDATA(SPI_0_BASE);//读数据

return data;
}




int main(void)  
{

    alt_u8 i,k;
    alt_u32 j,status,id;

    chip_erease();
    printf(" ========== writing now ! ============= ");
    write_enable();  

    for(i=0;i<1;i++){
        while (!(IORD_ALTERA_AVALON_SPI_STATUS(SPI_0_BASE) & ALTERA_AVALON_SPI_STATUS_TRDY_MSK));
            send_byte(i);
           printf(" write data = %x ",i);
        }
      write_wrdi();
      
      printf(" ======= reading now ! ================ ");
      for(j=0;j<1;j++){
        k = rev_byte();
             printf(" read data = %x ",k);
      }

    return 0;
}

打印如下:
========== writing now ! =============

write data = 0

======= reading now ! ================

read data = ff

不知道哪里出错了 ,希望哪位朋友可以指点一下,不胜感激! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。