用UP3,没有SLS 61LV6416的IPCore,只好自己做存储控制。是一个64K*16BIT的片外SRAM,对应开发板上的连接,管脚都没有错,用三态脚。现在用下面的程序控制电路,可是发现测试的时候老是出错,请帮忙看看。写完之后,读取其中值的时候,发现返回的是错误的值。
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#define TEST_ADDR 0x0000
#define CONTROL_DEFAULT 0x1f //0001111
int write_sram(alt_u16 sram_addr,int data_wr)
{
//data_int should between :-32000 to 32000
//follow the following steps to write
//step1: enable LB 0 UB 0 00011100
//step2: write addr_l addr_h and data_l data_h
//step3: enable WE 0 disable OE:1 00010100
//step4: enable CE:0 00000100
//step5: wait for a while
//step6: disable CE:1 00011111
int i=0;
alt_u16 data=(alt_16)data_wr;
alt_u8 sram_addr_l=0x00;
alt_u8 sram_addr_h=0x00;
alt_u8 data_l=0x00;
alt_u8 data_h=0x00;
data_l=(alt_u8) (data&0x00ff);
data_h=(alt_u8) ((data&0xff00)>>8);
sram_addr_l=(alt_u8) (sram_addr&0x00ff);
sram_addr_h=(alt_u8) ((sram_addr&0xff00)>>8);
IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, CONTROL_DEFAULT); //step0
IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, 0x1c); //step1
IOWR_ALTERA_AVALON_PIO_DATA(ADDR_H_BASE, sram_addr_h); //step2
IOWR_ALTERA_AVALON_PIO_DATA(ADDR_L_BASE, sram_addr_l);
IOWR_ALTERA_AVALON_PIO_DATA(DATA_H_BASE, data_h);
IOWR_ALTERA_AVALON_PIO_DATA(DATA_L_BASE, data_l);
IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, 0x14); //step3
IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, 0x04); //step4
i = 0; //step5
while (i<2000)
i++;
IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE,CONTROL_DEFAULT); //step6
return(1);
}
int read_sram(alt_u16 sram_addr,int *data_rd)
{
//data_rd can between: -32000 to 32000
//follow the following steps to read
//step0: disable chip:CE:1
//step1: enable LB 0 UB 0 00011100
//step2: write addr_l addr_h
//step3: enable OE 0 disable WE:1 00011000
//step4: enable chip:CE:0 00001000
//step5: read data_l data_h
//step6: disable CE:1 00011111
int i=0;
alt_u16 data=0;
alt_u8 sram_addr_l=0x00;
alt_u8 sram_addr_h=0x00;
alt_u8 data_l=0x00;
alt_u8 data_h=0x00;
//data_l=(alt_u8) (data&0x00ff);
//data_h=(alt_u8) ((data&0xff00)>>8);
//sram_addr_l=(alt_u8) (sram_addr&0x00ff);
//sram_addr_h=(alt_u8) ((sram_addr&0xff00)>>8);
IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, CONTROL_DEFAULT); //step0
IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, 0x1c); //step1
IOWR_ALTERA_AVALON_PIO_DATA(ADDR_H_BASE, sram_addr_h); //step2
IOWR_ALTERA_AVALON_PIO_DATA(ADDR_L_BASE, sram_addr_l);
IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, 0x18); //step3
IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, 0x08); //step4
i = 0;
while (i<2000)
i++;
data_h=IORD_ALTERA_AVALON_PIO_DATA(DATA_H_BASE); //step5
data_l=IORD_ALTERA_AVALON_PIO_DATA(DATA_L_BASE);
i = 0;
while (i<2000)
i++;
IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE,CONTROL_DEFAULT); //step6
data=(alt_u16)(data_l)+(alt_u16)(data_h<<8);
*data_rd=(int)data;
return(1);
}
int main (void) __attribute__ ((weak, alias ("alt_main")));
int alt_main (void)
{
alt_u8 led = 0x00;
volatile int i;
int data_wr1=0;
int data_rd1=0;
data_rd1=3;
data_wr1=15;
write_sram(TEST_ADDR,data_wr1);
read_sram(TEST_ADDR,&data_rd1);
led=(alt_u8)(data_rd1);
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);
while (1)
{
/*
data_rd1=0;
data_wr1++;
write_sram(TEST_ADDR,data_wr1);
read_sram(TEST_ADDR,&data_rd1);
led=(alt_u8)(data_rd1>>0);
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);
//IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);
* */
i = 0;
while (i<200000)
i++;
}
return 0;
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |