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


von Markus C. (s3v3n)


Angehängte Dateien:

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:
1
for(i=0; i<=0x1F; i++){
2
    spi_rec = ic_readSingleRegister(i);
3
    printf("Register 0x%X: 0x%X \n", i, spi_rec);
4
}

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:
1
unsigned char ic_readSingleRegister(unsigned char address){
2
    unsigned char temp;
3
4
    if(address > 0x1F)  return 0;  
5
6
    temp = 0x40;
7
    temp += address;
8
9
    spi1_sendByte(temp);
10
    temp = 0x00;
11
    temp = spi1_receiveByte();
12
13
    return (temp);
14
}
15
16
void spi1_sendByte(unsigned char data){
17
  volatile AT91PS_SPI pSPI = AT91C_BASE_SPI1;
18
19
  while(!(pSPI->SPI_SR & AT91C_SPI_TDRE));
20
  pSPI->SPI_TDR = data & 0x00FF 
21
}
22
23
unsigned char spi1_receiveByte(void){
24
  volatile AT91PS_SPI pSPI = AT91C_BASE_SPI1;
25
        unsigned char temp;
26
27
  spi1_sendByte(0xFF);    //zuerst byte senden
28
29
  while(!(pSPI->SPI_SR & AT91C_SPI_RDRF));
30
  temp = (pSPI->SPI_RDR & 0x00FF);
31
32
  return(temp);
33
34
35
}

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!

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.