Advertisement
elektronek

megaavr0 TWI in Slave mode

Jul 18th, 2019
622
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.45 KB | None | 0 0
  1. void i2c_slave_init(uint8_t addr)
  2. {
  3.     PORTMUX.TWISPIROUTEA = PORTMUX_TWI0_ALT2_gc;    // Mux na PORTF 2 a 3
  4.     // Inicicalizace z examplu
  5.     TWI0.SADDR = addr|0x01;                         //Slave address & enable general call
  6.     TWI0.SCTRLA = TWI_ENABLE_bm |                   //Enable slave peripheral
  7.     TWI_APIEN_bm |                                  //Enable address match interrupt
  8.     TWI_PIEN_bm |                                   //Enable stop interrupt
  9.     TWI_DIEN_bm |                                   //Enable data interrupt
  10.     TWI_SMEN_bm;                                    //Enable smart mode
  11. }
  12.  
  13. // preruseni TWI Slave vector
  14. ISR(TWI0_TWIS_vect)
  15. {
  16.     if(TWI0.SSTATUS & TWI_APIF_bm)                  //Address match/stop interrupt
  17.     {
  18.         // Pokud je kolize tak vynuluje priznak a potvrdi
  19.         if (TWI0.SSTATUS & TWI_COLL_bm)
  20.         {
  21.             TWI0.SSTATUS |= TWI_COLL_bm;            //Clear Collision flag
  22.             TWI0_SCTRLB = TWI_SCMD_COMPTRANS_gc;    //complete transaction
  23.             return;
  24.         }
  25.  
  26.         // Pokud je oslovena SLAVE adresa tak odpovi
  27.         if(TWI0.SSTATUS & TWI_AP_bm)
  28.             TWI0_SCTRLB = TWI_SCMD_RESPONSE_gc;     //Send ACK after address match
  29.         else
  30.             TWI0_SCTRLB = TWI_SCMD_COMPTRANS_gc;    //complete transaction after Stop
  31.     }
  32.    
  33.     // Toto jsem presne nepochopil jak funguje
  34.     // Potrebuju odvysilat 2 nebo 4 byty
  35.     if(TWI0.SSTATUS & TWI_DIF_bm)                   //Data interrupt
  36.     {
  37.         if(TWI0.SSTATUS & TWI_DIR_bm)
  38.         {
  39.             TWI0.SDATA = data;                      //Transmit data for Master to read
  40.             TWI0_SCTRLB = TWI_SCMD_RESPONSE_gc;
  41.         }
  42.         else
  43.         {
  44.             TWI0_SCTRLB = TWI_SCMD_RESPONSE_gc;
  45.             data = TWI0.SDATA;                      //Receive data written by Master
  46.         }
  47.     }
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement