Forum: Mikrocontroller und Digitale Elektronik CAN Controller MCP2515: Schreiben in CANCTRL


von Thomas K. (Firma: kuhn energy) (tomtechtronics)


Lesenswert?

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
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

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
von Thomas K. (Firma: kuhn energy) (tomtechtronics)


Lesenswert?

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

von WR (Gast)


Lesenswert?

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

von Thomas K. (Firma: kuhn energy) (tomtechtronics)


Lesenswert?

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

von WR (Gast)


Lesenswert?

Thomas K. schrieb:
> Welche Adresse hat CANCTRL?

Hallo Thomas,

CANCTRL hat die Adresse 0x0F. CANCTRL kann über Bit-Modify-Command 
beschrieben werden.

Gruss Werner

von Bastian W. (jackfrost)


Lesenswert?

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

von Thomas K. (Firma: kuhn energy) (tomtechtronics)


Lesenswert?

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

von Thomas F. (igel)


Angehängte Dateien:

Lesenswert?

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
von Thomas K. (Firma: kuhn energy) (tomtechtronics)


Lesenswert?

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!

von Thomas F. (igel)


Lesenswert?

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

von Thomas K. (Firma: kuhn energy) (tomtechtronics)


Angehängte Dateien:

Lesenswert?

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

von Thomas K. (Firma: kuhn energy) (tomtechtronics)


Lesenswert?

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