- LiFePO4 Speicher Test         
Ergebnis 1 bis 6 von 6

Thema: Mega32 und SPI

  1. #1
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9

    Mega32 und SPI

    Anzeige

    E-Bike
    Hallo Forum,

    ich nutze das RN-Control und hab daran über SPI einen MCP2515 angeschlossen. Als Chipselect für den MCP benutze ich PortB.4
    Dazu nutze ich folgendes Programm:
    Code:
    'Mikrocontroller
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    'Stacks
    $hwstack = 200
    $swstack = 200
    $framesize = 400
    
    'UART konfigurieren
    $baud = 19200
    
    'SPI konfigurieren
    Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Noss = 1 , Clockrate = 16
    Spiinit
    
    'Unterprogramme
    Declare Sub Read_register(byval Adress As Byte )
    Declare Sub Write_register(byval Adress As Byte , Byval Daten As Byte)
    Declare Sub Bitmodify(byval Reg_add As Byte , Byval Reg_mask As Byte , Byval Reg_val As Byte)
    Declare Sub Write_tx
    Declare Sub Register
    Declare Sub Mcp2515_init
    Declare Sub Send_can
    
    'Befehle
    Const Spi_read = &H03
    Const Spi_write = &H02
    Const Spi_reset = &HC0
    Const Spi_rts0 = &H81
    Const Spi_bitmodify = &H05
    
    'Registeradressen
    Const Cnf1 = &H2A
    Const Cnf2 = &H29
    Const Cnf3 = &H28
    Const Canctrl = &H0F
    Const Caninte = &H2B
    Const Txb0ctrl = &H30                                       'Transmit Buffer 0 Control Register
    Const Txb0sidh = &H31                                       'Transmit Buffer 0 Std Identifier High
    Const Txb0sidl = &H32                                       'Transmit Buffer 0 Std Identifier Low
    Const Txb0eid8 = &H33                                       'Transmit Buffer 0 Ext Identifier High
    Const Txb0eid0 = &H34                                       'Transmit Buffer 0 Ext Identifier Low
    Const Txb0dlc = &H35                                        'Transmit Buffer 0 Data Length Code
    Const Txb0d0 = &H36                                         'Transmit Buffer 0 Data Byte 0
    Const Txb0d1 = &H37                                         'Transmit Buffer 0 Data Byte 1
    Const Txb0d2 = &H38                                         'Transmit Buffer 0 Data Byte 2
    Const Txb0d3 = &H39                                         'Transmit Buffer 0 Data Byte 3
    Const Txb0d4 = &H3A                                         'Transmit Buffer 0 Data Byte 4
    Const Txb0d5 = &H3B                                         'Transmit Buffer 0 Data Byte 5
    Const Txb0d6 = &H3C                                         'Transmit Buffer 0 Data Byte 6
    Const Txb0d7 = &H3D                                         'Transmit Buffer 0 Data Byte 7
    Const Rxm0sidh = &H20                                       'Receive Buffer 0 Std Identifier High
    Const Rxm0sidl = &H21                                       'Receive Buffer 0 Std Identifier Low
    Const Rxm0eid8 = &H22                                       'Receive Buffer 0 Ext Identifier High
    Const Rxm0eid0 = &H23                                       'Receive Buffer 0 Ext Identifier low
    Const Rxm1sidh = &BH24                                      'Receive Buffer 1 Std Identifier High
    Const Rxm1sidl = &H25                                       'Receive Buffer 1 Std Identifier Low
    Const Rxm1eid8 = &H26                                       'Receive Buffer 1 Ext Identifier High
    Const Rxm1eid0 = &H27                                       'Receive Buffer 1 Ext Identifier low
    Const Rxb0ctrl = &H60
    Const Rxb1ctrl = &H70
    
    'I/O Einstellungen
    Config Portb.4 = Output
    
    'Namen vergeben
    Cs Alias Portb.4
    
    'Variablen
    Dim Canin As Byte
    
    'Interrupts aktivieren
    Enable Interrupts
    
    'Chipselect auf High setzen
    Set Cs
    Wait 1
    
    'MCP2515 initialisieren
    Call Mcp2515_init
    
    'Hauptprogramm
    Do
    
    Call Write_tx                                               'Zu übertragende Daten setzen
    Call Send_can                                               'Senden auslösen
    Call Register
                                                                'Register auslesen
    Waitms 100
    
    Loop
    End
    
    
    
    'Unterprogramme
    '-------------------------------------------------------------------------------------------------------------------
    
    Sub Read_register(byval Adress As Byte )
    
    Reset Cs                                                    'Chipselect auf Low ziehen
    Spdr = Spi_read                                             'Inhalt von "SPI_Read" im Datenregister speichern                                            'Read Instruction (0000 0011) senden
    Spiout Spdr , 1
    Spiout Adress , 1
    Spiin Canin , 1                                             'Registerinhalt einlesen
    Waitms 10
    Set Cs                                                      'Chipselect auf High ziehen
    End Sub
    
    '-------------------------------------------------------------------------------------------------------------------
    
    Sub Write_register(byval Adress As Byte , Byval Daten As Byte)
    
    Reset Cs                                                    'Chipselect auf Low ziehen
    Spdr = Spi_write                                            'Inhalt von "SPI-Write" ins SPI_Data_Register schieben
    Do                                                          'Schleife bis SPI Interrupt Flag gesetzt wurde, also bis
    Loop Until Spsr.spif = 1                                    'die Übertragung abgeschlossen ist
    
    Spdr = Adress
    Do
    Loop Until Spsr.spif = 1
    
    Spdr = Daten
    Do
    Loop Until Spsr.spif = 1
    Set Cs                                                      'Chipselect auf High ziehen
    End Sub
    
    '-------------------------------------------------------------------------------------------------------------------
    
    Sub Mcp2515_init
    
    Reset Cs
    
    'MCP2515 reseten
    Spdr = Spi_reset
    Do
    Loop Until Spsr.spif = 1
    Set Cs
    Waitms 2000                                                 '10ms warten, da sonst das Auslesen von CNF1
                                                              'nicht richtig erfolgen kann
    'Control Register beschreiben
    Write_register Canctrl , &H8F                               'Device in Configuration Mode versetzen, OSC-Pin
                                                                 'aktivieren, Fclk = F / 8 einstellen
    'Interrupts einstellen
    Write_register Caninte , &H04                               'Transmit Buffer 0 Interrupt aktivieren
    
    'TX-Konfiguration
    Bitmodify Txb0ctrl , &H03 , &H03
    
    'Bittiming einstellen
    Write_register Cnf1 , &H03                                  'Baudrate einstellen
    Write_register Cnf2 , &HA0                                  'Phasensegmenteinstellungen
    Write_register Cnf3 , &H02
    
    'Rx Buffer einstellen
    Write_register Rxb0ctrl , &H60
    Write_register Rxb1ctrl , &H60
    Write_register Rxm0sidh , 0                                 ' Empfängeradressen auf 0, Filter aus
    Write_register Rxm0sidl , 0
    Write_register Rxm0eid8 , 0
    Write_register Rxm0eid0 , 0
    Write_register Rxm1sidh , 0
    Write_register Rxm1sidl , 0
    Write_register Rxm1eid8 , 0
    Write_register Rxm1eid0 , 0
    
    'CAN-Controller in den "Normal Mode" versetzen
    Bitmodify Canctrl , &HE0 , &H0
    
    'Priorität einstellen
    Write_register Txb0ctrl , &H03                              'Highest Message Priority für Transmit Buffer 0
    
    'Message Identifier einstellen
    Write_register Txb0sidh , &H00
    Write_register Txb0sidl , &H03
    
    End Sub
    
    '-------------------------------------------------------------------------------------------------------------------
    
    Sub Bitmodify(reg_add , Reg_mask , Reg_val)
    
    Reset Cs
    Spdr = Spi_bitmodify
    Do
    Loop Until Spsr.spif = 1
    Waitms 2
    Spdr = Reg_add
    Do
    Loop Until Spsr.spif = 1
    Spdr = Reg_mask
    Do
    Loop Until Spsr.spif = 1
    Spdr = Reg_val
    Do
    Loop Until Spsr.spif = 1
    Set Cs
    
    End Sub
    
    '-------------------------------------------------------------------------------------------------------------------
    
    Sub Send_can
    
    Reset Cs
    Waitms 10
    Spdr = Spi_rts0                                             'Übertragung auslösen
    Do
    Loop Until Spsr.spif = 1
    Set Cs
    
    End Sub
    
    '-------------------------------------------------------------------------------------------------------------------
    
    Sub Register
    
    'Terminalausgabe
    Print "Registereinstellungen:"
    Read_register Cnf1
    Print "Registerinhalt CNF1: " ; Canin
    Read_register Cnf2
    Print "Registerinhalt CNF2: " ; Canin
    Read_register Cnf3
    Print "Registerinhalt CNF3: " ; Canin
    Read_register Canctrl
    Print "Registerinhalt CAN Control: " ; Canin
    Read_register Txb0ctrl
    Print "Registerinhalt TXB0 Control: " ; Canin
    Read_register Txb0sidl
    Print "Registerinhalt TXB0 Identifier Low: " ; Canin
    Read_register Txb0sidh
    Print "Registerinhalt TXB0 Identifier High: " ; Canin
    Read_register Txb0dlc
    Print "Registerinhalt TXB0 Data Lenght: " ; Canin
    Read_register Caninte
    Print "Registerinhalt CAN Interrupt Enable: " ; Canin
    Print "----------------------------------------------------------"
    
    End Sub
    
    '-------------------------------------------------------------------------------------------------------------------
    
    Sub Write_tx
    
    Write_register Txb0sidh , &H55                              'Empfängeradresse setzen
    Write_register Txb0sidl , &H55                              'Empfängeradresse setzen
    Write_register Txb0dlc , &H04                               'Paketlänge festlegen
    Write_register Txb0d0 , &HFF                                'Zu übertragende Daten setzen
    Write_register Txb0d1 , &HFF                                'Zu übertragende Daten setzen
    
    End Sub
    
    '-------------------------------------------------------------------------------------------------------------------
    Das Programm funktioniert auch einwandfrei.
    Wenn ich nun aber denm Chipselect Pin von B.4 auf z.B. B.0 änder (und es auch im Code ändere) funktioniert das Programm nicht mehr, obwohl ich sonst nichts geändert habe.
    Woran liegt das? Für einen Chipselect-Pin kann man doch jeden x-beliebigen I/O Pin nehmen oder liege ich da falsch?
    Danke für die Antwort!
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Daniel,
    ich habe den CS auf einen anderen Port gelegt und es funktioniert ohne Probleme.
    Ist das dein ganzer Code? Im Datenblatt zum PinB.0 steht, dass die XCK Funktion nur im synchronen Mode benutzt wird. Sehe ich bei dir aber nicht.
    Hast du mal einen anderen Pin ausprobiert?

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied Avatar von masasibe
    Registriert seit
    21.01.2011
    Beiträge
    181
    Komisch!
    Eigentlich müsste das schon funktionieren. Bei der letzten
    SPI-Verbindung mit einem ATmega48 habe ich beim Master auch nicht
    den SS-Pin verwendet und es hat problemlos funktioniert.
    Wenn ein Master mehrere Slaves ansteuert, dann muss man
    ja sogar mehrere verschiedene IO-Pins verwenden.

    Meine Frage ist sicher banal, aber hast du auch mal mit dem
    Oszi geschaut ob PORTB.0 dann auch wirklich auf Low geht bzw.
    hast du geschaut, ob sich PORTB.0 bei einer Übertragung anders
    verhält als PORTB.4?
    Sonst probiers mal mit einem anderen Pin als PORTB.0, wie for_ro auch schon
    geschrieben hat.

    Den Code habe ich mehr jetzt nicht ganz durchgelesen,
    aber ich würde es einmal mit einem ganz einfachen
    Testprogramm probieren, wenn es dann funktioniert,
    weißt du zumindest, dass es von der Hardware her funktionieren
    müsste.

    mfg masasibe

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Hallo und danke euch beiden
    Masasibe der Code den ich verwende funktioniert ja und den nehme ich dann auch als Grundlage um es zu testen (und jop es ist der ganze Code )
    Aber ich probier mal nen anderen Pin. Und mit dem Oszi hätte ich mal gucken können stimmt schon ...... nicht dran gedacht ^.^
    Es hat mich halt nur gewundert und irritiert das es nicht funktioniert :/
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  5. #5
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Merkwürdig nun funktioniert es......
    Kann es sein das der MCP beim Programmieren stört? Weil ab und an flashe ich das Programm auf den Mega32 aber da kommt nichts.

    Edit: Es funktioniert doch nicht immer. Sobald ich den MCP anstecke bleibt das Programm stehen.....ohne MCP wird auch schön der Pin für den CS geschaltet aber sobald ich den wieder anstecke passiert nichts mehr.
    Geändert von Kampi (29.02.2012 um 23:30 Uhr)
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  6. #6
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Also ich weiß einfach nicht warum......aber der Code arbeitet nur einwandfrei wenn ich den CS vom MCP mit dem SS vom Mega32 verbinde......bei allen anderen Pins ist es so ein bischen russisch Roulette. Mal ließt er gar nichts, mal ließt er zwei Register aus und gibt danach 1x 255 aus und dann passiert gar nichts. Und das Oszi zeigt auch die ganze Zeit nen Low-Pegel für den CS Pin an und Pegelwechsel usw. findet auch nicht mehr statt.
    Aber dieses "Problem" tritt erst auf wenn der MCP angeschlossen ist. Wenn ich den abziehe läuft das Programm (er gibt dann halt immer 255 für den Registerwert aus) aber sobald ich den MCP anstecke bleibt das Programm sofort stehen.....
    Verdrahtung habe ich auch schon komplett überprüft und ich habs auch mal ohne eingesteckten Programmer probiert, weil ich dachte der Programmer stört vielleicht.
    Aber das kann doch nicht sein das man für den Chipselect nur B.4 nehmen kann -.-
    Habt ihr irgendwelche Pull-Ups oder Pull-downs verwendet? Weil ich weiß echt nicht mehr wo ich noch nach dem Fehler suchen kann -.-
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

Ähnliche Themen

  1. mega32 pwm
    Von _maddin im Forum C - Programmierung (GCC u.a.)
    Antworten: 13
    Letzter Beitrag: 07.02.2008, 15:46
  2. Mega32 und I²C
    Von nico_hann im Forum AVR Hardwarethemen
    Antworten: 12
    Letzter Beitrag: 28.05.2006, 11:47
  3. PWM im Mega32
    Von Andy1988 im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 08.02.2006, 20:04
  4. AVR Mega32
    Von BerserkerCarpus im Forum AVR Hardwarethemen
    Antworten: 9
    Letzter Beitrag: 19.11.2005, 16:35
  5. Rn-Mega32
    Von Static im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 29.11.2004, 15:52

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen