|
楼主 |
发表于 2008-7-21 11:20:51
|
显示全部楼层
唉!弄了十几天SD卡.到现在只有手中的64M MMC卡OK.256M的TF卡和2G的MidiSD卡还是经常出错,在JTAG调试时一个个扇区地读写又能正常,可以是SD卡读写协议的问题,到现在没有找出问题.没办法!
///////////////////////////////////
//SD卡初始化程序,初始化成功反回0//
///////////////////////////////////
SD_Init:
PUSH R24
LDI TEMP2, 0x52
OUT SPCR, TEMP2
CBI SPSR, SPI2X
SD_CS_L
DELAY_NUS_ 250
LDI R16, 0xFF
LDI R24, 20
_SD_Init_0:
OUT SPDR, R16
SBIS SPSR, SPIF
RJMP PC-1
DEC R24
BRNE _SD_Init_0
SD_CS_H
LDI R24, 255
_SD_Init_1:
CLR R0
CLR R1
CLR R2
CLR R3
CLR R16
RCALL SD_Write_CMD
CPI R16, 1
BREQ _SD_Init_2
DEC R24
BRNE _SD_Init_1
LDI R16, 0x80
RJMP _SD_INIT_END
_SD_Init_2:
DELAY_NMS_ 5
LDI R24, 100
_SD_Init_3:
CLR R0
CLR R1
CLR R2
CLR R3
LDI R16, 1
RCALL SD_Write_CMD
CPI R16, 0
BREQ _SD_Init_4
DEC R24
BRNE _SD_Init_3
LDI R16, 0x82
RJMP _SD_INIT_END
_SD_Init_4:
LDI R24, 100
_SD_Init_5:
LDI R16, 1
MOV R0, R16
CLR R1
CLR R2
CLR R3
LDI R16, 41
RCALL SD_Write_CMD
CPI R16, 0
BREQ _SD_Init_6
DEC R24
BRNE _SD_Init_5
MMCCard_H
_SD_Init_6:
;设置一次读写BLOCK的长度为512个字节
LDI R24, 20
_SD_Init_7:
LDI TEMP1, LOW(512)
LDI TEMP2, HIGH(512)
MOVW R0, TEMP1
CLR R2
CLR R3
LDI R16, 16
RCALL SD_Write_CMD
CPI R16, 0
BREQ _SD_Init_END
DEC R24
BRNE _SD_Init_7
LDI R16, 0x83
_SD_Init_END:
SD_CS_H
LDI TEMP2, 0x50
OUT SPCR, TEMP2
SBI SPSR, SPI2X
POP R24
RET
/////////////////////////////////////////////////////
//写SD卡命令,R16为命令,R0,1,2,3为参数,反回参数R16//
/////////////////////////////////////////////////////
SD_Write_CMD:
PUSH R30
PUSH R31
PUSH R24
LDI R17, 0xFF
OUT SPDR, R17
SBIS SPSR, SPIF
RJMP PC-1
SD_CS_L
ORI R16, 0x40
MOV R17, R16
OUT SPDR, R16
CLR R16
RCALL CRC7
SBIS SPSR, SPIF
RJMP PC-1
OUT SPDR, R3
MOV R17, R3
RCALL CRC7
SBIS SPSR, SPIF
RJMP PC-1
OUT SPDR, R2
MOV R17, R2
RCALL CRC7
SBIS SPSR, SPIF
RJMP PC-1
OUT SPDR, R1
MOV R17, R1
RCALL CRC7
SBIS SPSR, SPIF
RJMP PC-1
OUT SPDR, R0
MOV R17, R0
RCALL CRC7
LSL R16
SUBI R16, -1
SBIS SPSR, SPIF
RJMP PC-1
OUT SPDR, R16
SBIS SPSR, SPIF
RJMP PC-1
LDI R17, 0xFF
CLR R24
_SD_WCOM_0:
OUT SPDR, R17
SBIS SPSR, SPIF
RJMP PC-1
IN R16, SPDR
INC R24
SBRS R16, 7
RJMP _SD_WCOM_1
CPI R24, 255
BRNE _SD_WCOM_0
_SD_WCOM_1:
SD_CS_H
POP R24
POP R31
POP R30
RET
/////////////////////////////////////////////////////
//从SD卡中读出一个扇区数据,存到R16,R17所指的数据区//
/////////////////////////////////////////////////////
SD_ReadBlock:
PUSH R24
PUSH R25
PUSH R30
PUSH R31
MOVW R30, R16
LDI R16, 9
_SD_READ_BLOCK_1:
LSL R0
ROL R1
ROL R2
ROL R3
DEC R16
BRNE _SD_READ_BLOCK_1
LDI R16, 17
RCALL SD_Write_CMD
SD_CS_L
LDI R24, 255
LDI R18, 0xFF
OUT SPDR, R18
_SD_READ_BLOCK_2:
SBIS SPSR, SPIF
RJMP PC-1
IN R16, SPDR
OUT SPDR, R18
CPI R16, 0xFE
BREQ _SD_READ_BLOCK_3
DEC R24
BRNE _SD_READ_BLOCK_2
LDI R16, 0xFF
RJMP _SD_READ_BLOCK_END
_SD_READ_BLOCK_3:
CLR R17
CLR R24
CLR R25
_SD_READ_BLOCK_4:
SBIS SPSR, SPIF
RJMP PC-1
IN R16, SPDR
OUT SPDR, R18
ST Z+, R16
RCALL CRC32
SBIS SPSR, SPIF
RJMP PC-1
IN R16, SPDR
OUT SPDR, R18
ST Z+, R16
RCALL CRC32
DEC R17
BRNE _SD_READ_BLOCK_4
SBIS SPSR, SPIF
RJMP PC-1
IN R19, SPDR
OUT SPDR, R18
SBIS SPSR, SPIF
RJMP PC-1
IN R18, SPDR
LDI R16, 5
_SD_READ_BLOCK_5:
LDI R17, 0xFF
OUT SPDR, R17
SBIS SPSR, SPIF
RJMP PC-1
DEC R16
BRNE _SD_READ_BLOCK_5
CP R18, R24
CPC R19, R25
BREQ _SD_READ_BLOCK_END
;CRC16不正确,反回错误码0x80
LDI R16, 0x80
_SD_READ_BLOCK_END:
SD_CS_H
POP R31
POP R30
POP R25
POP R24
RET
;--------------------------------------------------------------------------------------
SD_WriteSector:
PUSH R24
PUSH R25
PUSH R30
PUSH R31
MOVW R30, R16
LDI R16, 9
_SDWriteSector0:
LSL R0
ROL R1
ROL R2
ROL R3
DEC R16
BRNE _SDWriteSector0
LDI R16, 24
RCALL SD_Write_CMD
CPI R16, 0x00
BREQ _SDWriteSector1
SD_CS_H
LDI R16, 5
RCALL Halt
RJMP _SDWriteSector4
_SDWriteSector1:
; SD_CS_L
LDI R16, 5
_SDWriteSector1_1:
LDI R17, 0xFF
OUT SPDR, R17
SBIS SPSR, SPIF
RJMP PC-1
DEC R16
BRNE _SDWriteSector1_1
LDI R17, 0xFE
OUT SPDR, R17
CLR R24
CLR R25
CLR R18
_SDWriteSector2:
LD R16, Z+
SBIS SPSR, SPIF
RJMP PC-1
OUT SPDR, R16
RCALL CRC32
LD R16, Z+
SBIS SPSR, SPIF
RJMP PC-1
OUT SPDR, R16
RCALL CRC32
DEC R18
BRNE _SDWriteSector2
SBIS SPSR, SPIF
RJMP PC-1
OUT SPDR, R25
SBIS SPSR, SPIF
RJMP PC-1
OUT SPDR, R24
LDI R18, 0xFF
SBIS SPSR, SPIF
RJMP PC-1
OUT SPDR, R18
SBIS SPSR, SPIF
RJMP PC-1
IN R16, SPDR
ANDI R16, 0x1F
CPI R16, 0x05
BREQ _SDWriteSector3
LDI R16, 2
RCALL Halt
LDI R16, 5
RJMP _SDWriteSector4
_SDWriteSector3:
OUT SPDR, R18
SBIS SPSR, SPIF
RJMP PC-1
IN R16, SPDR
CPI R16, 0xFF
BRNE _SDWriteSector3
LDI R16, 20
_SDWriteSector5:
LDI R17, 0xFF
OUT SPDR, R17
SBIS SPSR, SPIF
RJMP PC-1
DEC R16
BRNE _SDWriteSector5
_SDWriteSector4:
SD_CS_H
POP R31
POP R30
POP R25
POP R24
RET |
|