打印

用nios读写串行flash-M25P16的问题

[复制链接]
2494|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
burton51973198|  楼主 | 2011-7-6 17:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用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

不知道哪里出错了 ,希望哪位朋友可以指点一下,不胜感激!

相关帖子

沙发
burton51973198|  楼主 | 2011-7-7 09:07 | 只看该作者
肿么没人回复~~~~:L

使用特权

评论回复
板凳
burton51973198|  楼主 | 2011-7-8 18:30 | 只看该作者
额~~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

10

帖子

1

粉丝