Guest User

Przerwanie SPI

a guest
Oct 15th, 2014
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.26 KB | None | 0 0
  1. ISR(SPIC_INT_vect)
  2. {
  3.     uint8_t d = SPIC_DATA;
  4.    
  5.     switch (state)
  6.     {
  7.         case 0:
  8.             if (d==120) state = 1;
  9.             break;
  10.         case 1:
  11.             count = d;
  12.             state = 2;
  13.             break;
  14.         case 2:
  15.             if (d != (count ^ 120))
  16.             {
  17.                 state = 0;
  18.             }
  19.             else
  20.             {
  21.                 DMA.CH0.DESTADDR0 = (uintptr_t)&(dcc_buffer[nextBuffer].data);
  22.                 DMA.CH0.DESTADDR1 = (uintptr_t)&(dcc_buffer[nextBuffer].data)>>8;
  23.                 DMA.CH0.DESTADDR2 = 0;
  24.                
  25.                 dcc_buffer[nextBuffer].write_flag = 1;
  26.                 dcc_buffer[nextBuffer].size = count;
  27.                 if (d==0)
  28.                 {
  29.                     DMA_CH0_TRFCNT = 256;
  30.                     DMA_CH1_TRFCNT = 256;
  31.                 }
  32.                 else
  33.                 {
  34.                     DMA_CH0_TRFCNT = (uint16_t)count;
  35.                     DMA_CH1_TRFCNT = (uint16_t)count;
  36.                 }
  37.                 DMA_CH0_CTRLA |= DMA_CH_ENABLE_bm;
  38.                 DMA_CH1_CTRLA |= DMA_CH_ENABLE_bm;
  39.  
  40.                 state = 3;
  41.             }
  42.             break;
  43.         case 3:
  44.             if (--count>0) return;
  45.             SPIC_DATA = CRC_CHECKSUM0;
  46.             dcc_buffer[nextBuffer].crc = d;
  47.             state = 4;
  48.             break;
  49.         case 4:
  50.             SPIC_DATA = CRC_CHECKSUM1;
  51.             dcc_buffer[nextBuffer].crc += d<<8;
  52.             dcc_buffer[nextBuffer].write_flag = 0;
  53.             if (dcc_buffer[nextBuffer].crc == CRC_CHECKSUM0+(CRC_CHECKSUM1<<8))
  54.                 nextBuffer = (nextBuffer+1) % 3;
  55.             CRC_CTRL = CRC_RESET_RESET0_gc;
  56.             CRC_CTRL = CRC_SOURCE_DMAC1_gc;
  57.             state = 0;
  58.             break;
  59.     }  
  60. }
Advertisement
Add Comment
Please, Sign In to add comment