<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 />