Na een aantal uren proberen is het mij nog niet gelukt om een stabiele verbinding te krijgen tussen een sd kaart en een 18f4520 microcontroller. De code is goed, want het is letterlijk de code van het voorbeeld van mikroc. De hardware lijkt ook goed aangesloten te zijn, want zo nu en dan werkt het wel. Op het internet vind ik wel meer topics van mensen die problemen ondervinden met de spi communicatie tussen microcontrollers en sd kaarten, maar er lijkt niet echt één oplossing te zijn en degene die ik kon vinden bleken voor mij niet te werken.
Dit is de code:
De microcontroller is gewoon op de normale manier aangesloten alleen gebruik ik een sn74lvc245an om van 5 volt naar 3.3 te gaan, alles op 3.3 laten werken helpt ook niet. Verder heb ik extra capacitors over de voeding van de sd kaart gezet (220uf en 100nf) naast die die al bij de voltage converter voor de 3.3 volt horen (daar zitten namelijk al een 10uf en 100nf bij). De sd kaart zit in een sd slot, het geheel is gemaakt op een broadboord. Het draait op 8mhz.
Een delay van 1 seconde direct in het begin van de main helpt ook niet.
Weet iemand hoe ik de vermoedelijke storing nog kan verminderen?
Dit is de code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
| // MMC module connections sbit Mmc_Chip_Select at RC2_bit; sbit Mmc_Chip_Select_Direction at TRISC2_bit; // eof MMC module connections // Variables for MMC routines unsigned char SectorData[512]; // Buffer for MMC sector reading/writing unsigned char data_for_registers[16]; // buffer for CID and CSD registers // UART1 write text and new line (carriage return + line feed) void UART1_Write_Line(char *uart_text) { UART1_Write_Text(uart_text); UART1_Write(13); UART1_Write(10); } // Display byte in hex void PrintHex(unsigned char i) { unsigned char hi,lo; hi = i & 0xF0; // High nibble hi = hi >> 4; hi = hi + '0'; if (hi>'9') hi=hi+7; lo = (i & 0x0F) + '0'; // Low nibble if (lo>'9') lo=lo+7; UART1_Write(hi); UART1_Write(lo); } void main() { const char FILL_CHAR = 'm'; unsigned int i, SectorNo; char mmc_error; bit data_ok; ADCON1 |= 0x0F; // Configure AN pins as digital CMCON |= 7; // Turn off comparators // Initialize UART1 module UART1_Init(19200); Delay_ms(10); UART1_Write_Line("PIC-Started"); // PIC present report // Initialize SPI1 module SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH); // initialise a MMC card mmc_error = Mmc_Init(); if(mmc_error == 0) UART1_Write_Line("MMC Init-OK"); // If MMC present report else UART1_Write_Line("MMC Init-error"); // If error report // Fill MMC buffer with same characters for(i=0; i<=511; i++) SectorData[i] = FILL_CHAR; // Write sector mmc_error = Mmc_Write_Sector(SectorNo, SectorData); if(mmc_error == 0) UART1_Write_Line("Write-OK"); else // if there are errors..... UART1_Write_Line("Write-Error"); // Reading of CID register mmc_error = Mmc_Read_Cid(data_for_registers); if(mmc_error == 0) { UART1_Write_Text("CID : "); for(i=0; i<=15; i++) PrintHex(data_for_registers[i]); UART1_Write_Line(""); } else UART1_Write_Line("CID-error"); // Reading of CSD register mmc_error = Mmc_Read_Csd(data_for_registers); if(mmc_error == 0) { UART1_Write_Text("CSD : "); for(i=0; i<=15; i++) PrintHex(data_for_registers[i]); UART1_Write_Line(""); } else UART1_Write_Line("CSD-error"); // Read sector mmc_error = Mmc_Read_Sector(SectorNo, SectorData); if(mmc_error == 0) { UART1_Write_Line("Read-OK"); // Chech data match data_ok = 1; for(i=0; i<=511; i++) { UART1_Write(SectorData[i]); if (SectorData[i] != FILL_CHAR) { data_ok = 0; break; } } UART1_Write_Line(""); if (data_ok) UART1_Write_Line("Content-OK"); else UART1_Write_Line("Content-Error"); } else // if there are errors..... UART1_Write_Line("Read-Error"); // Signal test end UART1_Write_Line("Test End."); } |
De microcontroller is gewoon op de normale manier aangesloten alleen gebruik ik een sn74lvc245an om van 5 volt naar 3.3 te gaan, alles op 3.3 laten werken helpt ook niet. Verder heb ik extra capacitors over de voeding van de sd kaart gezet (220uf en 100nf) naast die die al bij de voltage converter voor de 3.3 volt horen (daar zitten namelijk al een 10uf en 100nf bij). De sd kaart zit in een sd slot, het geheel is gemaakt op een broadboord. Het draait op 8mhz.
Een delay van 1 seconde direct in het begin van de main helpt ook niet.
Weet iemand hoe ik de vermoedelijke storing nog kan verminderen?