Moin, ich suche gerade nach einer vernünftigen Erklärung, warum ich mit einer Bit Modify Instruction das Register BFPCTRL beschreiben kann aber das Register CANCTRL mit einer Bit Modify Instruction oder einer Byte Write Instruction nicht beschreiben kann! Meine HW-Konfiguration ist ein einfacher Atmega328p und ein CAN-Controller MCP2515, der über SPI mit dem Atmega kommuniziert. Weiß jemand wofür das 'x' (Higher Nibble) auf Seite 63 des Datanblattes für den MCP2515/ Table 11-2 steht? Ist dies ein dont't care? Dies könnte die Lösung für mein Problem sein! Denn die SPI-Kommunikation scheint zu funktionieren, weil ich zum Beispiel den RX0BF-Pin durch schreiben in das BFPCTRL Register an- und ausschalten kann! Es können aber auch andere Gründe vorliegen! Kann mir jemand helfen?
:
Verschoben durch Moderator
Thomas K. schrieb: > Weiß jemand wofür das 'x' (Higher Nibble) auf Seite 63 des Datanblattes > für den MCP2515/ Table 11-2 steht? x = unknown Das kann der Resetcontroller ja auch nicht wissen, weil er nicht weiß, welchen Pegel z.B. der TX2RTS-Pin hat...
:
Bearbeitet durch Moderator
Ich meine die Adressen, nicht die daten! Was Du meinst, bezieht sich auf Daten! Wenn ich zum Beispiel folgende Programmzeilen angebe: ldi r16,0b00001111 ;Adresse für CANCTRL ldi r17,0b00000100 ;Daten Normal Operation Mode, clk/2 call SPI_WRITE dann weiß ich nicht, welche Adresse ich nehmen soll (1.Zeile)! Das Low-Nibble (1111) ist klar (Datenblatt S. 60)! Aber was heißt ADDRESS: XFh? F sind die eben genannten 1111! Und X? Unterprogramm SPI_Write: SPI_WRITE: push r18 ldi r18,0b00000010 cbi PORTB,2 ;SS low! out SPDR,r18 SPIW1: in r16,SPSR sbrs r16,7 jmp SPIW1 out SPDR,r16 SPIW2: in r16,SPSR sbrs r16,7 jmp SPIW2 out SPDR,r17 SPIW3: in r16,SPSR sbrs r16,7 jmp SPIW3 sbi PORTB,2 ;SS high! pop r18 ret
Hallo Thomas, auf das Register TXRTSCTRL kannst du nur im Configuration-Mode zugreifen. Im Register CANCTRL kannst du den Configuration-Mode über die Bits REQOP2,REQOP1 und REQOP0 setzen. Gruss Werner
Hallo Werner, dies ist klar! Aber um die REQOPn-Bits ändern zu können muss ich das Register CANCTRL ansprechen, welches das eigentliche Problem darstellt! Welche Adresse hat CANCTRL? Grüße, Thomas
Thomas K. schrieb: > Welche Adresse hat CANCTRL? Hallo Thomas, CANCTRL hat die Adresse 0x0F. CANCTRL kann über Bit-Modify-Command beschrieben werden. Gruss Werner
Hi, Auf Seite 63 vom aktuellen DB sind alle Register. Bei CANCTRL und CANSTAT sind die Highnibbles egal da alle( X = 0 bis F ) 0xXF auf CANCTRL gehen und alle oxXE auf CANSTAT gehen Gruß JackFrost
Hallo, ja genau so habe ich es mir schon gedacht, wusste aber nicht genau, ob ich es so aufassen konnte! @Werner: Jetzt habe ich nochmals CANCTRL mit einer Adresse 00001111 und dem Bit Modify Command beschrieben und siehe da, es funktioniert (Das habe ich am CLKOUT-Pin sehen, wo jetzt statt 750 kHz 3Mhz anliegen)! Grüße, Thomas
Thomas K. schrieb: > ldi r16,0b00001111 ;Adresse für CANCTRL > ldi r17,0b00000100 ;Daten Normal Operation Mode, clk/2 > call SPI_WRITE Irgendwo habe ich mal die angehängte Datei mit den Registern des MCP2515 gefunden und nutze die jetzt immer. Das Programm sieht damit viel übersichtlicher aus:
1 | ldi temp2, CNF1 |
2 | ldi temp1, 0x00 |
3 | rcall mcp2515_write_reg |
4 | |
5 | ldi temp2, CNF2 |
6 | ldi temp1, 0xb8 |
7 | rcall mcp2515_write_reg |
8 | |
9 | ldi temp2, CNF3 |
10 | ldi temp1, 0x05 |
11 | rcall mcp2515_write_reg |
12 | |
13 | ldi temp2, RXB0CTRL |
14 | ldi temp1, (1<<RXM1)|(1<<RXM0)|(1<<BUKT) |
15 | rcall mcp2515_write_reg |
16 | |
17 | ldi temp2, RXB1CTRL |
18 | ldi temp1, (1<<RXM1)|(1<<RXM0) |
19 | rcall mcp2515_write_reg |
Das Original stammt vom Kreativen Chaos aus der Universellen CAN-Bibliothek: http://www.kreatives-chaos.com/artikel/universelle-can-bibliothek
:
Bearbeitet durch Moderator
Hei Thomas, zur Zeit arbeite ich immer noch an den Grundmodulen für die SPI-Kommunikation - deswegen kann ich erst Schritt A vor B machen! Dein Beispiel konzentriert sich auf die allgemeinen Einstellungen der Receive-Buffer, Masken und Akzeptanzfilter. Wie gesagt, ein SPI-Programm für Bit Modify Instruction habe ich bereits erstellt jedoch habe ich bis jetzt noch kein funktionierndes Programm für Read Instruction hingekriegt!
Thomas K. schrieb: > jedoch habe ich bis jetzt noch kein funktionierndes Programm > für Read Instruction hingekriegt! Hilft dir das:
1 | mcp2515_read_rx_status: |
2 | ; Liest den Status der Empfangspuffer aus und |
3 | ; legt diesen im Register can_rx_status_reg ab |
4 | |
5 | cbi MCP_CSPort, MCP_CS ;CS Low |
6 | |
7 | ldi temp1, SPI_RX_STATUS |
8 | rcall spi_putc ;Register 'Status' wählen |
9 | |
10 | ldi temp1, 0xFF |
11 | rcall spi_putc ;Register Lesezugriff |
12 | |
13 | mov can_rx_status_reg, temp1 |
14 | |
15 | sbi MCP_CSPort, MCP_CS ;CS High |
16 | ret |
17 | ;_______________________________________________ |
18 | mcp2515_read_reg: |
19 | ;Beliebiges Register lesen |
20 | ;Register-Adresse kommt in Temp2 |
21 | ;Rückgabewert in Temp1 |
22 | |
23 | cbi MCP_CSPort, MCP_CS ;CS Low |
24 | |
25 | ldi temp1, SPI_READ |
26 | rcall spi_putc |
27 | |
28 | mov temp1, temp2 ;Adresse senden |
29 | rcall spi_putc |
30 | |
31 | ldi temp1, 0xFF |
32 | rcall spi_putc ;Dummy-Senden |
33 | |
34 | in temp1, SPDR |
35 | |
36 | sbi MCP_CSPort, MCP_CS ;CS High |
37 | ret |
38 | ;_______________________________________________ |
39 | spi_putc: ;Atomic-SPI-Write |
40 | out SPDR, temp1 |
41 | spi_p1: in temp1, SPSR |
42 | sbrs temp1, SPIF |
43 | rjmp spi_p1 |
44 | in temp1, SPDR ;Rückgabe beim Lesen |
45 | ret |
Es könnte helfen (MCP2515_read_reg)! Der Ablauf scheint nicht nach dem Schema zu gehen, wie ich ihn als Anhang beigefügt habe! Ich melde mich später nochmal - vielleicht kriege ich es jetzt hin! Grüße, Thomas
So, jetzt funktionierts! Danke für Deine Hilfe! Mir wird jetzt auch klar, dass ich nur empfangen kann, wenn ich sende! Deswegen auch das Dummy-Byte! Nur habe ich nicht kapiert, warum ich am Ende des Programms 2x hintereinader empfange! Beste Grüße!
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.