Witam
Mam taki problem chce się dobrać do pamięci mmc programuje w BASCOMie i do tej pory było wszystko ok, używam procedur zamieszczonych wcześniej na tym formu, uK AT MEGA 16 i sprzętowy SPI. Probelm mam z odczytem bloku danych. Po wysłaniu komendy CMD 17 z argumentem którego wartość jest równa Nr_bloku*blok_len zwrac poprawne potwierdzenie R1 ale nie wysyła Data tokena równego 0xFE tylko 0xFF. Natomiast jak wyśle argument komendy CMD17 równy tylko Nr_bloku to zwraca data token 0xFE i odczytuje 512 bajtów. Te 512 są jakimiś przypadkowymi liczbami nie są to ani 0x00 ani 0xFF. Załaczam procedury z mnożeniem Nr_bloku*blok_len. Chciałbym się dowiedzieć co robie nie tak bo wydaje mi się że poprawne adresowanie pamięci jest przez wybranie numeru bloku i pomnożenie go przez długość bloku.
Mmc_cmd:
Arg4 = Arg : Shift Arg , Right , 8
Arg3 = Arg : Shift Arg , Right , 8
Arg2 = Arg : Shift Arg , Right , 8
Arg1 = Arg
Cs = Active
Odp = Spimove(rozkaz)
Odp = Spimove(arg1)
Odp = Spimove(arg2)
Odp = Spimove(arg3)
Odp = Spimove(arg4)
Odp = Spimove(crc)
Gosub Get_r1
If Mmc_cmd_end = 1 Then
Cs = Deactive
Odp = Spimove(&Hff)
End If
Return
Mmc_load:
Mmc_cmd_end = 0
Arg = Block_nr ' Block_len
Rozkaz = Cmd17 : Gosub Mmc_cmd
Gosub Get_dt
For Block_count = 1 To 512
Dat(block_count) = Spimove(&Hff)
Next Block_count
Odp = Spimove(&Hff)
Odp = Spimove(&Hff)
Cs = Deactive
Odp = Spimove(&Hff)
Return
Get_dt:
Do
Dt = Spimove(&Hff)
If Dt = &HFE Then Exit Do
Data_error_token = Dt And &HF1
If Data_error_token = 1 Then
Err = 1
Data_error_token = Dt
Exit Do
Else
Data_error_token = 0
End If
Delay
Loop
Return
Mam taki problem chce się dobrać do pamięci mmc programuje w BASCOMie i do tej pory było wszystko ok, używam procedur zamieszczonych wcześniej na tym formu, uK AT MEGA 16 i sprzętowy SPI. Probelm mam z odczytem bloku danych. Po wysłaniu komendy CMD 17 z argumentem którego wartość jest równa Nr_bloku*blok_len zwrac poprawne potwierdzenie R1 ale nie wysyła Data tokena równego 0xFE tylko 0xFF. Natomiast jak wyśle argument komendy CMD17 równy tylko Nr_bloku to zwraca data token 0xFE i odczytuje 512 bajtów. Te 512 są jakimiś przypadkowymi liczbami nie są to ani 0x00 ani 0xFF. Załaczam procedury z mnożeniem Nr_bloku*blok_len. Chciałbym się dowiedzieć co robie nie tak bo wydaje mi się że poprawne adresowanie pamięci jest przez wybranie numeru bloku i pomnożenie go przez długość bloku.
Mmc_cmd:
Arg4 = Arg : Shift Arg , Right , 8
Arg3 = Arg : Shift Arg , Right , 8
Arg2 = Arg : Shift Arg , Right , 8
Arg1 = Arg
Cs = Active
Odp = Spimove(rozkaz)
Odp = Spimove(arg1)
Odp = Spimove(arg2)
Odp = Spimove(arg3)
Odp = Spimove(arg4)
Odp = Spimove(crc)
Gosub Get_r1
If Mmc_cmd_end = 1 Then
Cs = Deactive
Odp = Spimove(&Hff)
End If
Return
Mmc_load:
Mmc_cmd_end = 0
Arg = Block_nr ' Block_len
Rozkaz = Cmd17 : Gosub Mmc_cmd
Gosub Get_dt
For Block_count = 1 To 512
Dat(block_count) = Spimove(&Hff)
Next Block_count
Odp = Spimove(&Hff)
Odp = Spimove(&Hff)
Cs = Deactive
Odp = Spimove(&Hff)
Return
Get_dt:
Do
Dt = Spimove(&Hff)
If Dt = &HFE Then Exit Do
Data_error_token = Dt And &HF1
If Data_error_token = 1 Then
Err = 1
Data_error_token = Dt
Exit Do
Else
Data_error_token = 0
End If
Delay
Loop
Return