123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- #include <math.h>
- #include "config.h"
- #include "fastio.h"
- #include "twi.h"
- void twi_init(void)
- {
-
- WRITE(SDA_PIN, 1);
- WRITE(SCL_PIN, 1);
-
- TWSR &= ~(_BV(TWPS0) | _BV(TWPS1));
- TWBR = ((F_CPU / TWI_FREQ) - 16) / 2;
-
- }
- void twi_disable(void)
- {
-
- WRITE(SDA_PIN, 0);
- WRITE(SCL_PIN, 0);
- }
- static void twi_stop()
- {
- TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO);
- }
- static uint8_t twi_wait(uint8_t status)
- {
- while(!(TWCR & _BV(TWINT)));
- if(TW_STATUS != status)
- {
- twi_stop();
- return 1;
- }
- return 0;
- }
- static uint8_t twi_start(uint8_t address, uint8_t reg)
- {
-
- TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA);
- if(twi_wait(TW_START))
- return 1;
-
- TWDR = TW_WRITE | (address << 1);
- TWCR = _BV(TWEN) | _BV(TWINT);
- if(twi_wait(TW_MT_SLA_ACK))
- return 2;
-
- TWDR = reg;
- TWCR = _BV(TWEN) | _BV(TWINT);
- if(twi_wait(TW_MT_DATA_ACK))
- return 3;
- return 0;
- }
- uint8_t twi_r8(uint8_t address, uint8_t reg, uint8_t* data)
- {
- if(twi_start(address, reg))
- return 1;
-
- TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA);
- if(twi_wait(TW_REP_START))
- return 2;
-
- TWDR = TW_READ | (address << 1);
- TWCR = _BV(TWEN) | _BV(TWINT);
- if(twi_wait(TW_MR_SLA_ACK))
- return 3;
-
- TWCR = _BV(TWEN) | _BV(TWINT);
- if(twi_wait(TW_MR_DATA_NACK))
- return 4;
- *data = TWDR;
-
- twi_stop();
- return 0;
- }
- uint8_t twi_w8(uint8_t address, uint8_t reg, uint8_t data)
- {
- if(twi_start(address, reg))
- return 1;
-
- TWDR = data;
- TWCR = _BV(TWEN) | _BV(TWINT);
- if(twi_wait(TW_MT_DATA_ACK))
- return 2;
-
- twi_stop();
- return 0;
- }
|