<p style="padding:0 0 0 0; margin:0 0 0 0;">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.</p>
<p style="padding:0 0 0 0; margin:0 0 0 0;">Na ATMEGA8 až ATMEGA32 to funguje ale na ATMEGA328 ne. A já nemůžu přijít na důvod proč.</p>
<p style="padding:0 0 0 0; margin:0 0 0 0;"> </p>
<p style="padding:0 0 0 0; margin:0 0 0 0;"> </p>
<p style="padding:0 0 0 0; margin:0 0 0 0;">Mcp2515cs Alias Portc.2 : Config Mcp2515cs = Output<br />
Config Pind.2 = Input : Mcpint Alias Pind.2 'Vstup přerušení od MCP2515<br />
Config Int0 = Falling<br />
'********************- SPI-*******************************************<br />
Config Portb.4 = Input 'miso<br />
Config Portb.3 = Output 'mosi<br />
Config Portb.5 = Output 'sck<br />
Spcr = &B01010010 'Nastavení parametrů SPI sběrnice<br />
'SPI enable, MSB první, Master</p>
<p style="padding:0 0 0 0; margin:0 0 0 0;">'**************************************************************</p>
<p style="padding:0 0 0 0; margin:0 0 0 0;">'Hex adresy jednotlivých registrů MCP2515</p>
<p style="padding:0 0 0 0; margin:0 0 0 0;">'**************************************************************</p>
<p style="padding:0 0 0 0; margin:0 0 0 0;">Const Cmd_read = &H03<br />
Const Cmd_write = &H02 ' Čte data z registru se zvolenou adresou<br />
Const Cmd_bitmodify = &H05 ' Mění data v konfiguračních bitech<br />
Const Cmd_readstatus = &HA0 '<br />
Const Cmd_read_rx_status = &HB0 '<br />
Const Cmd_reset = &HC0 '<br />
Const Cmd_rts0 = &H81 ' Požadavek k odvysílání obsahu Bufferu TB0<br />
Const Caninte = &H2B '<br />
Const Canctrl = &H0F '<br />
Const Canintf = &H2C '<br />
Const Canstat = &H0E '<br />
Const Eflg = &H2D '<br />
Const Cnf3 = &H28 '<br />
Const Cnf2 = &H29 '<br />
Const Cnf1 = &H2A '<br />
Const Rxb0ctrl = &H60<br />
Const Rxb1ctrl = &H70<br />
<br />
</p>
<p style="padding:0 0 0 0; margin:0 0 0 0;"> </p>
<p style="padding:0 0 0 0; margin:0 0 0 0;">'**************************************************************************</p>
<p style="padding:0 0 0 0; margin:0 0 0 0;">' Inicializace MCP2515 (nastavení rychlosti a pod.)<br />
'**************************************************************************<br />
Sub Can_init()<br />
Local Can_tmp As Byte<br />
Reset Mcp2515cs<br />
Can_tmp = Cmd_reset<br />
Spdr = Can_tmp<br />
Do<br />
Loop Until Spsr.spif = 1<br />
Set Mcp2515cs<br />
Waitms 20<br />
Mcp2515_write Canctrl , &B10001000 ' Nastaví konfig. mód + zprávy odeslat jen jednou<br />
Mcp2515_write Cnf1 , &H01 ' CNF1 až 3 - Krystal MCP 8MHz, CAN rychlost 125kHz<br />
Mcp2515_write Cnf2 , &HB5<br />
Mcp2515_write Cnf3 , &H01<br />
Mcp2515_write Caninte , &B00000001 'Interrupt RX buffer 0 povolen<br />
Mcp2515_write Rxb0ctrl , &B01100000 'Vypnutí RX Masky<br />
Mcp2515_write Rxb1ctrl , &B01100000 'Vypnutí RX Masky<br />
Mcp2515_bitmodify Canctrl , &B11100000 , &B00000000 ' Do prvních 3 pozic zapíše 0 = Normální mód<br />
End Sub<br />
<br />
'**************************************************************************<br />
Sub Mcp2515_write(byval Reg_add As Byte , Byval Reg_val As Byte)<br />
'**************************************************************************<br />
' Zápis do bufferu MCP2515. Reg_add = adresa, Reg_val = data<br />
Local Can_tmp2 As Byte<br />
Mcp2515cs = 0<br />
Can_tmp2 = Cmd_write<br />
Spdr = Can_tmp2<br />
Do<br />
Loop Until Spsr.spif = 1<br />
Waitms 2<br />
Spdr = Reg_add<br />
Do<br />
Loop Until Spsr.spif = 1<br />
Spdr = Reg_val<br />
Do<br />
Loop Until Spsr.spif = 1<br />
Mcp2515cs = 1<br />
End Sub<br />
<br />
'**************************************************************************<br />
Sub Mcp2515_bitmodify(byval Reg_add As Byte , Byval Reg_mask As Byte , Byval Reg_val As Byte)<br />
'**************************************************************************<br />
' Modifikace registru MCP2515. Reg_add = adresa, Reg_mask = maska, Reg_val = data.<br />
' Tam kde je v masce 1, se hodnota z dat přenese, kde je 0 zůstane původní hodnota.<br />
Local Can_tmp2 As Byte<br />
Mcp2515cs = 0<br />
Can_tmp2 = Cmd_bitmodify<br />
Spdr = Can_tmp2<br />
Do<br />
Loop Until Spsr.spif = 1<br />
Waitms 2<br />
Spdr = Reg_add<br />
Do<br />
Loop Until Spsr.spif = 1<br />
Spdr = Reg_mask<br />
Do<br />
Loop Until Spsr.spif = 1<br />
Spdr = Reg_val<br />
Do<br />
Loop Until Spsr.spif = 1<br />
Mcp2515cs = 1<br />
End Sub<br />
<br />
'**************************************************************************<br />
Function Mcp2515_read(byval Reg_addr As Byte ) As Byte<br />
'**************************************************************************<br />
'Čte z MCP2515 register via SPI. Reg_addr = adresa<br />
<br />
Local Cmd As Byte<br />
Reset Mcp2515cs<br />
Cmd = Cmd_read<br />
Spdr = Cmd<br />
Do<br />
Loop Until Spsr.spif = 1<br />
Waitus 20<br />
Cmd = Reg_addr<br />
Spdr = Cmd<br />
Do<br />
Loop Until Spsr.spif = 1<br />
Waitus 20<br />
Spdr = 0<br />
Do<br />
Loop Until Spsr.spif = 1<br />
Mcp2515_read = Spdr<br />
Set Mcp2515cs<br />
End Function<br />
<br />
</p>
<p style="padding:0 0 0 0; margin:0 0 0 0;"> </p>
<p style="padding:0 0 0 0; margin:0 0 0 0;">______________________________________________________________<br />
> Od: "Jan Waclawek" <konfera@efton.sk><br />
> Komu: "HW-news" <hw-list@list.hw.cz><br />
> Datum: 03.02.2021 17:22<br />
> Předmět: Re: Problém s SPI na ATMEGA328 ?<br />
></p>
> A ten SPIF flag se nenastaví<br />
<br />
Podla mna je pravdepodobnejsie, ze sa nastavi, ale nejakym necakanym<br />
sposobom sa vymaze niekde inde nez myslite; alebo sa nastavi, ale robite<br />
nejaku chybu pri jeho vyhodnocovani.<br />
<br />
V takychto pripadoch pisem, reduce your code to minimal but complete<br />
compilable, exhibiting the problem, and post.<br />
<br />
wek<br />
<br />
_______________________________________________<br />
HW-list mailing list - sponsored by www.HW.cz<br />
Hw-list@list.hw.cz<br />
<a href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a><br />