Forum: Mikrocontroller und Digitale Elektronik lpcxpresso lpc1768 sd-karte ssp0


von Karl K. (leluno)


Lesenswert?

ich versuche seit einigen Tagen bei meinem lpc1768-board diesd-karte zu 
initialisieren. Angeschlossen ist sie an ssp0/port 1.20,1.21,1.23,1.24.

Der Beispielcode von Nxp funktioniert für ssp bei mir nicht. Der auch an 
ssp0/port 0.15,0.16,0.17,0.18 angeschlossene spi-lcd war sonicht zum 
Laufen zu bringen.  Anderer code geht inzwischen, so dass ssp 
wahrscheinlich nicht das Problem ist.

Ich möchte nun den Orginal-code von chan implementieren. Der ssp wird 
über die  Datei mmc_ssp.c gesteuert. Wenn ich das richtig verstanden 
haben, ist in dieser Datei der Anschluss für ssp0 vertauscht.
#if SSP_CH == 0
//#define  CS_LOW()  {FIO0CLR = _BV(18);}  /* Set P0.18 low */
//#define  CS_HIGH()  {FIO0SET = _BV(18);}  /* Set P0.18 high

  __set_PINSEL(0, 15, 2);    /* Attach SCK0 to I/O pad */
  __set_PINSEL(0, 16, 2);    /* Attach MISO0 to I/O pad */
  __set_PINSEL(0, 17, 2);    /* Attach MOSI0 to I/O pad */
  FIO0DIR |= _BV(18);  /* Set CS# as output */

0.16 ist cs und nicht miso. Der Orginalcode von chan kann daher 
eigentlich nicht funktionieren. Für den zweiten ssp0-port müsste der 
code dann geändert werden zu:

//#define  CS_LOW()  {FIO0CLR = _BV(16);}  /* Set P0.18 low */
//#define  CS_HIGH()  {FIO0SET = _BV(16);}  /* Set P0.18 high */
#define  CS_LOW()  {FIO1CLR = _BV(21);}  /* Set P0.18 low */
#define  CS_HIGH()  {FIO1SET = _BV(21);}  /* Set P0.18 high */

und
#if SSP_CH == 0
/*  __set_PINSEL(0, 15, 2);    // Attach SCK0 to I/O pad
  __set_PINSEL(0, 17, 2);    // Attach MISO0 to I/O pad
  __set_PINSEL(0, 18, 2);    // Attach MOSI0 to I/O pad
  FIO0DIR |= _BV(16);      // Set CS# as output
*/
  __set_PINSEL(1, 20, 2);    // Attach SCK0 to I/O pad
  __set_PINSEL(1, 23, 2);    // Attach MISO0 to I/O pad
  __set_PINSEL(1, 24, 2);    // Attach MOSI0 to I/O pad
  FIO1DIR |= _BV(21);      // Set CS# as output

Als nächste müsste ich überprüfen ob eine Verbindung zwischen sd-karte 
und dem Board herzustellen ist. Notfalls über GPIO-software-spi statt 
sssp0. Alles sehr mühselig.

Hat jemand code für die sd-karte, der mit dem lpc1768 auf Anhieb 
funktioniert?

von Karl K. (leluno)


Lesenswert?

FatChan ist installiert. Ging wider Erwarten einfach. Das Uart-Menü 
läuft. Die SD-Karte wird aber nicht erkannt.

von Karl K. (leluno)


Lesenswert?

ssp0/2 Schnittstelle nach außen geführt. Spi-lcd angeschlossen. 1. 
gefundener Fehler: SSP0/1 liegt auf Pin-Funktion=2, SSP0/2=3. Läuft aber 
immer noch nicht.

von Jim M. (turboj)


Lesenswert?

Ohne Code und Schaltplan können wir nur schlecht helfen...

von Karl K. (leluno)


Angehängte Dateien:

Lesenswert?

ssp0/2 läuft jetzt mit dem lcd. die sd-karte wird noch nicht erkannt. 
als nächstes versuche ich, ob der mmc_ssp.h-code mit dem lcd 
funktioniert.

