Blame | Last modification | View Log | Download | RSS feed
#include "_global.h"#include "_sd.h"#include "_output.h"#include "_messages.h";.macro set_spicssbi _SFR_IO_ADDR(PORTB),0.endm;.macro clr_spicscbi _SFR_IO_ADDR(PORTB),0.endm;;--------------------------------------;.comm sd_cardtype, 1;;--------------------------------------;cmd08: .byte 0x48,0x00,0x00,0x01,0xaa,0x87;;--------------------------------------.global sd_receivesd_receive: ; u8 sd_receive(void);ser r24; - - - - - - - - - - - - - - - - - - -.global sd_exchangesd_exchange: ; u8 sd_exchange(u8 data);lds r19,flags1sbrc r19,BIT_ENABLE_SD_LOGrjmp .L_sdexch;то же, что и fpga_same_regclr_spicsout _SFR_IO_ADDR(SPDR),r24.L_sdrdy1:sbis _SFR_IO_ADDR(SPSR),SPIFrjmp .L_sdrdy1in r24,_SFR_IO_ADDR(SPDR)set_spicsret;то же, что и fpga_same_reg, но с логом в rs-232.L_sdexch:push r18push r19cbr r19,(ENABLE_SCR|ENABLE_DIRECTUART)sbr r19,ENABLE_UARTsts flags1,r19push r20push r21push r22push r23push xlpush xhpush zlpush zhpush r24ldi r24,lo8(msg_tsd_out)ldi r25,hi8(msg_tsd_out)call print_msgpop r24push r24call print_hexbytepop r24clr_spicsout _SFR_IO_ADDR(SPDR),r24.L_sdrdy2:sbis _SFR_IO_ADDR(SPSR),SPIFrjmp .L_sdrdy2in r24,_SFR_IO_ADDR(SPDR)set_spicspush r24ldi r24,lo8(msg_tsd_in)ldi r25,hi8(msg_tsd_in)call print_msgpop r24push r24call print_hexbytepop r24pop zhpop zlpop xhpop xlpop r23pop r22pop r21pop r20pop r19sts flags1,r19pop r18ret;;--------------------------------------.global sd_rd_dummysd_rd_dummy: ; void sd_rd_dummy(u8 count);mov r18,r24.L_sdrddummy:ser r24rcall sd_exchangedec r18brne .L_sdrddummyret;;--------------------------------------.global sd_cmd_without_argsd_cmd_without_arg: ; u8 sd_cmd_without_arg(u8 cmd);clr r23clr r22; - - - - - - - - - - - - - - - - - - -.global sd_cmd_with_1argsd_cmd_with_1arg: ; u8 sd_cmd_with_1arg(u8 cmd, u16 h_arg);clr r21clr r20; - - - - - - - - - - - - - - - - - - -.global sd_cmd_with_argsd_cmd_with_arg: ; u8 sd_cmd_with_arg(u8 cmd, u32 arg);push r24ldi r24,2rcall sd_rd_dummypop r24rcall sd_exchangemov r24,r23rcall sd_exchangemov r24,r22rcall sd_exchangemov r24,r21rcall sd_exchangemov r24,r20rcall sd_exchangeldi r24,0x95rcall sd_exchange; - - - - - - - - - - - - - - - - - - -.global sd_wait_notffsd_wait_notff: ; u8 sd_wait_notff(void);ldi r18,32sdwnff2:rcall sd_receivecpi r24,0xffbrne sdwnff1dec r18brne sdwnff2sdwnff1:ret;;--------------------------------------;.global sd_read_sectorsd_read_sector: ; u8 sd_read_sector(u8 *buff, u32 sectnumb); out: !0=oklds r18,flags1sbrs r18,BIT_ENABLE_SD_LOGrjmp .L_sdrdse0push r18cbr r18,(ENABLE_SCR|ENABLE_DIRECTUART)sbr r18,ENABLE_UARTsts flags1,r18push r24push r25; push xl; push xhpush zlpush zhpush r20push r21push r22push r23ldi r24,lo8(msg_tsd_readsector)ldi r25,hi8(msg_tsd_readsector)call print_msgpop r25pop r24pop r23pop r22push r22push r23push r24push r25call print_hexlongpop r23pop r22pop r21pop r20pop zhpop zl; pop xh; pop xlpop r25pop r24pop r18sts flags1,r18.L_sdrdse0:lds r18,sd_cardtypesbrc r18,BIT_SDHCFLAGrjmp .L_sdrdse1lsl r20rol r21rol r22mov r23,r22mov r22,r21mov r21,r20clr r20.L_sdrdse1:movw zl,r24ldi r24,0x40|17 ;CMD17 (read_single_block)rcall sd_cmd_with_argcpi r24,0xfebrne .L_sdrdse8lds r18,flags1push r18sbrs r18,BIT_ENABLE_SD_LOGrjmp .L_sdrdse5cbr r18,(ENABLE_SCR|ENABLE_DIRECTUART)sbr r18,ENABLE_UARTsts flags1,r18push zlpush zhldi r24,lo8(msg_tsd_skip)ldi r25,hi8(msg_tsd_skip)call print_msgpop zhpop zl.L_sdrdse5:ldi xl,0ldi xh,2.L_sdrdse3:rcall sd_receivest Z+,r24sbiw xl,1brne .L_sdrdse3pop r18sts flags1,r18ldi r24,2+1rcall sd_rd_dummyldi r24,1ret;ошибка при чтении сектора.L_sdrdse8:clr r24ret;;--------------------------------------;.L_sd_crc_off:ldi r24,0x40|59 ;CMD59 (crc_on_off)rcall sd_cmd_without_argtst r24brne .L_sd_crc_offret;;--------------------------------------;.L_sd_setblklen:ldi r24,0x40|16 ;CMD16 (set_blocklen)clr r23clr r22ldi r21,0x02clr r20rcall sd_cmd_with_argtst r24brne .L_sd_setblklenret;;--------------------------------------;.global sd_initsd_init: ; u8 sd_init(void); out: !0 - okpush r17ldi r24,SD_CS1call fpga_sel_regldi r24,32rcall sd_rd_dummyldi r24,SD_CS0call fpga_sel_regser r17.L_sdinit1:ldi r24,0x40 ;CMD0 (go_idle_state)rcall sd_cmd_without_argcpi r24,0x01breq .L_sdinit2dec r17brne .L_sdinit1pop r17ldi r24,0 ;нет картыret.L_sdinit2:ldi r24,2rcall sd_rd_dummyldi zl,lo8(cmd08) ;CMD8 (send_if_cond)ldi zh,hi8(cmd08).L_sdinit4:lpm r24,Z+cpi r24,0x87breq .L_sdinit3rcall sd_exchangerjmp .L_sdinit4.L_sdinit3:rcall sd_exchangercall sd_wait_notffldi r17,0x00sbrs r24,2ldi r17,0x40ldi r24,4rcall sd_rd_dummy.L_sdinit5:ldi r24,0x40|55 ;CMD55rcall sd_cmd_without_argldi r24,0x40|41 ;ACMD41 (sd_send_op_cond)mov r23,r17clr r22rcall sd_cmd_with_1argtst r24breq .L_sdinit6sbrs r24,2rjmp .L_sdinit5.L_sdinit7:ldi r24,0x40|1 ;CMD1 (send_op_cond)rcall sd_cmd_without_argtst r24brne .L_sdinit7rcall .L_sd_crc_offrcall .L_sd_setblklenldi r24,MMCFLAGrjmp .L_sdinit9.L_sdinit6:rcall .L_sd_crc_offrcall .L_sd_setblklenldi r24,SDV1FLAGtst r17breq .L_sdinit9ldi r24,0x40|58 ;CMD58 (read_ocr)rcall sd_cmd_without_argrcall sd_receivemov r17,r24ldi r24,3+2rcall sd_rd_dummyldi r24,SDV2FLAGsbrc r17,6ldi r24,SDHCFLAG.L_sdinit9:sts sd_cardtype,r24pop r17ldi r24,1 ;okret;;--------------------------------------