7965|6

83

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

用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论坛

最新回复

怎么没消息?  详情 回复 发表于 2011-7-11 08:55
点赞 关注
 

回复
举报

6892

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 
哈哈!等你消息了
此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 

回复

83

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
肿么没人回复~~~~~
此帖出自FPGA/CPLD论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 楼主 burton 的帖子

版主也在调这个?
此帖出自FPGA/CPLD论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(中级)

5
 
额··还是迷人啊~~~~
此帖出自FPGA/CPLD论坛
 
 
 

回复

6892

帖子

0

TA的资源

五彩晶圆(高级)

6
 

怎么没消息?

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

回复

83

帖子

0

TA的资源

一粒金砂(中级)

7
 
额,,,周末休息··这两天得忙着调其他东西~~~~
此帖出自FPGA/CPLD论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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