Forum: Mikrocontroller und Digitale Elektronik sd Karte am c8051f330 über SPI (Code Vorlage für f340)


von 8051s-slave (Gast)


Lesenswert?

Hallo Ihr Lieben,
ich habe meine Not mit der Anpassung eines Besispielcodes für ein 
c8051f340 an einem c8051f330.
Ich bin mittlerweile so weit dass ich sagen kann dass der SPI 
funktionieren müßte.
Beim Versuch das Ganze zu kompilieren bekommen ich folgenden Fehler 
angezeigt:
pointer: const to non-const assignment
und zwar an der von mir mit einem @ markierten Stelle
/* Write Sector(s) 
*/

#if _READONLY == 0
DRESULT disk_write (
  BYTE drv,      /* Physical drive nmuber (0..) */
  const BYTE *buff,  /* Data to be written */
  DWORD sector,    /* Sector address (LBA) */
  UINT count      /* Number of sectors to write  */
)
{
  if (drv || !count) return RES_PARERR;
  if (Stat & STA_NOINIT) return RES_NOTRDY;

  if (count == 1)/* Single block write */
  {
    @//
                if(!SD_writeSingleBlock (buff, sector)) count = 0;
                //@

  }
  else/* Multiple block write */
  {
    //@
                 if(!SD_writeMultipleBlock (buff, sector, count)) count 
= 0;
                //@
  }

  return count ? RES_ERROR : RES_OK;
}
#endif /* _READONLY */

von 8051s-slave (Gast)


Lesenswert?

1
/* Write Sector(s)
2
*/
3
4
#if _READONLY == 0
5
DRESULT disk_write (
6
  BYTE drv,      /* Physical drive nmuber (0..) */
7
  const BYTE *buff,  /* Data to be written */
8
  DWORD sector,    /* Sector address (LBA) */
9
  UINT count      /* Number of sectors to write  */
10
)
11
{
12
  if (drv || !count) return RES_PARERR;
13
  if (Stat & STA_NOINIT) return RES_NOTRDY;
14
15
  if (count == 1)/* Single block write */
16
  {
17
    @//
18
                if(!SD_writeSingleBlock (buff, sector)) count = 0;
19
                @//
20
21
  }
22
  else/* Multiple block write */
23
  {
24
    @//
25
                 if(!SD_writeMultipleBlock (buff, sector, count)) count
26
= 0;
27
                @//
28
  }
29
30
  return count ? RES_ERROR : RES_OK;
31
}
32
#endif /* _READONLY */

von Jim M. (turboj)


Lesenswert?

Die Glaskugel sagt, dass die SD_Write*() Funktionen einen (BYTE *) 
erwarten, z.B:
1
 bit SD_writeSingleBlock (BYTE * buff, DWORD sector);

Du rufst die aber mit einem "const BYTE *" auf. Darüber wird der 
Compiler meckern.

Mögliche Abhilfe: Auch diese Funktionen mit "const BYTE *" deklarieren:
1
 bit SD_writeSingleBlock (const BYTE * buff, DWORD sector);

von 8051s-slave (Gast)


Lesenswert?

Vielen Dank erstmal für die schnelle Hilfe. Leider hat das nicht 
geklappt.
Daraufhin habe ich einfach das cont entfernt und hoffe dass das jetzt 
trotzdem noch geht. Allerdings sagt der Kompiler jetzt, dass er einen 
neuen Fehler gefunden hat und da bin ich gänzlich überfragt.
Dieser lautet:
Bad actual argument type
1
/*-----------------------------------------------------------------------*/
2
// Write Sector(s)                                                       */
3
4
#if _READONLY == 0
5
6
DRESULT disk_write (
7
  BYTE drv,      // Physical drive nmuber (0..) 
8
  BYTE *buff,          // Data to be written 
9
  DWORD sector,    // Sector address (LBA) 
10
  UINT count      // Number of sectors to write  
11
)
12
13
    {   _<---_  _UND_ _ZWAR_ _AN_ _DIESER_ _STELLE_
14
  if (drv || !count) return RES_PARERR;
15
  if (Stat & STA_NOINIT) return RES_NOTRDY;
16
17
  if (count == 1)         // Single block write 
18
        {  
19
    
20
            if(!SD_writeSingleBlock (buff, sector)) count = 0;
21
         // if(!SD_writeSingleBlock (const unsigned char * buff, sector)) count = 0;
22
    
23
        }
24
  
25
        else                    // Multiple block write 
26
        {              
27
    if(!SD_writeMultipleBlock (buff, sector, count)) count = 0;
28
          //if(!SD_writeMultipleBlock (const unsigned char * buff, sector, count)) count = 0;
29
     }
30
31
  return count ? RES_ERROR : RES_OK;
32
}
33
#endif              // _READONLY

von Bernhard S. (b_spitzer)


Lesenswert?

8051s-slave schrieb im Beitrag #2525375:
> if(!SD_writeSingleBlock (buff, sector)) count = 0;
>
>// if(!SD_writeSingleBlock (const unsigned char * buff, sector)) count = 0;

Beim Funktionsaufruf kommt natürlich kein Datentyp vor den Parameter. 
Die auskommentierte Zeile ist generell Murks.
Jetzt fehlt uns nur noch Deine Funktionsdeklaration von 
SD_writeSingleBlock() und der dazugehörige Funktionsprototyp.

unn tschuess
Bernhard

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.