www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik an die ATMEL AVR PROFIS (SPI)


Autor: Pandora Iii (pandoraiii)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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;
}

Autor: Can Cobe (moklok)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Lucky Luck (rantanplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pandora Iii schrieb:
>
 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
 //code 
 zwecks übersicht.

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.