Re: Problém s SPI na ATMEGA328 ?

ok1uga na volny.cz ok1uga na volny.cz
Středa Únor 3 18:12:26 CET 2021


OK, posílám knihovny které přímo řídí SPI. Ale je to psané v Bascomu. Nicméně domnívám se že je to dostatečně srozumitelné. Zarazí se to vždy na některém z příkazů "Loop Until Spsr.spif = 1" . Někdy to dojde dál, někdy se to zarazí hned na inicializaci MCP2515 v některém z volání "Mcp2515_write". Víc se ten SW asi očesat nedal aby to dávalo smysl.
Na ATMEGA8 až ATMEGA32 to funguje ale na ATMEGA328 ne. A já nemůžu přijít na důvod proč.
 
 
Mcp2515cs Alias Portc.2 : Config Mcp2515cs = Output
Config Pind.2 = Input : Mcpint Alias Pind.2                 'Vstup přerušení od MCP2515
Config Int0 = Falling
'********************- SPI-*******************************************
Config Portb.4 = Input                                      'miso
Config Portb.3 = Output                                     'mosi
Config Portb.5 = Output                                     'sck
Spcr = &B01010010                                           'Nastavení parametrů SPI sběrnice
                                                            'SPI enable, MSB první, Master
'**************************************************************
'Hex adresy jednotlivých registrů MCP2515
'**************************************************************
Const Cmd_read = &H03
Const Cmd_write = &H02                                      ' Čte data z registru se zvolenou adresou
Const Cmd_bitmodify = &H05                                  ' Mění data v konfiguračních bitech
Const Cmd_readstatus = &HA0                                 '
Const Cmd_read_rx_status = &HB0                             '
Const Cmd_reset = &HC0                                      '
Const Cmd_rts0 = &H81                                       ' Požadavek k odvysílání obsahu Bufferu TB0
Const Caninte = &H2B                                        '
Const Canctrl = &H0F                                        '
Const Canintf = &H2C                                        '
Const Canstat = &H0E                                        '
Const Eflg = &H2D                                           '
Const Cnf3 = &H28                                           '
Const Cnf2 = &H29                                           '
Const Cnf1 = &H2A                                           '
Const Rxb0ctrl = &H60
Const Rxb1ctrl = &H70


 
'**************************************************************************
' Inicializace MCP2515 (nastavení rychlosti a pod.)
'**************************************************************************
Sub Can_init()
   Local Can_tmp As Byte
   Reset Mcp2515cs
   Can_tmp = Cmd_reset
   Spdr = Can_tmp
   Do
   Loop Until Spsr.spif = 1
   Set Mcp2515cs
   Waitms 20
   Mcp2515_write Canctrl , &B10001000                       ' Nastaví konfig. mód + zprávy odeslat jen jednou
   Mcp2515_write Cnf1 , &H01                                ' CNF1 až 3 - Krystal MCP 8MHz, CAN rychlost 125kHz
   Mcp2515_write Cnf2 , &HB5
   Mcp2515_write Cnf3 , &H01
   Mcp2515_write Caninte , &B00000001                       'Interrupt RX buffer 0 povolen
   Mcp2515_write Rxb0ctrl , &B01100000                      'Vypnutí RX Masky
   Mcp2515_write Rxb1ctrl , &B01100000                      'Vypnutí RX Masky
   Mcp2515_bitmodify Canctrl , &B11100000 , &B00000000      ' Do prvních 3 pozic zapíše 0 = Normální mód
End Sub

'**************************************************************************
Sub Mcp2515_write(byval Reg_add As Byte , Byval Reg_val As Byte)
'**************************************************************************
' Zápis do bufferu MCP2515. Reg_add = adresa, Reg_val = data
  Local Can_tmp2 As Byte
  Mcp2515cs = 0
  Can_tmp2 = Cmd_write
  Spdr = Can_tmp2
  Do
  Loop Until Spsr.spif = 1
  Waitms 2
  Spdr = Reg_add
  Do
  Loop Until Spsr.spif = 1
  Spdr = Reg_val
  Do
  Loop Until Spsr.spif = 1
  Mcp2515cs = 1
End Sub

'**************************************************************************
Sub Mcp2515_bitmodify(byval Reg_add As Byte , Byval Reg_mask As Byte , Byval Reg_val As Byte)
'**************************************************************************
' Modifikace registru MCP2515. Reg_add = adresa, Reg_mask = maska, Reg_val = data.
' Tam kde je v masce 1, se hodnota z dat přenese, kde je 0 zůstane původní hodnota.
  Local Can_tmp2 As Byte
  Mcp2515cs = 0
  Can_tmp2 = Cmd_bitmodify
  Spdr = Can_tmp2
  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
  Mcp2515cs = 1
End Sub

'**************************************************************************
Function Mcp2515_read(byval Reg_addr As Byte ) As Byte
'**************************************************************************
'Čte z MCP2515 register via SPI. Reg_addr = adresa

   Local Cmd As Byte
   Reset Mcp2515cs
   Cmd = Cmd_read
   Spdr = Cmd
   Do
   Loop Until Spsr.spif = 1
   Waitus 20
   Cmd = Reg_addr
   Spdr = Cmd
   Do
   Loop Until Spsr.spif = 1
   Waitus 20
   Spdr = 0
   Do
   Loop Until Spsr.spif = 1
   Mcp2515_read = Spdr
   Set Mcp2515cs
End Function


 
______________________________________________________________
> Od: "Jan Waclawek" <konfera na efton.sk>
> Komu: "HW-news" <hw-list na list.hw.cz>
> Datum: 03.02.2021 17:22
> Předmět: Re: Problém s SPI na ATMEGA328 ?
>
> A ten SPIF flag se nenastaví
 
 Podla mna je pravdepodobnejsie, ze sa nastavi, ale nejakym necakanym
 sposobom sa vymaze niekde inde nez myslite; alebo sa nastavi, ale robite
 nejaku chybu pri jeho vyhodnocovani.
 
 V takychto pripadoch pisem, reduce your code to minimal but complete
 compilable, exhibiting the problem, and post.
 
 wek
 
 _______________________________________________
 HW-list mailing list  -  sponsored by www.HW.cz
 Hw-list na list.hw.cz
 http://list.hw.cz/mailman/listinfo/hw-list <http://list.hw.cz/mailman/listinfo/hw-list>

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20210203/ee492570/attachment.html>


Další informace o konferenci Hw-list