'---------------------------------------------
'Проигрыватель Wav с карточки SD\MMC Y.D.E. 2011
'Первоисточник http://avrprojects.info/avr-projects/mmc-card-based-wav-player/
'---------------------------------------------
' mega8 SD\MMC
' 25 PC2-----1 CS
' 26 PC3-----2 MOSI
' --3 Gnd
' --4 +3.3v
' 27 PC4-----5 SCK
' --6 Gnd
' 28 PC5-----7 MISO
'
' 15 PB1--4,7mF--Speeker--Gnd
'
'------------------------------------------
$regfile = "m8def.dat"
$crystal = 11059200 '
$baud = 9600
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1 ' шим модулятор PWM
Pwm1a = 255
Pwm1b = 255
'Constants
Const Msbl = 0
Const Msbh = 1
Const Dly = 2
Const Bits8 = 8
Const Bits16 = 16
Const Bits32 = 32
'Dim
Dim Dat As Byte
Dim Resp As Byte
Dim I As Word
Dim Addr As Long
Dim Adres As Long
Dim Tanzim As Byte
Dim Ali As Byte
Dim Test As Long
Dim Copy As Long
Dim Shomare As Long
Dim Hassan As Byte
'Aliases
Cs Alias Portc.2
Mosi Alias Portc.3
Clk Alias Portc.4
Miso Alias Pinc.5
'Declarations
Declare Sub Minit
Declare Sub Readmmc(byval Addr As Long )
Declare Sub Mread(byval Addr As Long )
'Configs
Config Portc.5 = Output
Config Portc.2 = Output
Config Portc.4 = Output
Config Pinc.3 = Input
Waitms 300
Config Spi = Soft , Din = Pinc.5 , Dout = Portc.3 , Ss = Portc.2 , Clock = Portc.4
Enable Interrupts
Enable Spi
Spiinit
'******** MAIN PROGRAM *************
' Reset Portd.3
Main:
'Initialize the MMCC
Wait 2
Print ""
Print "Init MMC"
Minit
' Adres = 1048576
Adres = 376832
Ali = 0
Print "ok"
Wait 2
Print "read"
Test = 512 * 7800
' Inja:
While Adres <> Test
' Print Adres
Call Readmmc(adres)
Adres = Adres + 512
Wend
Print "End of program"
Endloop:
Goto Endloop
End 'end program
'***************************** END OF PROGRAM **********************************
'======= SUB ROUTINES AND FUNCTIONS =======
'*** Инициализация карты MMC ***
Sub Minit
Set Cs
Dat = &HFF ' отправляем FF
For I = 1 To 10 '10 раз чтоб MMC получила тактовые импульсы для свойх нужд (не менее 8)
Shiftout Mosi , Clk , Dat , Msbl '
Next I
Resp = 255
Reset Cs
Print "Reset MMC"
Cmd0: ' команда 0 сброс карты 40,00,00,00,00,95
Dat = &H40 '40
Shiftout Mosi , Clk , Dat , Msbl
Addr = &H00000000
Shiftout Mosi , Clk , Addr , Msbl
Dat = &H95
Shiftout Mosi , Clk , Dat , Msbl
While Resp <> &H01 ' ждем отклик 01 если всё нормально (другие биты указывают на ошибку)
Shiftin Miso , Clk , Resp , Msbl
Print "Otklik " ; Resp
Wend
Print "Reset OK!"
Set Cs
Waitms 50
Reset Cs
Dat = &HFF
Print "Return SPI"
Cmd1: ' команда 1 перевод карты в режим spi 41,00,00,00,00,FF
While Resp <> &H00 ' ждем отклик 00 если всё нормально в противном случае повторяем
Set Cs
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
Reset Cs
Dat = &H41 ' код команды 41
Shiftout Mosi , Clk , Dat , Msbl ' 00000000
Addr = 0
Shiftout Mosi , Clk , Addr , Msbl ' FF вместо CRC
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl ' пустой для тактов
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl ' принимаем отклик (01)
Print "otklik SPI " ; Resp
Wend
Dat = &HFF
Set Cs
Print "Init OK!"
End Sub
'**** READ routine assumes ADDR uses Status subroutine *****
Sub Readmmc(byval Addr As Long)
' Addr = 0
Set Cs
Dat = &HFF
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
Reset Cs
Dat = &H51 'команда 51 читать блок 512 байт
Shiftout Mosi , Clk , Dat , Msbl 'адрес
Shiftout Mosi , Clk , Addr , Msbl
Dat = &HFF 'FF вместо СRC
Shiftout Mosi , Clk , Dat , Msbl
Shiftin Miso , Clk , Resp , Msbl
While Resp <> 0 ' пока карта думает, перед посылкой она даст 0 потом FE
Shiftin Miso , Clk , Resp , Msbl
Wend
While Resp <> &HFE ' посылка данных предваряется байтом FE перед
Shiftin Miso , Clk , Resp , Msbl
Wend
For I = 1 To 512 ' принимаем блок 512 байт
Shiftin Miso , Clk , Resp , Msbl
' If Resp <> 255 And Resp <> 0 Then 'Записываем на чистую карточку FAT 1 файл WAV 22кгц 8бит моно
' Print "Block # " ; Addr ; " " ; I ; " - " ; Resp 'с помощью этого кода высматриваем адрес где данные не равны 0 или 255
' Waitms 50 'потом подставляем этот адрес в качестве стартового
' End If
Pwm1a = Resp
Pwm1b = Resp
Waitus 29
Next I
Shiftin Miso , Clk , Resp , Msbl ' пропускаем два байта CRC
Shiftin Miso , Clk , Resp , Msbl
Set Cs
End Sub