Hi,
I'm trying to access an AT25DF041A SPI Flash chip on the tm4c123gh6pm.
As the chip requires the Chip Select pin to be low during a multi-byte command, I've configured it as GPIO and toggle it manually.
To read a page I do
void read_page(uint32_t address, uint8_t *data, uint8_t len) {
spi_tx_start();
ROM_SSIDataPut(SSI3_BASE, CMD_FREAD);
ROM_SSIDataPut(SSI3_BASE, (address >> 16) & 0xff);
ROM_SSIDataPut(SSI3_BASE, (address >> 8) & 0xff);
ROM_SSIDataPut(SSI3_BASE, (address >> 0) & 0xff);
ROM_SSIDataPut(SSI3_BASE, 0x0); // dummy
ROM_SysCtlDelay(1000); // ugly hack
spi_rx_flush();
while (len-- > 0) {
ROM_SSIDataPut(SSI3_BASE, 0x0);
ROM_SSIDataGet(SSI3_BASE, (uint32_t*) data++);
}
spi_tx_end();
}
spi_tx_start/spi_tx_end will set the CS pin low/high, to make sure the SPI transfer is complete, the end function also does busy wait to make sure the SPI transfer finished before deasserting CS
while (ROM_SSIDataGetNonBlocking(SSI3_BASE, 0));
To clear the rx buffer (here might be stuff in there from writing the command and the address) I do
void spi_rx_flush(void) {
while (ROM_SSIDataGetNonBlocking(SSI3_BASE, 0));
}
Now the problem is that there seems to be a delay between writing the command and address and the Flash Chip actually answering me with data - without the SysCtlDelay() I get
2014-10-28 23:46:54,715 - INFO # [0] 0 0 0 0 0 fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe
2014-10-28 23:46:54,732 - INFO # [40] 0 0 0 0 fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe
2014-10-28 23:46:54,749 - INFO # [80] 0 0 0 0 fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe
2014-10-28 23:46:54,766 - INFO # [c0] 0 0 0 0 fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe
2014-10-28 23:46:54,783 - INFO # [100] 0 0 0 0 fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe
2014-10-28 23:46:54,800 - INFO # [140] 0 0 0 0 fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe
2014-10-28 23:46:54,817 - INFO # [180] 0 0 0 0 fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe
SPI reads 0 because the chip hasn't answered yet, everything is shifted to the right. With the artificial delay on the host, the data is correct:
2014-10-28 23:48:27,108 - INFO # [0] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,125 - INFO # [40] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,142 - INFO # [80] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,160 - INFO # [c0] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,177 - INFO # [100] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,194 - INFO # [140] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,211 - INFO # [180] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,229 - INFO # [1c0] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,246 - INFO # [200] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,263 - INFO # [240] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,280 - INFO # [280] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,298 - INFO # [2c0] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,315 - INFO # [300] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,332 - INFO # [340] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,350 - INFO # [380] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
2014-10-28 23:48:27,366 - INFO # [3c0] fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef fe ed fe fe de ad be ef
What is the proper way to fix this?
I can't ask the Flash Chip wheather it's ready, since doing so would consitute another command - and I'm just waiting for a response for the command I just gave it.