diff --git a/src/fpga_spi.c b/src/fpga_spi.c index ab38f15..ed315ad 100644 --- a/src/fpga_spi.c +++ b/src/fpga_spi.c @@ -135,7 +135,8 @@ #include "timer.h" void fpga_spi_init(void) { - spi_init(SPI_SPEED_FPGA_FAST); + spi_init(SPI_SPEED_FAST); + BITBAND(FPGA_MCU_RDY_REG->FIODIR, FPGA_MCU_RDY_BIT) = 0; } void set_msu_addr(uint16_t address) { diff --git a/src/fpga_spi.h b/src/fpga_spi.h index fc4778f..201179f 100644 --- a/src/fpga_spi.h +++ b/src/fpga_spi.h @@ -29,6 +29,8 @@ #include #include "bits.h" +#include "spi.h" +#include "config.h" #define FPGA_SS_BIT 16 #define FPGA_SS_REG LPC_GPIO0 @@ -53,6 +55,7 @@ #define FEAT_ST0010 (1 << 1) #define FEAT_DSPX (1 << 0) +#define FPGA_WAIT_RDY() do {while(BITBAND(SSP_REGS->SR, SSP_BSY)); while(!BITBAND(FPGA_MCU_RDY_REG->FIOPIN, FPGA_MCU_RDY_BIT));} while (0) void fpga_spi_init(void); uint8_t fpga_test(void); diff --git a/src/memory.c b/src/memory.c index b8cdfa4..17523f9 100644 --- a/src/memory.c +++ b/src/memory.c @@ -63,7 +63,7 @@ void sram_writebyte(uint8_t val, uint32_t addr) { FPGA_SELECT(); FPGA_TX_BYTE(0x98); /* WRITE */ FPGA_TX_BYTE(val); - FPGA_TX_BYTE(0x00); /* dummy */ + FPGA_WAIT_RDY(); FPGA_DESELECT(); } @@ -71,8 +71,8 @@ uint8_t sram_readbyte(uint32_t addr) { set_mcu_addr(addr); FPGA_SELECT(); FPGA_TX_BYTE(0x88); /* READ */ - FPGA_TX_BYTE(0x00); /* dummy */ - uint8_t val = FPGA_TXRX_BYTE(0x00); + FPGA_WAIT_RDY(); + uint8_t val = FPGA_RX_BYTE(); FPGA_DESELECT(); return val; } @@ -82,8 +82,9 @@ void sram_writeshort(uint16_t val, uint32_t addr) { FPGA_SELECT(); FPGA_TX_BYTE(0x98); /* WRITE */ FPGA_TX_BYTE(val&0xff); + FPGA_WAIT_RDY(); FPGA_TX_BYTE((val>>8)&0xff); - FPGA_TX_BYTE(0x00); /* dummy */ + FPGA_WAIT_RDY(); FPGA_DESELECT(); } @@ -92,10 +93,13 @@ void sram_writelong(uint32_t val, uint32_t addr) { FPGA_SELECT(); FPGA_TX_BYTE(0x98); /* WRITE */ FPGA_TX_BYTE(val&0xff); + FPGA_WAIT_RDY(); FPGA_TX_BYTE((val>>8)&0xff); + FPGA_WAIT_RDY(); FPGA_TX_BYTE((val>>16)&0xff); + FPGA_WAIT_RDY(); FPGA_TX_BYTE((val>>24)&0xff); - FPGA_TX_BYTE(0x00); + FPGA_WAIT_RDY(); FPGA_DESELECT(); } @@ -103,9 +107,10 @@ uint16_t sram_readshort(uint32_t addr) { set_mcu_addr(addr); FPGA_SELECT(); FPGA_TX_BYTE(0x88); - FPGA_TX_BYTE(0x00); - uint32_t val = FPGA_TXRX_BYTE(0x00); - val |= ((uint32_t)FPGA_TXRX_BYTE(0x00)<<8); + FPGA_WAIT_RDY(); + uint32_t val = FPGA_RX_BYTE(); + FPGA_WAIT_RDY(); + val |= ((uint32_t)FPGA_RX_BYTE()<<8); FPGA_DESELECT(); return val; } @@ -114,11 +119,14 @@ uint32_t sram_readlong(uint32_t addr) { set_mcu_addr(addr); FPGA_SELECT(); FPGA_TX_BYTE(0x88); - FPGA_TX_BYTE(0x00); - uint32_t val = FPGA_TXRX_BYTE(0x00); - val |= ((uint32_t)FPGA_TXRX_BYTE(0x00)<<8); - val |= ((uint32_t)FPGA_TXRX_BYTE(0x00)<<16); - val |= ((uint32_t)FPGA_TXRX_BYTE(0x00)<<24); + FPGA_WAIT_RDY(); + uint32_t val = FPGA_RX_BYTE(); + FPGA_WAIT_RDY(); + val |= ((uint32_t)FPGA_RX_BYTE()<<8); + FPGA_WAIT_RDY(); + val |= ((uint32_t)FPGA_RX_BYTE()<<16); + FPGA_WAIT_RDY(); + val |= ((uint32_t)FPGA_RX_BYTE()<<24); FPGA_DESELECT(); return val; } @@ -127,13 +135,16 @@ void sram_readlongblock(uint32_t* buf, uint32_t addr, uint16_t count) { set_mcu_addr(addr); FPGA_SELECT(); FPGA_TX_BYTE(0x88); - FPGA_TX_BYTE(0x00); uint16_t i=0; while(i