int wait_data(void){
SelectChip();
WriteBuffer[0] = 0xFF;
WriteBuffer[1] = 0xFF;
WriteBuffer[2] = 0xFF;
WriteBuffer[3] = 0xFF;
WriteBuffer[4] = 0xFF;
WriteBuffer[5] = 0xFF;
WriteBuffer[6] = 0xFF;
WriteBuffer[7] = 0xFF;
WriteBuffer[8] = 0xFF;
WriteBuffer[9] = 0xFF;
XSpi_Transfer(&LCD_SpiInstance, WriteBuffer , NULL, 10);
XSpi_Transfer(&LCD_SpiInstance, WriteBuffer, ReadBuffer, 10);
DeselectChip();
return ReadBuffer[0];
}
void SD_read(unsigned long sector, unsigned short offset, unsigned char * buffer, unsigned short len) {
unsigned short i, pos = 0;
SelectChip();
xil_printf("SD_read");
WriteBuffer[0] = 0xff;
WriteBuffer[1] = 0x51;
WriteBuffer[2] = (sector>>15); //Argument[31..24]
WriteBuffer[3] = (sector>>7); //Argument[23..16]
WriteBuffer[4] = (sector<<1); //Argument[15..8]
WriteBuffer[5] = 0x00; //Argument[7..0]
WriteBuffer[6] = 0xff;
XSpi_Transfer(&LCD_SpiInstance, WriteBuffer, NULL, 8);
ILI9340_DeselectChip();
for(i=0; i<10 && wait_data() != 0x00; i++) {} // wait for 0
for(i=0; i<10 && wait_data() != 0xFE; i++) {} // wait for data start
for(i=0; i<offset; i++) // "skip" bytes
XSpi_Transfer(&LCD_SpiInstance, 0xFF, ReadBuffer, offset);
for(i=0; i<len; i++){ // read len bytes
XSpi_Transfer(&LCD_SpiInstance, 0xFF, ReadBuffer, len);
buffer[i] = ReadBuffer[i];
}
for(i+=offset; i<512; i++) // "skip" again
XSpi_Transfer(&LCD_SpiInstance, 0xFF, ReadBuffer, 8);
// skip checksum
wait_data();
wait_data();
DeselectChip();
}