SD kaart met 18f45k22 MikroC

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
Ik probeer een sd kaart te benaderen met een 18f45k22 microcontroller. De code is geschreven in mikroC. De communicatie gaat echter al fout bij de initialisatie, de init functie geeft een 0 terug als de initialisatie is gelukt anders een 1, ik krijg bij alle drie de sd kaarten (waarvan 1 een sdhc is, de andere 2 gewoon sd) die allemaal zijn geformateerd in fat 16 bij de initialisatie een 1 terug.

Als sd kaart houder gebruik ik dit:
http://www.ebay.com/itm/2..._trksid=p3984.m1439.l2649

Deze is als volgt verbonden:
GND ---- GND
VCC ---- 3V3
NC
NC
NC
lcd
lcd
lcd
lcd
lcd
SCK ---- RC3
Miso ---- RC4
Mosi ---- RC5
CS ---- RC0

Verder zijn RC6 en RC7 gebruikt voor de uart.

Over de Miso en Mosi ben ik niet helemaal zeker, maar omdraaien help niet. De pic draait zelf ook op 3V3 en is dus direct aangesloten op de sd kaart. (er zijn korte verbindingen gebruikt).

Ik heb ook de mmc_fat_init methode geprobeerd, die geeft 255 terug, wat betekend dat er geen kaart aanwezig is (wat dus niet klopt).

Ik heb alles doorgemeten en kan geen fouten vinden. Nu heb ik al eens eerder geprobeerd een sd kaart met de mikroC library werkend te krijgen, dat gaf toen ook vele problemen. Uiteindelijk was het ook niet duidelijk wat er fout ging, maar de initialisatie werkte toen wel. Ik heb geen ideeën meer, iemand nog tips?

Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
Zijn die SD kaarten van verschillende merken? Want ook al werken die krengen in bijvoorbeeld telefoons nagenoeg altijd, ze geven bijzonder vaak gekut als je ze op een microcontroller aansluit (wat ik zelf erg vreemd vind, vooral als je ook kijkt dat iets als Raspberry ook relatief vaak problemen heeft met de SD kaart).


Over je verbinding, itt seriele poorten zijn MISO en MOSI toch wel redelijk duidelijk hoe je ze moet aansluiten? Bij serieel weet je nooit of er nou TX bij staat omdat dat zijn transmitter is, of dat je hem op de transmitter van je microcontroller moet aansluiten. Bij SPI is het simpelweg MISO = MISO en MOSI=MOSI.

Je gebruikt standaard code voor die SD kaart? Wat dus goed hoort te zijn?

Anyway probleem hier is dat jij de enige bent die PICs/MikroC gebruikt :P

Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
ze zijn van samung kingston en silicon power, de code die ik gebruik:

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
// MMC module connections
sfr sbit Mmc_Chip_Select at RC0_bit;
sfr sbit Mmc_Chip_Select_Direction at TRISC0_bit;
// MMC module connections


void main() {
  char error;

  ADCON1 |= 0x0F;                         // Configure all ports with analog function as digital
  ANSELB  = 0;                       // Configure pins as digital
  C1ON_bit = 0;                      // Disable comparators
  C2ON_bit = 0;
  
  UART1_Init(9600);               // Initialize UART module at 9600 bps
  Delay_ms(100);                  // Wait for UART module to stabilize
  
  SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);
  Delay_ms(100);

  error = Mmc_Fat_Init();  // Init with CS line at RC0_bit

  UART1_Write(error);
}

Acties:
  • 0 Henk 'm!

  • Sphere-
  • Registratie: November 2003
  • Laatst online: 28-08 19:53
Volgens de schematics ( http://www.egochina.net.cn/eBay/Download/JD-T1800_PCB.rar ) zit er geen pull-up resistor op de MISO lijn. een SD kaart stuurt de MISO lijn tijdens de initialisatie open-drain aan.

Als je microcontroller interne pull-ups heeft kan je proberen die aan te zetten.

Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
mijn easypic bord heeft pull up schakelaars (4k7) als ik die aanzet maakt het geen verschil (maar pull up werkt wel)

Acties:
  • 0 Henk 'm!

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
dit moest nog worden toegevoegd, nu werkt het wel:

ANSELC = 0; // Configure AN pins as digital
SLRCON = 0; // Set output slew rate on all ports at standard rate
Pagina: 1