用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; }
|