slechte verbinding sd kaart

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
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:
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?

Acties:
  • 0 Henk 'm!

  • Sphere-
  • Registratie: November 2003
  • Laatst online: 28-08 19:53
Gooi de SPI clock eens flink omlaag? Bij 8 MHz kan het best misgaan met een vage breadbord opstelling

Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
8MHz zal zijn systeem klok zijn, z'n SPI is gedeeld door 64, dus dat zou langzaam zat moeten zijn. Was iig ook wel het eerste waar ik aan dacht.

Ook SPI modus lijkt te kloppen, want mijn tweede keuze was. Wat voor een soort fouten krijg je? Lees/schrijf je verkeerde karakters? Of wat anders?

Twee mogelijkheden die ik zo zie:
Je hebt bagger breadbord connectie ergens, oftewel dan opnieuw op ander gedeelte maken.
De library voor de SD kaart is aan de positieve kant: de timing eisen van de SD kaart worden niet gerespecteerd.

[ Voor 29% gewijzigd door Sissors op 02-06-2012 22:47 ]


Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
ik heb het alwel eens op verschillende plekken geprobeerd, maar dat hielp niet. De systeemklok is inderdaad 8mhz. Voorheen waren de fouten die ik kreeg dat hij vaak niet eens initialiseerde, nu komt hij bijna altijd zonder errors bij de content read, waar hij dan 2/3 van de keren een error geeft.

ik krijg bijvoorbeeld vaak outputs as deze:

PIC-Started
MMC Init-OK
Write-OK
CID : 1B534D3030303030100F6817B000BC7D
CSD : 007FFF325B5A83BAF6DBDFFF0E8000B5
Read-OK
mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
Content-Error
Test End.

[ Voor 30% gewijzigd door huub8 op 02-06-2012 23:31 ]


Acties:
  • 0 Henk 'm!

  • Infant
  • Registratie: Januari 2008
  • Laatst online: 10-10 11:30

Infant

It's a floating Dino!

Hoe ziet de mmc_read_sector er uit van binnen? Als hij het soms wel / niet doet, kan het dat je wat langer op antwoord moet wachten. SDkaartjes zijn net modems en antwoorden niet altijd meteen als je wat roept. Helemaal niet als je van die fijne 2 Euro SD kaartjes hebt.

Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
Het is nieuw samsung 2gb sd kaartje, net in fat16 geformatteerd.
Pagina: 1