Hallo, es handelt sich hier um ein Code für einen Atmel AVR. Da ich einen Sensor ansteuern möchte , aber mit einem LPC 935. Da sind mir ein paar Sachen fremd in dem Text. Habe mal ein ATMEL Datenblatt angeschaut aber finde diese Register auch nicht, vill kann mir einer einen Tipp geben wo ich sowas finde.... Habe ein paar Kommentare gemacht zu dem Code, wäre nett wenn da jemand was zu schreiben könnte... /* * Execute SPI communication, This code extract is designed for ATMEL AVR */ inline uint16_t <<<<< Was ist inline ? eine Variable ? HW_SPI(uint8_t W_len, uint16_t W_data, uint8_t R_len) <<< Ist HW_SPI eine Funktion ? { uint16_t value; value = 0; #ifdef SCA_SCP_DEMO <<<<??? SPI_I2C_PORT &= ~(1 << SPI_I2C_SELECT); <<< Was ist das für ein Register? #endif <<< ??? HW_POUT(0,0); // pin 0 is reserved for CSB! switch(W_len) { case 0: break; case 8: // This loop writes 8 bit data to SPI SPDR = (uint8_t)(W_data); while(!(SPSR & (1<<SPIF))) ; value = SPDR; break; case 16: // This loop writes 16 bit data to SPI SPDR = (uint8_t)(W_data>>8); while(!(SPSR & (1<<SPIF))) ; value = SPDR << 8; SPDR = (uint8_t)(W_data); while(!(SPSR & (1<<SPIF))) ; value |= SPDR; <<< Für was steht SPDR ??? break; default: SPI_DISABLE(); <<<< ??? Was macht diese Funktion W_data <<= (16 - W_len); // This loop writes W_len bit long data to // SPI while(W_len > 0) { SPI_PORT &= ~(1<<SPI_CLK); <<< Kann man da wissen welcher Port gemeint ist? if(W_data & 0x8000) SPI_PORT |= (1<<SPI_MOSI); else SPI_PORT &= ~(1<<SPI_MOSI); W_data <<= 1; wait_1us(); SPI_PORT |= (1<<SPI_CLK); wait_1us(); value <<= 1; if(SPI_PORT & (1<<SPI_MISO)) value |= 0x0001; W_len--; } SPI_PORT &= ~(1<<SPI_CLK); SPI_ENABLE(); <<< CS einschalten sprich auf low schalten ? break; } while(R_len != 0) //This loop reads R_len bits from SPI { if((R_len % 8) == 0) //use standard HW SPI for 8 bit and 16 bit data { //This loop is used for VTI SCA100T 8 bit temperature // data SPDR = 0x00; value <<= 8; R_len -= 8; while(!(SPSR & (1<<SPIF))) ; value |= SPDR; } else { SPI_DISABLE(); //if data length is not 8 or 16 bit then disable HW SPI while(R_len > 0)//This loop generates SPI clock signal to the SPI port { //and read SPI data bit by bit SPI_PORT &= ~(1<<SPI_CLK); //This loop is used for VTI SCA100T 11 bit // measurement data. wait_1us(); //For measurement data R_len=11 wait_1us(); wait_1us(); //wait_1us routines generate 1 us delay, // These 4 1us waits are needed to generate 50% duty // cycle to SPI clock signal SPI_PORT |= (1<<SPI_CLK); //with these delays the SPI clock is // high 3us and low 3us. wait_1us(); value <<= 1; if(SPI_PORT_IN & (1<<SPI_MISO)) value++; R_len--; } SPI_PORT &= ~(1<<SPI_CLK); SPI_ENABLE(); } } HW_POUT(0,1); // pin 0 is reserved for CSB! return value; }
inline das ist ein schluesselwort, dass du vor eine prozedur/funktion schreiben kannst. funktionen werden nomalerweise "aufgerufen". dieser aufruf erfordert ein paar rechenschritte. mit inline wird dagegen der prozedurcode vom compiler direkt an der aufrufstelle eingefuegt, so dass kein aufruf mehr noetig ist. der code ist ja dann schon da. dein programm wird dadurch schneller, verbraucht dafuer aber mehr speicher. HW_SPI ja, das ist eine funktion #ifdef SCA_SCP_DEMO das ist ein praeprozessor befehl. wenn SCA_SCP_DEMO nicht gesetzt ist, tut der compiler einfach so, als waere der code bis #endif nicht vorhanden. SPI_I2C_PORT hier verbirgt sich ein register. ich nehme an, dass das ein makro ist. du musst also gucken wo sowas steht: #define SPI_I2C_PORT ... hinter den drei punkten solltest du ein register finden, dass sich auch in deinen unterlagen befindet SPI_PORT hier dasselbe wie oben
Pandora Iii schrieb: >
1 | SPI_DISABLE(); <<<< ??? Was macht diese Funktion |
Das gegenteil zu SPI_ENABLE(); Du musst unbedingt deine C-Kenntnisse, wenn vorhanden, aufbesser. Zu den Register bzw. Macros. Es muss irgendwo einen HAL (Hardware abstcration layer) oder sowas wie eine bitdef_avr.h geben. Da steht das alles drin. Kenn mich nicht gut mit AVRs aus. Kann mir vorstellen das die unterschiedlich sind, je nachdem was für einen Compiler du verwendest. Code bitte in
1 | //code
|
zwecks übersicht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.