OSDN Git Service

V161
[fast-forth/master.git] / forthMSP430FR_SD_INIT.asm
index 497ac64..c7f56ab 100644 (file)
@@ -114,26 +114,26 @@ SD_CSOUT        .equ  P2OUT
     BIC.B #007h,&P2REN  ; disable pullup resistors for SIMO/SOMI/SCK pins
 
     .ENDIF
-;    .IFDEF MSP_EXP430FR4133 
-;
-;; COLD default state : Px{DIR,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; PX{OUT,REN} = 1 ; Px{IN,IES} = ?
-;
-;; P8.0                <--- SD_CD (Card Detect)
-;SD_CD           .equ  1
-;SD_CDIN         .equ  P8IN
-;; P8.1                ---> SD_CS (Card Select)
-;SD_CS           .equ  2
-;SD_CSOUT        .equ  P8OUT
-;    BIS.B #SD_CS,&P8DIR ; SD_CS output high
-;
-;; P5.1  UCB0     CLK  ---> SD_CLK
-;; P5.2  UCB0 TX/SIMO  ---> SD_SDI
-;; P5.3  UCB0 RX/SOMI  <--- SD_SDO
-;    BIS.B   #00Eh,&P5SEL1   ; Configure UCB0 pins P5.1 as CLK, P5.2 as SIMO & P5.3 as SOMI
-;                            ; P2DIR.x is controlled by eUSCI_A0 module
-;    BIC.B   #00Eh,&P5REN    ; disable pullup resistors for SIMO/SOMI/SCK pins
-;
-;    .ENDIF
+    .IFDEF MSP_EXP430FR4133 
+
+; COLD default state : Px{DIR,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; PX{OUT,REN} = 1 ; Px{IN,IES} = ?
+
+; P8.0                <--- SD_CD (Card Detect)
+SD_CD           .equ  1
+SD_CDIN         .equ  P8IN
+; P8.1                ---> SD_CS (Card Select)
+SD_CS           .equ  2
+SD_CSOUT        .equ  P8OUT
+    BIS.B #SD_CS,&P8DIR ; SD_CS output high
+
+; P5.1  UCB0     CLK  ---> SD_CLK
+; P5.2  UCB0 TX/SIMO  ---> SD_SDI
+; P5.3  UCB0 RX/SOMI  <--- SD_SDO
+    BIS.B   #00Eh,&P5SEL0   ; Configure UCB0 pins P5.1 as CLK, P5.2 as SIMO & P5.3 as SOMI
+                            ; P2DIR.x is controlled by eUSCI_A0 module
+    BIC.B   #00Eh,&P5REN    ; disable pullup resistors for SIMO/SOMI/SCK pins
+
+    .ENDIF
     .IFDEF CHIPSTICK_FR2433 
 
 ; COLD default state : Px{DIR,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; PX{OUT,REN} = 1 ; Px{IN,IES} = ?
@@ -154,91 +154,11 @@ SD_CSOUT        .equ  P2OUT
     BIC.B   #00Eh,&P1REN    ; disable pullup resistors for SIMO/SOMI/SCK pins
 
     .ENDIF
-    .IFDEF MY_MSP430FR5738
-
-; COLD default state : Px{DIR,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; PX{OUT,REN} = 1 ; Px{IN,IES} = ?
-
-; P2.3 as SD_CD
-SD_CD           .equ  08h
-SD_CDIN         .equ  P2IN
-; P2.4 as SD_CS
-SD_CS           .equ  10h
-SD_CSOUT        .equ  P2OUT
-    BIS.B #SD_CS,&P2DIR ; SD_CS output high
-
-; P2.2/UCB0CLK                ---> SD_CardAdapter CLK (SCK)   default value
-; P1.6/UCB0SIMO/UCB0SDA/TA0.0 ---> SD_CardAdapter SDI (MOSI)  default value
-; P1.7/UCB0SOMI/UCB0SCL/TA1.0 <--- SD_CardAdapter SDO (MISO)  default value
-    BIS #04C0h,&PASEL1  ; Configure UCB0 pins P2.2 as UCB0CLK, P1.6 as UCB0SIMO & P1.7 as UCB0SOMI
-                        ; P2DIR.x is controlled by eUSCI_B0 module
-    BIC #04C0h,&PAREN   ; disable pullup resistors for SIMO/SOMI/CLK pins
-
-    .ENDIF
-    .IFDEF MY_MSP430FR5738_1
-
-; COLD default state : Px{DIR,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; PX{OUT,REN} = 1 ; Px{IN,IES} = ?
-
-; P2.3 as SD_CD
-SD_CD           .equ  08h
-SD_CDIN         .equ  P2IN
-; P2.4 as SD_CS
-SD_CS           .equ  10h
-SD_CSOUT        .equ  P2OUT
-    BIS.B #SD_CS,&P2DIR ; SD_CS output high
-
-; P2.2/UCB0CLK                ---> SD_CardAdapter CLK (SCK)   default value
-; P1.6/UCB0SIMO/UCB0SDA/TA0.0 ---> SD_CardAdapter SDI (MOSI)  default value
-; P1.7/UCB0SOMI/UCB0SCL/TA1.0 <--- SD_CardAdapter SDO (MISO)  default value
-    BIS #04C0h,&PASEL1  ; Configure UCB0 pins P2.2 as UCB0CLK, P1.6 as UCB0SIMO & P1.7 as UCB0SOMI
-                        ; P2DIR.x is controlled by eUSCI_B0 module
-    BIC #04C0h,&PAREN   ; disable pullup resistors for SIMO/SOMI/CLK pins
-
-    .ENDIF
-    .IFDEF MY_MSP430FR5948 
-
-; COLD default state : Px{DIR,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; PX{OUT,REN} = 1 ; Px{IN,IES} = ?
-
-; P2.3                <--- SD_CD (Card Detect)
-SD_CD           .equ  08h
-SD_CDIN         .equ  P2IN 
-; P2.7                ---> SD_CS (Card Select)
-SD_CS           .equ  80h
-SD_CSOUT        .equ  P2OUT
-    BIS.B #SD_CS,&P2DIR ; SD_CS output high
-
-; P2.4  UCA1     CLK  ---> SD_CLK
-; P2.5  UCA1 TX/SIMO  ---> SD_SDI
-; P2.6  UCA1 RX/SOMI  <--- SD_SDO
-    BIS.B #070h,&P2SEL1 ; Configure UCA1 pins P2.4 as UCA1CLK, P2.5 as UCA1SIMO & P2.6 as UCA1SOMI
-                        ; P2DIR.x is controlled by eUSCI_A0 module
-    BIC.B #070h,&P2REN  ; disable pullup resistors for SIMO/SOMI/SCK pins
-
-    .ENDIF
-    .IFDEF MY_MSP430FR5948_1 ; = new version of MY_MSP430FR5948
-
-; COLD default state : Px{DIR,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; PX{OUT,REN} = 1 ; Px{IN,IES} = ?
-
-; P2.7                ---> SD_CD (Card Detect)
-SD_CD           .equ  80h
-SD_CDIN         .equ  P2IN
-; P2.3                <--- SD_CS (Card Select)
-SD_CS           .equ  08h
-SD_CSOUT        .equ  P2OUT
-    BIS.B #SD_CS,&P2DIR ; SD_CS output high
-
-; P2.4  UCA1     CLK  ---> SD_CLK
-; P2.5  UCA1 TX/SIMO  ---> SD_SDI
-; P2.6  UCA1 RX/SOMI  <--- SD_SDO
-    BIS.B #070h,&P2SEL1 ; Configure UCA1 pins P2.4 as UCA1CLK, P2.5 as UCA1SIMO & P2.6 as UCA1SOMI
-                        ; P2DIR.x is controlled by eUSCI_A0 module
-    BIC.B #070h,&P2REN  ; disable pullup resistors for SIMO/SOMI/SCK pins
-
-    .ENDIF
 
     BIC     #1,&SD_CTLW0            ; release eUSCI from reset
 
 ; ===========================================================
-; 2- Init all SD_Card variables, handles and SDIB buffer to 0
+; 2- Init to 0 all SD_Card variables, handles and SDIB buffer
 ; ===========================================================
 
 InitSDdata
@@ -257,11 +177,16 @@ InitSDdataLoop                      ;
 SD_POWER_ON
     MOV     #8,X                    ; send 64 clk on SD_clk
     CALL    #SPI_X_GET              ;
-    BIC.B   #SD_CS,&SD_CSOUT        ; set SD_CS output low to switch in SPI mode
+    BIC.B   #SD_CS,&SD_CSOUT        ; preset SD_CS output low to switch in SPI mode
     MOV     #4,S                    ; preset error 4R1
-SEND_CMD0                           ; CMD0 : GO_IDLE_STATE
+; ----------------------------------;
+INIT_CMD0                           ;
+; ----------------------------------;
     MOV     #95h,&SD_CMD_FRM        ; $(95 00 00 00 00 00)
     MOV     #4000h,&SD_CMD_FRM+4    ; $(95 00 00 00 00 40); send CMD0 
+; ----------------------------------;
+SEND_CMD0                           ; CMD0 : GO_IDLE_STATE
+; ----------------------------------;
     MOV     #1,W                    ; expected SPI_R1 response = 1 = idle state
     CALL    #sendCommand            ;X
     JZ      INIT_CMD8               ; if idle state
@@ -273,18 +198,19 @@ INIT_CMD8                           ; mandatory if SD_Card >= V2.x [11:8]supply
     CALL    #SPI_GET                ; (needed to pass SanDisk ultra 8GB "HC I")
     CMP.B   #-1,W                   ; FFh expected value <==> MISO = high level
     JNE     INIT_CMD8               ; loop back while yet busy
-; ----------------------------------;
-    MOV     #8,S                    ; preset error 8R1 for CMD1
     MOV     #0AA87h,&SD_CMD_FRM     ; $(87 AA ...)  (CRC:CHECK PATTERN)
     MOV     #1,&SD_CMD_FRM+2        ; $(87 AA 01 00 ...)  (CRC:CHECK PATTERN:VHS set as 2.7to3.6V:0)
     MOV     #4800h,&SD_CMD_FRM+4    ; $(87 AA 01 00 00 48)
+; ----------------------------------;
 SEND_CMD8                           ; CMD8 = SEND_IF_COND
+; ----------------------------------;
     MOV     #1,W                    ; expected R1 response (first byte of SPI R7) = 01h : idle state
-    CALL    #sendCommand            ; 
+    CALL    #sendCommand            ; time out occurs with SD_Card V1.x (and all MMC_card) 
 ; ----------------------------------;
-CMD8_NEXT                           ; time out occured with SD_Card V1.x and all MMC_card
-    MOV     #4,X                    ;
-    CALL    #SPI_X_GET              ;WX skip end of SD_Card V2.x type R7 response (4 bytes)
+    MOV     #4,X                    ; skip end of SD_Card V2.x type R7 response (4 bytes), because useless
+    CALL    #SPI_X_GET              ;WX
+; ----------------------------------;
+INIT_ACMD41                         ;
 ; ----------------------------------;
     MOV     #1,&SD_CMD_FRM          ; $(01 00 ...   set stop bit
     MOV     #0,&SD_CMD_FRM+2        ; $(01 00 00 00 ...
@@ -292,28 +218,29 @@ CMD8_NEXT                           ; time out occured with SD_Card V1.x and all
 ;    MOV.B   #32,Y                   ; init 32 * ACMD41 repeats  ==> ~400ms
     MOV.B   #-1,Y                   ; init 255 * ACMD41 repeats ==> 3 s
 ; ----------------------------------;
-SEND_ACMD41                         ; (CMD55+CMD41)
+SEND_ACMD41                         ; send CMD55+CMD41
 ; ----------------------------------;
-    ADD     S,S                     ; preset error 10R1 for ACMD41
-SEND_CMD55                          ; CMD55 = APP_CMD
+    MOV     #8,S                    ; preset error 8R1 for ACMD41
+INIT_CMD55                          ;
     MOV     #7700h,&SD_CMD_FRM+4    ; $(01 00 00 00 00 77)
+SEND_CMD55                          ; CMD55 = APP_CMD
     MOV     #1,W                    ; expected R1 response = 1 : idle
     CALL    #sendCommand            ;
 SEND_CMD41                          ; CMD41 = APP OPERATING CONDITION
     MOV     #6940h,&SD_CMD_FRM+4    ; $(01 00 00 00 40 69) (30th bit = HCS = High Capacity Support request)
-    CALL    #SDbusyLoop             ; wait until busy (needed to pass SanDisk ultra 8GB "HC I") then send Command CMD41
+    CALL    #WaitIdleBeforeSendCMD  ; wait until idle (needed to pass SanDisk ultra 8GB "HC I") then send Command CMD41
     JZ      SetBLockLength          ; if SD_Card ready (R1=0)
     SUB.B   #1,Y                    ; else decr time out delay
-    JNZ     SEND_CMD55              ; then loop back while count of repeat not reached
+    JNZ     INIT_CMD55              ; then loop back while count of repeat not reached
     JMP     SD_INIT_ERROR           ; ReturnError on time out : unusable card
 ; ----------------------------------;
-setBLockLength                      ; set block = 512 bytes (buffer size), usefull for FAT16 SD Cards
+setBLockLength                      ; set block = 512 bytes (buffer size), usefull only for FAT16 SD Cards
 ; ----------------------------------;
-    ADD     S,S                     ; preset error $20 for CMD16
+    ADD     S,S                     ; preset error $10 for CMD16
 SEND_CMD16                          ; CMD16 = SET_BLOCKLEN
     MOV     #02h,&SD_CMD_FRM+2      ; $(01 00 02 00 ...)
     MOV     #5000h,&SD_CMD_FRM+4    ; $(01 00 02 00 00 50) 
-    CALL    #SDbusyLoop             ; wait until busy then send CMD16
+    CALL    #WaitIdleBeforeSendCMD  ; wait until idle then send CMD16
     JNZ     SD_INIT_ERROR           ; if W = R1 <> 0, ReturnError = $20R1 ; send command ko
 ; ----------------------------------;
 SetHighSpeed                        ; end of SD init ==> SD_CLK = SMCLK
@@ -324,11 +251,10 @@ SetHighSpeed                        ; end of SD init ==> SD_CLK = SMCLK
 ; ----------------------------------;
 Read_EBP_FirstSector                ; W=0, BS_FirstSectorHL=0
 ; ----------------------------------;
-    ADD     S,S                     ; preset error $40 ; SD card not FAT16/FAT32
     CALL    #readSectorW            ; read physical first sector
     MOV     #BUFFER,Y               ;
-    MOV     454(Y),&BS_FirstSectorL ;
-    MOV     456(Y),&BS_FirstSectorH ;
+    MOV     454(Y),&BS_FirstSectorL ; so, sectors become logical
+    MOV     456(Y),&BS_FirstSectorH ; 
     MOV.B   450(Y),W                ; W = partition ID 
 ; ----------------------------------;
 TestPartitionID                     ;
@@ -336,24 +262,25 @@ TestPartitionID                     ;
     MOV     #1,&FATtype             ; preset FAT16
 FAT16_CHS_LBA_Test                  ;
     SUB.B   #6,W                    ; ID=06h Partition FAT16 using CHS & LBA ?
-    JZ      Read_MBR_FirstSector    ;
+    JZ      Read_MBR_FirstSector    ; with W = 0
 FAT16_LBA_Test                      ;
     SUB.B   #8,W                    ; ID=0Eh Partition FAT16 using LBA ?
-    JZ      Read_MBR_FirstSector    ;
+    JZ      Read_MBR_FirstSector    ; with W = 0
 ; ----------------------------------;
     MOV     #2,&FATtype             ; set FAT32
 FAT32_LBA_Test                      ;
     ADD.B   #2,W                    ; ID=0Ch Partition FAT32 using LBA ?
-    JZ      Read_MBR_FirstSector    ;
+    JZ      Read_MBR_FirstSector    ; with W = 0
 FAT32_CHS_LBA_Test                  ;
     ADD.B   #1,W                    ; ID=0Bh Partition FAT32 using CHS & LBA ?
-    JZ      Read_MBR_FirstSector    ;
-    ADD.B   #0Bh,W
-    JNZ     SD_INIT_ERROR           ; ReturnError = $40xx with xx = partition ID 
-; ----------------------------------;
-Read_MBR_FirstSector                ; W=0
+    JZ      Read_MBR_FirstSector    ; with W = 0
+    ADD     #0200Bh,W               ;
+    MOV     W,S                     ;
+    MOV     #SD_CARD_ID_ERROR,PC    ; S = ReturnError = $20xx with xx = partition ID 
+; ----------------------------------; see: https://en.wikipedia.org/wiki/Partition_type
+Read_MBR_FirstSector                ; read first logical sector
 ; ----------------------------------;
-    CALL    #readSectorW            ; ...with the good bytes/sectors (FAT16/FAT32) CMD17 frame !
+    CALL    #readSectorW            ; ...with the good CMD17 bytes/sectors (FAT16/FAT32) frame !
 ; ----------------------------------;
 FATxx_SetFileSystem                 ;
 ; ----------------------------------;
@@ -361,8 +288,8 @@ FATxx_SetFileSystem                 ;
     MOV     14(Y),X                 ;3 X = BPB_RsvdSecCnt
     MOV     X,&OrgFAT1              ;3 set OrgFAT1
     MOV     22(Y),W                 ; W = BPB_FATsize
-    CMP     #0,W                    ; BPB_FATsize = 0 ?
-    JNZ     Set_FATsize             ;
+    CMP     #0,W                    ; BPB_FATsize <> 0 ?
+    JNZ     Set_FATsize             ; yes
     MOV     36(Y),W                 ; W = BPB_FATSz32
 Set_FATsize                         ;
     MOV     W,&FATSize              ; limited to 16384 sectors....