> Any suggestions would be great Ted, here's the initialisation sequence I'm using with a dsPIC and 4GB and 8GB SDHC cards, both standard and micro My experience with various makes of cards so far has made me wary of some substitution problems, so it's a work in progress, but initialisation seems reliable Joe ;=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D ; Initialise SD card ;=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D cmd00 =3D 0 + 0x40 ;reset cmd01 =3D 1 + 0x40 cmd02 =3D 2 + 0x40 cmd05 =3D 5 + 0x40 cmd08 =3D 8 + 0x40 cmd09 =3D 9 + 0x40 ;fetch CSD cmd10 =3D 10 + 0x40 ;fetch CID cmd12 =3D 12 + 0x40 cmd13 =3D 13 + 0x40 ;fetch Status Register cmd16 =3D 16 + 0x40 ;set block length cmd17 =3D 17 + 0x40 ;read single block of 512 bytes cmd18 =3D 18 + 0x40 ;read multiple blocks acmd22 =3D 22 + 0x40 acmd23 =3D 23 + 0x40 cmd24 =3D 24 + 0x40 ;write 1 block of 512 bytes cmd25 =3D 25 + 0x40 ;write multiple blocks acmd41 =3D 41 + 0x40 ;CRC 0x69 acmd51 =3D 51 + 0x40 ;fetch SCR cmd55 =3D 55 + 0x40 ;CRC 0x77 cmd58 =3D 58 + 0x40 ;fetch OCR mov #0b0000000100101101,w0 ;start SPI at 368.64kHz ; xxx ; 0 Clk controlled by module ; 0 SDO controlled by module ; 0 8-bit transfers ; 0 input sampled in middle of bit ; 1 CPHA =3D 0, rising-edge ; 0 /SS as normal I/O pin ; 0 CPOL =3D 0, idle low ; 1 Master ; 011 6:1 ; 01 16:1 ->=20 353kHz (33.88MHz/96) ; 101 3:1 ; 11 1:1 ->=20 9.8304MHz (29.4912/3) ; 100 4:1 ->=20 7.3728MHz (29.4912/4) ; 11 1:1 mov w0,SPI1CON1 ;http://ww1.microchip.com/downloads/en/AppNotes/01069B.pdf ;Using C30 Compiler and the SPI module to Interface EEPROMs with dsPIC33F=20 and PIC24F card_init: bclr SPI1CON1,#MODE16 bset SPI1CON1,#SMP bset SPI1STAT,#SPIEN ;enable SPI module bset LATB,#cs ;card /CS inactive call usec100 ;send > 74 dummy clocks with DI high mov #10,w1 mov #0xff,w0 do74: call send_w0 dec w1,w1 bra nz,do74 call usec100 bclr LATB,#cs ;card /CS active call usec100 ;=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D ;send CMD0 + argument<31:0> 00 00 00 00 + CRC ; ;http://ghsi.de/CRC/index.php?Polynom=3D10001000&Message=3D40+00+00+00+00 ; ;10001000, =3D x^7 + x^3 ;String =3D 40 00 00 00 00 ;Result =3D 1001010 =3D $4a, +1 =3D 10010101 =3D $95 mov #cmd00,w0 call send_w0 mov #0x00,w0 call send_w0 call send_w0 call send_w0 call send_w0 mov #0x95,w0 call send_w0 ;wait for '0x01' response more_00r: mov #0xff,w0 ;supply CLK, wait for response call send_w0 ;with SDO high (FF data) bclr SPI1STAT,#SPIROV ;must clear overflow flag btss SPI1STAT,#SPIRBF ;test for full receive buffer bra $-2 mov SPI1BUF,w2 ;read buffer mov #0x01,w1 ;wait for CMD0 '0x01' response xor w1,w2,w1 bra nz,more_00r ;=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D ;send CMD8 + argument<31:0> 00 00 01 AA + 7-bit CRC + 1 (end bit) ;String =3D 48 00 00 01 AA ;Result =3D 1000011 =3D $43, +1 =3D 10000111 =3D> $87 mov #cmd08,w0 call send_w0 mov #0x00,w0 call send_w0 call send_w0 mov #0x01,w0 call send_w0 mov #0xaa,w0 ;check pattern call send_w0 mov #0x87,w0 call send_w0 ;wait for '0x01' response more_08r: mov #0xff,w0 call send_w0 bclr SPI1STAT,#SPIROV btss SPI1STAT,#SPIRBF bra $-2 mov SPI1BUF,w2 mov #0x01,w1 ;wait for CMD8 '0x01' response xor w1,w2,w1 bra nz,more_08r ;pick up next 32 bits mov #0xff,w0 call send_w0 bclr SPI1STAT,#SPIROV btss SPI1STAT,#SPIRBF bra $-2 mov SPI1BUF,w2 mov #0xff,w0 call send_w0 bclr SPI1STAT,#SPIROV btss SPI1STAT,#SPIRBF bra $-2 mov SPI1BUF,w2 mov #0xff,w0 call send_w0 bclr SPI1STAT,#SPIROV btss SPI1STAT,#SPIRBF bra $-2 mov SPI1BUF,w2 mov.b w2,w1 swap w1 mov #0xff,w0 call send_w0 bclr SPI1STAT,#SPIROV btss SPI1STAT,#SPIRBF bra $-2 mov SPI1BUF,w2 mov.b w2,w1 ;=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D ;send CMD55 + argument<31:0> 00 00 00 00 + 65 (CRC) ; |RCA| xxxxx do_cmd55: mov #cmd55,w0 call send_w0 mov #0x00,w0 call send_w0 call send_w0 call send_w0 call send_w0 mov #0x65,w0 call send_w0 call get_48_0 btsc flags,#initd bra init_done ;send ACMD41 + argument<31:0> 40 00 00 00 + 00 (null CRC) ; | 77 ; CCS | ;send ACMD41 + argument<31:0> 40 00100000 00 00 11 ;69 0100000 | ; || | ; |HCS | ; | | ; busy V range 3.3 - 3.4 | do_acmd41: mov #acmd41,w0 call send_w0 mov #0x40,w0 ;=3D 1, HC support call send_w0 mov #0x00,w0 ;0x20 3.3V - 3.4V, CRC 61, 0x00= =20 CRC 77 call send_w0 call send_w0 call send_w0 mov #0x77,w0 ;CRC call send_w0 call get_48_0 btss flags,#initd bra do_cmd55 ;loop until 0x00 ;=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D init_done: bclr SPI1STAT,#SPIEN ;disable SPI module call usec10 mov #0b0000000100110111,w0 ;change to high speed ; 110 2:1 ; 11 1:1 ->=20 16.94MHz (33.88/2) ; ; 101 3:1 ; 11 1:1 ->=20 11.29MHz (33.88/3) ; ; 100 4:1 ->=20 8.47MHz (33.88/4) ; 11 1:1 mov w0,SPI1CON1 call usec100 bset SPI1STAT,#SPIEN call usec100 return ;some dsPIC SPI flags don't work - use delays send_w0: mov w0,SPI1BUF ;load data into SPI buffer call usec50 ;wait at 368.64kHz return send_w0_f: mov w0,SPI1BUF ;load data into SPI buffer call usec ;wait at high speed return=20 --=20 http://www.piclist.com PIC/SX FAQ & list archive View/change your membership options at http://mailman.mit.edu/mailman/listinfo/piclist .