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