Hi. Ich versuche gerade verzweifelt Code in meiner Dokumentation anzeigen zu lassen. Ich möchte den Code von der Funktion SPI_send einbinden. Wenn ich es mit \code und \endcode mache wird mir zwar der Code angezeigt aber bei der Funktion SPI_empfangen. Die Funktion send wird auch gar nicht mehr in der Dokumentation angezeigt.
1 | /**
|
2 | \brief senden von 16 Bit Befehl u. ggf. Daten
|
3 | |
4 | s. S. 56 Bus Protokoll zuerst Befehl dann PEC z. Befehl, danach die Daten und dann Pec zu den Daten
|
5 | SS muss waehrend der gesamten Zeit einer Befehlssequenz low sein also fuer Daten und Befehl => alles in einem Befehl machen.
|
6 | Zuerst muss Highbyte dann Lowbyte gesendet werden. s.S. 56
|
7 |
|
8 | Moegliche Faelle:
|
9 | Befehl und Daten senden direkt hintereinader weg SS muss die ganze zeit 0 sein
|
10 | Nur befehl befehl senden
|
11 |
|
12 | wenn keine Daten gesendet werden diese einfach als 0 uebergeben => dann wird for schleife unten unterborchen
|
13 | \code
|
14 | */
|
15 | |
16 | void SPI_send(uint16_t Befehl, uint16_t Daten) |
17 | {
|
18 | char Nachricht[2]; |
19 | uint16_t PEC, Senden; |
20 | |
21 | PORT_SPI &= ~(1<<SS); // SS auf Low => Kommunikation Starten |
22 | |
23 | for(uint8_t i = 0; i<2; i++) |
24 | {
|
25 | if(i==0) |
26 | {
|
27 | Senden=Befehl; //erster Durchlauf Befehl senden |
28 | }
|
29 | else
|
30 | {
|
31 | Senden=Daten; //zweiter Durchlauf Nachricht senden |
32 | }
|
33 | |
34 | Nachricht[0]=SHORT_H_BYTE(Senden); //Zerlegen in High und Low Byte |
35 | Nachricht[1]=SHORT_L_BYTE(Senden); |
36 | |
37 | PEC=pec15(Nachricht,2); //PEC für die entspechende Nachricht berechnen |
38 | |
39 | SPDR = Nachricht[0]; //H_Byte Befehl senden |
40 | while(!(SPSR & (1<<SPIF))); //Warten bis gesndet wurde |
41 | |
42 | SPDR = Nachricht[1]; //L_Byte Befehl senden |
43 | while(!(SPSR & (1<<SPIF))); //Warten bis gesndet wurde |
44 | |
45 | SPDR = SHORT_H_BYTE(PEC); //H_Byte PEC_Befehl senden |
46 | while(!(SPSR & (1<<SPIF))); //Warten bis gesndet wurde |
47 | |
48 | SPDR = SHORT_L_BYTE(PEC); //L_Byte PEC_Befehl senden |
49 | while(!(SPSR & (1<<SPIF))); //Warten bis gesndet wurde |
50 | |
51 | if (Daten == 0) break; //wenn keine Daten gesendet werden sollen => Daten =0 => dann for schleife verlassen ansonsten wieder in Schleife eintreten |
52 | }
|
53 | PORT_SPI |=(1<<SS); |
54 | }
|
55 | /** \endcode*/
|
56 | |
57 | |
58 | |
59 | |
60 | /**\brief Funktion zum Auslesen eines 16 bit Wertes aus SPI Register
|
61 | |
62 | Fuer manche Abfragen muss man IC ein wenig Zeit geeben deswegen die moeglichkeit einen Delay zu uebergeben
|
63 | */
|
64 | uint16_t SPI_empfangen (uint8_t Anzahl_Bytes) |
65 | {
|
66 | uint16_t Empfangen=0; |
67 | |
68 | PORT_SPI &= ~(1<<SS); //SS auf Low => Kommunikation Starten |
69 | //_delay_us (5);
|
70 | |
71 | for(uint8_t i=0;i<Anzahl_Bytes; i++) |
72 | {
|
73 | SPDR = 0; //H_Byte Befehl senden |
74 | while(!(SPSR & (1<<SPIF))); |
75 | |
76 | Empfangen |= SPDR; //Falsch!!! anders machen |
77 | |
78 | if (i > 0) |
79 | {
|
80 | Empfangen = (Empfangen <<8); |
81 | }
|
82 | }
|
83 | PORT_SPI |=(1<<SS); |
84 | return Empfangen; |
85 | }
|
Habe jetzt schon lange gesucht aber bin irgendwie nicht wirklich fündig geworden. Manchmal ist das Manual von Doxygen irgendwie ein bisschen schwer zu deuten :D. Danke