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


von Pandora I. (pandoraiii)



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;
}

von Can C. (moklok)


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

von Lucky L. (rantanplan)


Lesenswert?

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
Noch kein Account? Hier anmelden.