sniper_nuko

TWI_CMD_FUNC

Apr 29th, 2021 (edited)
386
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.11 KB | None | 0 0
  1. // Master:GP4301TW USB -> RS232C -> UART
  2. // Slave:BF592 I2C <- UART
  3. void twi_cmd_func(void)
  4. {
  5.     uint16_t twi_status = *pTWI_INT_STAT;       // Interrupt status
  6.     uint8_t twi_cmd = 0;                        // Command 1byte
  7.     uint16_t rcv_data = 0;                      // Received data from master 2byte
  8.    
  9.     // Slave status
  10.     if((twi_status & SINIT) != 0)
  11.     {
  12.         // Transfer in progress.
  13.         *pTWI_INT_STAT = SINIT;
  14.     }
  15.    
  16.     // Received from master
  17.     if((twi_status & RCVSERV) != 0)
  18.     {
  19.         if((*pTWI_FIFO_STAT & RCVSTAT) == RCV_HALF)     // 1byte data
  20.         {
  21.             twi_cmd = *pTWI_RCV_DATA8;
  22.         }
  23.         else if((*pTWI_FIFO_STAT & RCVSTAT) == RCV_FULL)    // 2byte data
  24.         {
  25.             rcv_data = *pTWI_RCV_DATA16;
  26.             swap_upper_and_lower(rcv_data);
  27.         }
  28.        
  29.         // Clear
  30.         *pTWI_INT_STAT = RCVSERV;
  31.     }
  32.    
  33.     // Send to master
  34.     else if((twi_status & XMTSERV) != 0)
  35.     {
  36.         if(twi_cmd == 0x0001)
  37.         {
  38.             twi_cmd = 0;
  39.             *pTWI_XMT_DATA16 = avg_data;    // Average sound data
  40.         }
  41.         else if(twi_cmd == 0x0002)
  42.         {
  43.             twi_cmd = 0;
  44.             *pTWI_XMT_DATA16 = mem_data;    // Memory sound data
  45.         }
  46.         *pTWI_INT_STAT = XMTSERV;
  47.     }
  48.    
  49.     // Error
  50.     else if((twi_status & SERR) != 0u)
  51.     {
  52.         // Clear FIFO
  53.         *pTWI_FIFO_CTL = XMTFLUSH | RCVFLUSH;
  54.         ssync();
  55.         *pTWI_FIFO_CTL = 0;
  56.         ssync();
  57.         *pTWI_INT_STAT = SERR;
  58.     }
  59.    
  60.     // Overflow
  61.     else if((twi_status & SOVF) != 0u)
  62.     {
  63.         // Clear FIFO
  64.         *pTWI_FIFO_CTL = RCVFLUSH;
  65.         ssync();
  66.         *pTWI_FIFO_CTL = 0;
  67.         ssync();
  68.         *pTWI_INT_STAT = SOVF;
  69.     }
  70.    
  71.     // Finish
  72.     else if((twi_status & SCOMP) != 0u)
  73.     {
  74.         if(twi_status & RCV_HALF)
  75.         {
  76.             rcv_data = *pTWI_RCV_DATA16;
  77.             *pTWI_FIFO_CTL = RCVFLUSH;
  78.             ssync();
  79.             *pTWI_FIFO_CTL = 0;
  80.             ssync();
  81.             *pTWI_FIFO_CTL = 0;
  82.         }
  83.        
  84.         // Clear FIFO
  85.         *pTWI_FIFO_CTL = XMTFLUSH;
  86.         ssync();
  87.         *pTWI_FIFO_CTL = 0;
  88.         ssync();
  89.         *pTWI_INT_STAT = SCOMP;
  90.     }
  91.     ssync();
  92. }
  93.  
  94. uint16_t swap_upper_and_lower(uint16_t x)
  95. {
  96.     uint16_t upper_b = 0x0;
  97.     uint16_t lower_b = 0x0;
  98.     uint16_t swap_b = 0x0;
  99.    
  100.     // upper 8bit shift to the right
  101.     upper_b = x >> 8;
  102.    
  103.     // lower logical AND
  104.     lower_b = x & 0x00FF;
  105.    
  106.     // lower 8bit shift to the left logical OR upper
  107.     swap_b = (lower_b << 8) | upper_b;
  108.    
  109.     return(swap_b);
Add Comment
Please, Sign In to add comment