sniper_nuko

TWI_Slave_Func

Oct 29th, 2020
657
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // スレーブモード送受信
  2. // Master:MCP2221 I2C/UART Converter
  3. void twi_slave_func(void)
  4. {
  5.     uint16_t twi_status = *pTWI_INT_STAT;       // 割り込みステータス
  6.     uint16_t from_m_data = 0;           // マスターより受信データ
  7.    
  8.     // スレーブモードステータス
  9.     if((twi_status & SINIT) != 0)
  10.     {
  11.         // スレーブモード転送中.
  12.         *pTWI_INT_STAT = SINIT;
  13.     }
  14.     // スレーブモード受信
  15.     if((twi_status & RCVSERV) != 0)
  16.     {
  17.         // 2バイト受信
  18.         if((*pTWI_FIFO_STAT & RCVSTAT) == RCV_FULL)
  19.         {
  20.             from_m_data = *pTWI_RCV_DATA16;
  21.             swap_ld_bit(from_m_data);
  22.         }
  23.         // 1バイト受信
  24.         else if((*pTWI_FIFO_STAT & RCVSTAT) == RCV_HALF)
  25.         {
  26.             from_m_data = *pTWI_RCV_DATA8;
  27.             rcv_data = from_m_data;
  28.         }
  29.        
  30.         // フラッシュメモリに書き込み
  31.         spi_flash_write_func();
  32.        
  33.         // 受信FIFOバッファクリア
  34.         *pTWI_FIFO_CTL = RCVFLUSH;
  35.         ssync();
  36.         *pTWI_FIFO_CTL = 0;
  37.         ssync();
  38.         *pTWI_INT_STAT = RCVSERV;
  39.     }
  40.     // スレーブモード送信
  41.     else if((twi_status & XMTSERV) != 0)
  42.     // XMTSERV = 0x0040 0100 0000
  43.     {
  44.         *pTWI_XMT_DATA16 = c_avg;
  45.         *pTWI_INT_STAT = XMTSERV;
  46.     }
  47.     // エラー
  48.     else if((twi_status & SERR) != 0u)
  49.     {
  50.         // 送受信FIFOバッファクリア
  51.         *pTWI_FIFO_CTL = XMTFLUSH | RCVFLUSH;
  52.         ssync();
  53.         *pTWI_FIFO_CTL = 0;
  54.         ssync();
  55.         *pTWI_INT_STAT = SERR;
  56.     }
  57.     // オーバーフロー
  58.     else if((twi_status & SOVF) != 0u)
  59.     {
  60.         // 受信FIFOバッファクリア
  61.         *pTWI_FIFO_CTL = RCVFLUSH;
  62.         ssync();
  63.         *pTWI_FIFO_CTL = 0;
  64.         ssync();
  65.         *pTWI_INT_STAT = SOVF;
  66.     }
  67.     // 転送完了
  68.     else if((twi_status & SCOMP) != 0u)
  69.     {
  70.         if(twi_status & RCV_HALF)
  71.         {
  72.             from_m_data = *pTWI_RCV_DATA16;
  73.             *pTWI_FIFO_CTL = RCVFLUSH;
  74.             ssync();
  75.             *pTWI_FIFO_CTL = 0;
  76.             ssync();
  77.             *pTWI_FIFO_CTL = 0;
  78.         }
  79.         // 送信FIFOバッファクリア
  80.         *pTWI_FIFO_CTL = XMTFLUSH;
  81.         ssync();
  82.         *pTWI_FIFO_CTL = 0;
  83.         ssync();
  84.         *pTWI_INT_STAT = SCOMP;
  85.     }
  86.     ssync();
  87. }
RAW Paste Data