6351|6

86

帖子

0

资源

一粒金砂(中级)

用nios读写串行flash-M25P16 [复制链接]

用了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
#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("\n========== writing now ! =============\n ");
    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("\n write data = %x\n ",i);
        }
      write_wrdi();
      
      printf("\n======= reading now ! ================\n ");
      for(j=0;j<1;j++){
        k = rev_byte();
             printf("\n read data = %x\n ",k);
      }

    return 0;
}

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

write data = 0

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

read data = ff

不知道哪里出错了 ,希望哪位朋友可以指点一下,不胜感激!
此帖出自FPGA/CPLD论坛

回复

8909

帖子

0

资源

五彩晶圆(高级)

哈哈!等你消息了
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!

回复

86

帖子

0

资源

一粒金砂(中级)

肿么没人回复~~~~~

回复

86

帖子

0

资源

一粒金砂(中级)

回复 楼主 burton 的帖子

版主也在调这个?

回复

86

帖子

0

资源

一粒金砂(中级)

额··还是迷人啊~~~~

回复

8909

帖子

0

资源

五彩晶圆(高级)

怎么没消息?

个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!

回复

86

帖子

0

资源

一粒金砂(中级)

额,,,周末休息··这两天得忙着调其他东西~~~~

回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表