用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
不知道哪里出错了 ,希望哪位朋友可以指点一下,不胜感激! |