用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

不知道哪里出错了 ,希望哪位朋友可以指点一下,不胜感激! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
eeleader
1楼-- · 2019-03-25 13:19
< / 哈哈!等你消息了
burton
2楼-- · 2019-03-25 16:46
 精彩回答 2  元偷偷看……
burton
3楼-- · 2019-03-25 20:44
版主也在调这个?
burton
4楼-- · 2019-03-26 02:20
额··还是迷人啊~~~~
eeleader
5楼-- · 2019-03-26 06:41

怎么没消息?

burton
6楼-- · 2019-03-26 10:08
额,,,周末休息··这两天得忙着调其他东西~~~~

一周热门 更多>