1 | /*
|
2 | Copyright: Radig Ulrich mailto: mail@ulrichradig.de
|
3 | Author: Radig Ulrich
|
4 | Remarks:
|
5 | known Problems: none
|
6 | Version: 28.05.2004
|
7 | Description: Dieses Programm dient als Beispiel zur Ansteuerung einer MMC/SD-Memory-Card.
|
8 | Zum Zugriff auf eine MMC/SD-Karte, muß man nur die Datei mmc.c
|
9 | in sein eigenes Programm einfügen.
|
10 | */
|
11 |
|
12 | #include <stdio.h>
|
13 | #include <string.h>
|
14 | #include <avr/io.h>
|
15 | #include <avr/eeprom.h>
|
16 |
|
17 | #include "mmc.h"
|
18 | #include "fat.h"
|
19 | #include "usart.h"
|
20 | volatile unsigned char Buffer[512];
|
21 | volatile uint8_t next=0;
|
22 | volatile uint16_t a=0;
|
23 |
|
24 | //Timer1 Interrupt
|
25 | ISR (TIMER1_OVF_vect)
|
26 | //############################################################################
|
27 | {
|
28 | TCNT1 = 65535 - (SYSCLK/8/22000);
|
29 | a++;
|
30 | if(a>=512)
|
31 | {
|
32 | next=1;
|
33 | a=0;
|
34 | }
|
35 | OCR0 = Buffer[a];
|
36 | }
|
37 |
|
38 |
|
39 |
|
40 | //Hauptprogramm
|
41 | int main (void)
|
42 | {
|
43 | //SYSCLK defined in usart.h
|
44 | //Initzialisierung der seriellen Schnittstelle
|
45 | usart_init(19200);
|
46 |
|
47 | //Set TIMER0 (PWM OC0 Pin)
|
48 | DDRB |= (1<<3);
|
49 | TCCR0 |= (1<<WGM01|1<<WGM00|1<<COM01|1<<CS00);
|
50 | OCR0 = 128;
|
51 |
|
52 | //Set TIMER1
|
53 | TIMSK |= (1 << TOIE1);
|
54 | //Prescaler 8
|
55 | TCCR1B = (1<<CS11);
|
56 | //SYSCLK define in usart.h
|
57 | TCNT1 = 65535 - (SYSCLK/8/22000);
|
58 |
|
59 | //Globale Interrupts Enable
|
60 | sei();
|
61 |
|
62 |
|
63 |
|
64 | //Initialisierung der MMC/SD-Karte
|
65 | usart_write("System Ready!\r\n");
|
66 | while ( mmc_init() !=0) //ist der Rückgabewert ungleich NULL ist ein Fehler aufgetreten
|
67 | {
|
68 | usart_write("** Keine MMC/SD Karte gefunden!! **\n");
|
69 | }
|
70 | usart_write("Karte gefunden!!\n");
|
71 |
|
72 | fat_cluster_data_store();//laden Cluster OFFSET und Size ins EEPROM
|
73 | //Initialisierung der MMC/SD-Karte ENDE!
|
74 |
|
75 |
|
76 | unsigned int tmp;
|
77 |
|
78 | mmc_read_csd (Buffer);
|
79 |
|
80 | for (tmp = 0;tmp<16;tmp++)
|
81 | {
|
82 | usart_write("%x ",Buffer[tmp]);
|
83 | };
|
84 |
|
85 |
|
86 | //Ausgabe des Root Directory
|
87 | unsigned int Clustervar;
|
88 | unsigned char Dir_Attrib = 0;
|
89 | unsigned long Size = 0;
|
90 | usart_write("\nDirectory\n\n");
|
91 | for (char a = 1;a < 240;a++)
|
92 | {
|
93 | Clustervar = fat_read_dir_ent(0,a,&Size,&Dir_Attrib,Buffer);
|
94 | if (Clustervar == 0xffff)
|
95 | {
|
96 | break;
|
97 | }
|
98 | tmp = (Size & 0x0000FFFF);
|
99 | usart_write("Cluster = %4x DirA = %2x FileName = ",Clustervar,Dir_Attrib);
|
100 | usart_write(Buffer);
|
101 | usart_write("\n");
|
102 | }
|
103 | usart_write("\nDirectory Ende\n\n");
|
104 |
|
105 | //Lade Cluster für das index.htm File in den Speicher
|
106 | Clustervar = 0;//suche im Root Verzeichnis
|
107 | if (fat_search_file("SONNE.WAV",&Clustervar,&Size,&Dir_Attrib,Buffer) == 1)
|
108 | {
|
109 | usart_write("\nFile Found!!\n\n");
|
110 | //Lese File und gibt es auf der seriellen Schnittstelle aus
|
111 | for (uint32_t b = 0;b<7372;b++) //~7372 (3,6MB * 1024 * 1024 / 512)
|
112 | {
|
113 | fat_read_file (Clustervar,Buffer,b);
|
114 | while(next==0){}; //Warten bis die 512Bytes ausgegeben sind
|
115 | next=0;
|
116 | }
|
117 | }
|
118 |
|
119 | usart_write("FERTIG!!\n");
|
120 | //Hauptprogramm läuft ständig in einer schleife und macht nichts
|
121 | while (1)
|
122 | {
|
123 | }
|
124 | return (1);
|
125 | }
|