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?