After figure out how SPI working, I decided to build one in software(just for learning purpose).
The code is quite simple, but after I replace it with the SPI.write() function in SD Filesystem, no response from SD card, miso is high all the time.
void SDFileSystem::spiWrite(int spi_data)
{
for (int i = 0; i <8; i++)
{
if(spi_data & 0x80)
{
_mosi = 1;
}
else
{
_mosi = 0;
}
_sclk = 0;
wait_us(0.01);
spi_data <<= 1;
_sclk = 1;
}
wait_us(0.02);
_sclk = 0;
}
int SDFileSystem::spiRead()
{
int data = 0;
_mosi =1;
for(int i = 0; i<8; i++)
{
_sclk =1;
data <<= 1;
wait_us(0.01);
if(_miso)
{
data |=1;
}
_sclk = 0;
}
return data;
}
int SDFileSystem::initialise_card() {
//clock card with cs = 1
_cs = 1;
for(int i=0; i<16; i++) {
spiWrite(0xFF);
}
// send CMD0, should return with all zeros except IDLE STATE set (bit 0)
if(_cmd(0, 0) != R1_IDLE_STATE) {
fprintf(stderr, "No disk, or could not put SD card in to SPI idle state\n");
return SDCARD_FAIL;
}
// send CMD8 to determine whther it is ver 2.x
int r = _cmd8();
if(r == R1_IDLE_STATE) {
return initialise_card_v2();
} else if(r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) {
return initialise_card_v1();
} else {
fprintf(stderr, "Not in idle state after sending CMD8 (not an SD card?)\n");
return SDCARD_FAIL;
}
}
I thought this code should act same as the hardware SPI, but SD card can't be initialized, is there anything wrong in this code?
After figure out how SPI working, I decided to build one in software(just for learning purpose). The code is quite simple, but after I replace it with the SPI.write() function in SD Filesystem, no response from SD card, miso is high all the time.
I thought this code should act same as the hardware SPI, but SD card can't be initialized, is there anything wrong in this code?