Hallo, nach einigen erfolglosen versuchen daten mit der canlib von kreatives-chaos zu empfangen habe ich bei der fehlersuche mal die Tx und Rx Pins direkt am controller gemessen (nicht can_h und can_l am mcp2551). ist es normal das dort der tx pin immer high und rx immer low ist? leider nur mit dem multimeter gemessen.
Ernst gemeint? Das muss mit einem Oszilloskop gemessen werden, das die notwendige Zeitauflösung hat, sonst zeigt dein Multimeter einfach einen effektiven Gleichspannungswert an. Gruß Jens
CAN schrieb: > ist es normal das dort der tx pin immer high und rx immer low > > ist? leider nur mit dem multimeter gemessen. Also mit einem Multimeter gemessen, sollte der rx-Pin ebenfalls "logisch 1" sein. Das wäre nicht in Ordnung. Aber mit dem Mulitimeter wirst Du die CAN-Botschaften nie wirklich wahrnehmen können. Wie debuggst Du? mit Print ausgaben auf COM?
das ich mit einem multimeter keine can nachrichten "sehen" kann ist mir schon klar. ich hatte auch ursprünglich mit dem open bench logic sniffer messen wollen. allerdings zeigt auch dieser einen dauerhaften high pegel auf tx und low auf rx. ganz gleich ob ich sende oder nicht. leider habe ich wenig vertrauen in diesen billig analyser, weswegen ich noch mal mit dem multimeter am pin war. die debug ausgaben habe ich tatsächlich über den usart ausgeben wollen. ich hätte eigentlich erwartet das beide pinne am controller low sind wenn nichts auf dem bus passiert und nur für die dauer des senden bzw empfangens high impulse führen. aber wenn wirklich beide pinne high pegel haben sollten steckt der fehler wohl nicht in der software.
habe grade noch mal geschaut ob irgendwo eine brücke oder ähnliches übersehen wurde. es ist aber alles in ordnung. wenn ich dem controller sage er soll den port d auf eingang setzen und ihn ansonsten nackig lasse sind auch beide pins (rx, tx) wie erwartet low. die hardware scheint also zu funktionieren. sobald ich den can bus mit der can lib initialisiere habe ich wieder das oben bereits beschriebene bild. hier mal der testcode:
1 | #ifndef F_CPU
|
2 | |
3 | #define F_CPU 16000000 // do NOT append UL to this number
|
4 | |
5 | #endif
|
6 | #include <stdint.h> |
7 | #include <stdlib.h> |
8 | #include <avr/io.h> |
9 | #include <avr/interrupt.h> |
10 | #include <avr/pgmspace.h> |
11 | #include "uart.h" |
12 | #include "can.h" |
13 | #include "config.h" |
14 | #include <util/delay.h> |
15 | |
16 | #define UART_BAUD_RATE 500000
|
17 | |
18 | |
19 | int main(void) |
20 | {
|
21 | unsigned int c; |
22 | uart1_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU)); |
23 | can_init(BITRATE_125_KBPS); |
24 | can_filter_t filter = { |
25 | .id = 0, |
26 | .mask = 0, |
27 | .flags = { |
28 | .rtr = 0, |
29 | .extended = 0 |
30 | }
|
31 | };
|
32 | can_set_filter(0, &filter); |
33 | int i; |
34 | sei(); |
35 | |
36 | while(1) |
37 | {
|
38 | c = uart1_getc(); |
39 | if ( c & UART_NO_DATA ) { |
40 | /*
|
41 | * no data available from UART
|
42 | */
|
43 | } else { |
44 | uart1_puts("Gateway vorhanden"); |
45 | //dummy nachricht
|
46 | can_t msg; |
47 | msg.id = 1; |
48 | msg.flags.rtr = 0; |
49 | msg.flags.extended = 0; |
50 | msg.length = 4; |
51 | msg.data[0] = 0x01; |
52 | msg.data[1] = 0x02; |
53 | msg.data[2] = 0x03; |
54 | msg.data[3] = 0x04; |
55 | can_send_message(&msg); |
56 | }
|
57 | if(can_check_message()) { |
58 | can_t msg; |
59 | can_get_message(&msg); |
60 | uart1_puts("ID: "); |
61 | uart1_putc(msg.id); |
62 | uart1_puts("Length: "); |
63 | uart1_putc(msg.length); |
64 | uart1_puts("Data: "); |
65 | for(i = 0; i <= msg.length; i++) { |
66 | uart1_putc(msg.data[i]); |
67 | }
|
68 | }
|
69 | }
|
70 | }
|
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.