Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void i2c_slave_init(uint8_t addr)
- {
- PORTMUX.TWISPIROUTEA = PORTMUX_TWI0_ALT2_gc; // Mux na PORTF 2 a 3
- // Inicicalizace z examplu
- TWI0.SADDR = addr|0x01; //Slave address & enable general call
- TWI0.SCTRLA = TWI_ENABLE_bm | //Enable slave peripheral
- TWI_APIEN_bm | //Enable address match interrupt
- TWI_PIEN_bm | //Enable stop interrupt
- TWI_DIEN_bm | //Enable data interrupt
- TWI_SMEN_bm; //Enable smart mode
- }
- // preruseni TWI Slave vector
- ISR(TWI0_TWIS_vect)
- {
- if(TWI0.SSTATUS & TWI_APIF_bm) //Address match/stop interrupt
- {
- // Pokud je kolize tak vynuluje priznak a potvrdi
- if (TWI0.SSTATUS & TWI_COLL_bm)
- {
- TWI0.SSTATUS |= TWI_COLL_bm; //Clear Collision flag
- TWI0_SCTRLB = TWI_SCMD_COMPTRANS_gc; //complete transaction
- return;
- }
- // Pokud je oslovena SLAVE adresa tak odpovi
- if(TWI0.SSTATUS & TWI_AP_bm)
- TWI0_SCTRLB = TWI_SCMD_RESPONSE_gc; //Send ACK after address match
- else
- TWI0_SCTRLB = TWI_SCMD_COMPTRANS_gc; //complete transaction after Stop
- }
- // Toto jsem presne nepochopil jak funguje
- // Potrebuju odvysilat 2 nebo 4 byty
- if(TWI0.SSTATUS & TWI_DIF_bm) //Data interrupt
- {
- if(TWI0.SSTATUS & TWI_DIR_bm)
- {
- TWI0.SDATA = data; //Transmit data for Master to read
- TWI0_SCTRLB = TWI_SCMD_RESPONSE_gc;
- }
- else
- {
- TWI0_SCTRLB = TWI_SCMD_RESPONSE_gc;
- data = TWI0.SDATA; //Receive data written by Master
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement