PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SPI-SRAM Pointer zum Auslesen übergeben



Marten83
25.10.2009, 15:10
Hallo,

ich habe noch ein Problem....
Ich habe ein Routine für den SPI Bus (Interruptgesteuert) geschrieben uns stehe vor dem Problem, dass ich einen Pointer eines Arrays, in das dieDaten aus dem SRAM geschrieben werden sollen, übergeben möchte.
Was mache ich falsch?

Hier die betreffenden Routinen:
SPI

void
SPI_master_read (char **data_ptr, uint8_t data_bytes)
{
if (data_bytes > 0)
{
while (SPI_busy == 1);

DataToRead = data_bytes;
PtrToData = *data_ptr;

SPI_dir = READ;

SPDR = 0xff;

SPI_busy = 1;
}
}

ISR (SPI_STC_vect)
{ // Point to next Char in String
switch (SPI_dir)
{
case WRITE:
if (DataToSend != 0) // if end not reached
{
DataToSend--;
PtrToData++;
SPDR = *PtrToData; // send Character
}
else
{
if (SPI_hold == 0)
{
SPI_busy = 0; // if end reached enable transmission of next String
Disable_SPI_Device;
}
else
{
SPI_busy = 0;
SPI_hold--;
}
}
break;

case READ:

if (DataToRead != 0)
{
DataToRead--;
*PtrToData = SPDR;
char glu[2];
glu[0] = *PtrToData;
glu[1] = '\0';
PtrToData++;
SPDR = 0xff;
}
else
{
*PtrToData = SPDR;
SPI_busy = 0;
Disable_SPI_Device;
}
break;
}
}

und SRAM

void
SRAM_read (uint16_t adress, char **sram_ptr, uint8_t sram_bytes)
{
char send [3];

//send read instruction and start adress
send [0] = 0x03;
send [1] = adress >> 8;
send [2] = adress & 0xff;

SPI_master_send (&send [0], 3, 1);

SPI_master_read (sram_ptr, sram_bytes);
}

mit dem Aufruf

char tempbuf [13];
SRAM_read (0x0001, tempbuf, 12);
Die Datenübertragung funktioniert (einzelne Bytes werden übertragen).

Vielen Dank!

MfG, Marten83

PicNick
25.10.2009, 15:17
Eins fällt mir auf.
send [1] = adress >> 8;
send [2] = adress & 0xff;
Auf diese Art sendest du zuerst das LSB

Wenn das der Reader die Adresse nicht ebenfalls umdreht, steht er im Wald

sternst
25.10.2009, 15:55
Du definierst (gleich mehrfach) in den Funktionsparametern Pointer auf Pointer auf char, übergibst dann aber beim Aufruf (auch gleich mehrfach) nur einen Pointer auf char.

Marten83
25.10.2009, 16:23
@PicNick:
Ich meine das wäre so richtig, also MSB wird an Stelle 1 also zuerst gesendet.

@sternst:
Ich habe versucht die Adresse auf die der Pointer zeigt einfach an eine darunterliegende Funktion zu übergeben.
Dabei dachte ich, dass ich damit genau das mache (Adresse an Funktion übergeben, welche Diese als Pointer weitergeben kann.
Leider habe ich, wie man sieht, dass anscheinend noch nicht ganz durchschaut.

Marten83
27.10.2009, 08:14
Habe das Problem jetzt gefunden....
Bis f/32Hz (~500kHz) klappt die Übertragung Problemlos, aber ab f/16 (~1MHz) will der SRAM einfach keine Daten mehr ausgeben.
(Keine Ahnung ob er sie denn annimmt)

Jetzt frage ich mich warum?
Laut Oszi kommen Daten am Pin an, Taktflanken sehen gut aus und !CS wird auch zum passenden Zeitpunkt auf 'low' gezogen.

Versorgungsspannung ist auch ok.
Der !HOLD Pin ist auch abgeschaltet.

Hat dazu vielleicht noch jemand eine Idee?

Marten83