mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT91SAM7X256 SPI-Problem beim Lesen


Autor: Markus Cremer (s3v3n)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich benutze in meinem aktuellen Projekt einen Atmel AT91SAM7X256 mit 
NUT/OS 4.8.2 auf dem Demoboard OLIMEX SAM7-EX256. Das Ansteuerung des 
Displays auf dem Board per SPI habe ich bereits in meine Firmware 
integriert.
Ich möchte nun die Register eines externen ICs per SPI auslesen. Diese 
Register sind 8 Bit breit und liegen im Adressebereich 0x00 bis 0x1F 
(5-Bit-Adressen). Um ein Register zu lesen, muss man zunächst ein 
Kommando an den IC schicken: 0x40 + Adresse.
Zum Testen lesen ich einfach alle Register des ICs in einer Schleife aus 
und geben die Adresse und den zugehörigen Register-Inhalt per RS232 aus:
for(i=0; i<=0x1F; i++){
    spi_rec = ic_readSingleRegister(i);
    printf("Register 0x%X: 0x%X \n", i, spi_rec);
}

Das Problem ist nun, dass die Inhalte der Register stimmen, sie aber um 
eine Adresse verschoben ausgegeben werden. D.h. der Inhalt von Register 
0x00 wird bei Adresse 0x01 ausgegeben, der von Register 0x01 bei Adresse 
0x02 und so weiter... schaut man sich den Oszilloskop-Screenshot vom 
SPI-Bus an, sieht man, dass der IC richtig antwortet (Inhalt Register 
0x01 ist 0x06), als Inhalt wird aber trotzdem 0x00 angezeigt und erst 
bei Adresse 0x02 wird dann als Inhalt 0x06 ausgegeben!
Wenn ich das Programm debugge, kommt es nicht zu dieser Verschiebung! 
Dann ist die Ausgabe komplett richtig.

Hier noch die Funktionen, die verwendet werden, im Quelltext:
unsigned char ic_readSingleRegister(unsigned char address){
    unsigned char temp;

    if(address > 0x1F)  return 0;  

    temp = 0x40;
    temp += address;

    spi1_sendByte(temp);
    temp = 0x00;
    temp = spi1_receiveByte();

    return (temp);
}

void spi1_sendByte(unsigned char data){
  volatile AT91PS_SPI pSPI = AT91C_BASE_SPI1;

  while(!(pSPI->SPI_SR & AT91C_SPI_TDRE));
  pSPI->SPI_TDR = data & 0x00FF 
}

unsigned char spi1_receiveByte(void){
  volatile AT91PS_SPI pSPI = AT91C_BASE_SPI1;
        unsigned char temp;

  spi1_sendByte(0xFF);    //zuerst byte senden

  while(!(pSPI->SPI_SR & AT91C_SPI_RDRF));
  temp = (pSPI->SPI_RDR & 0x00FF);

  return(temp);


}

Ich hoffe, mir kann jemand helfen! Ich versuche schon über eine Woche 
das Problem zu lösen aber leider ohne Erfolg.

Vielen Dank für Eure Antworten!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.