ich habe diese board 
<http://www.hotmcu.com/lpc1768minidk2-development-board-28-tft-lcd-p-12.html?cPath=1_21>;

von Karl K. (leluno)


Lesenswert?

die entscheidende funktion für die Initialisierung der Karte ist wohl


DSTATUS disk_initialize (
  BYTE drv    /* Physical drive number (0) */
)
{
  BYTE n, cmd, ty, ocr[4];


  if (drv) return STA_NOINIT;      /* Supports only drive 0 */
  power_on();              /* Initialize SPI */
Stat=0;//kk
  if (Stat & STA_NODISK) return Stat;  /* Is card existing in the soket? 
*/

  FCLK_SLOW();
  for (n = 10; n; n--) xchg_spi(0xFF);  /* Send 80 dummy clocks */

  ty = 0;
  if (send_cmd(CMD0, 0) == 1) {      /* Put the card SPI/Idle state */
    Timer1 = 1000;            /* Initialization timeout = 1 sec */
    if (send_cmd(CMD8, 0x1AA) == 1) {  /* SDv2? */
      for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF);  /* Get 32 bit 
return value of R7 resp */
      if (ocr[2] == 0x01 && ocr[3] == 0xAA) {        /* Is the card 
supports vcc of 2.7-3.6V? */
        while (Timer1 && send_cmd(ACMD41, 1UL << 30)) ;  /* Wait for end 
of initialization with ACMD41(HCS) */
        if (Timer1 && send_cmd(CMD58, 0) == 0) {    /* Check CCS bit in 
the OCR */
          for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF);
          ty = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2;  /* Card id 
SDv2 */
        }
      }
    } else {  /* Not SDv2 card */
      if (send_cmd(ACMD41, 0) <= 1)   {  /* SDv1 or MMC? */
        ty = CT_SD1; cmd = ACMD41;  /* SDv1 (ACMD41(0)) */
      } else {
        ty = CT_MMC; cmd = CMD1;  /* MMCv3 (CMD1(0)) */
      }
      while (Timer1 && send_cmd(cmd, 0)) ;    /* Wait for end of 
initialization */
      if (!Timer1 || send_cmd(CMD16, 512) != 0)  /* Set block length: 
512 */
        ty = 0;
    }
  }
  CardType = ty;  /* Card type */
  deselect();

  if (ty) {      /* OK */
    FCLK_FAST();      /* Set fast clock */
    Stat &= ~STA_NOINIT;  /* Clear STA_NOINIT flag */
  } else {      /* Failed */
    power_off();
    Stat = STA_NOINIT;
  }

  return Stat;
}

bei separatem Aufruf mit

i=  (WORD)disk_initialize(0);

wird 0 zurückgegeben. Ich bin mir aber nicht sicher, ob wirklich eine 
Initialisierung der Karte erfolgt ist.

von Karl K. (leluno)


Lesenswert?

Es besteht ein konflikt zwischen ssp0/1-lcd und ssp0/2-sd-karte. nach 
abschalten von ssp0/1 wird die sd-karte erkannt und ausgelesen.

von Karl K. (leluno)


Lesenswert?

anzeide per uart0:

>fl kktest
rc=5 FR_NO_PATH
>fl 20130220
D---- 1980/01/01 00:00         0  .
D---- 1980/01/01 00:00         0  ..
----A 1980/01/01 00:00   1126244  201302~1.AVI
----A 1980/01/01 00:00   1075716  201302~2.AVI
----A 1980/01/01 00:00   1079638  201302~3.AVI
   3 File(s),   3281598 bytes total
   2 Dir(s), 3622309888 bytes free
>


Wie bekomme ich jetzt das directory auf dem lcd angezeigt und einen 
einzelnen file in den lpc-speicher geladen?

Hat jemand für den lpc1768 einsetzbaren Code für den anschluss eines 
vs1053 mp3-players? Vorlage könnte z.B. http://atmusic.my404.de sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.