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!