summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/sdcard/sdcard.py15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/sdcard/sdcard.py b/drivers/sdcard/sdcard.py
index edcf14cad..f4520acbb 100644
--- a/drivers/sdcard/sdcard.py
+++ b/drivers/sdcard/sdcard.py
@@ -120,6 +120,7 @@ class SDCard:
for i in range(_CMD_TIMEOUT):
self.cmd(55, 0, 0)
if self.cmd(41, 0, 0) == 0:
+ # SDSC card, uses byte addressing in read/write/erase commands
self.cdv = 512
# print("[SDCard] v1 card")
return
@@ -131,8 +132,14 @@ class SDCard:
self.cmd(58, 0, 0, 4)
self.cmd(55, 0, 0)
if self.cmd(41, 0x40000000, 0) == 0:
- self.cmd(58, 0, 0, 4)
- self.cdv = 1
+ self.cmd(58, 0, 0, -4) # 4-byte response, negative means keep the first byte
+ ocr = self.tokenbuf[0] # get first byte of response, which is OCR
+ if not ocr & 0x40:
+ # SDSC card, uses byte addressing in read/write/erase commands
+ self.cdv = 512
+ else:
+ # SDHC/SDXC card, uses block addressing in read/write/erase commands
+ self.cdv = 1
# print("[SDCard] v2 card")
return
raise OSError("timeout waiting for v2 card")
@@ -159,6 +166,10 @@ class SDCard:
response = self.tokenbuf[0]
if not (response & 0x80):
# this could be a big-endian integer that we are getting here
+ # if final<0 then store the first byte to tokenbuf and discard the rest
+ if final < 0:
+ self.spi.readinto(self.tokenbuf, 0xFF)
+ final = -1 - final
for j in range(final):
self.spi.write(b"\xff")
if release: