diff options
author | Jack Humbert <jack.humb@gmail.com> | 2018-05-16 04:30:58 +0200 |
---|---|---|
committer | Jack Humbert <jack.humb@gmail.com> | 2018-05-16 04:30:58 +0200 |
commit | 682555faac8a67deff5688b956165cd1c39389cb (patch) | |
tree | 00a0991aed23eee4e2ad3bbcfab202476c7c2676 /drivers/avr | |
parent | 6dc215cd679d54ca2ab985c21c9bb299aca74b01 (diff) | |
download | qmk_firmware-682555faac8a67deff5688b956165cd1c39389cb.tar.gz qmk_firmware-682555faac8a67deff5688b956165cd1c39389cb.tar.xz |
i2c fix
Diffstat (limited to 'drivers/avr')
-rwxr-xr-x | drivers/avr/i2c_master.c | 42 | ||||
-rw-r--r-- | drivers/avr/is31fl3731.c | 7 |
2 files changed, 28 insertions, 21 deletions
diff --git a/drivers/avr/i2c_master.c b/drivers/avr/i2c_master.c index f4a4bb7b0..bcf92153c 100755 --- a/drivers/avr/i2c_master.c +++ b/drivers/avr/i2c_master.c @@ -13,32 +13,34 @@ void i2c_init(void) { + TWSR = 0; /* no prescaler */ TWBR = (uint8_t)TWBR_val; + //TWBR = 10; } uint8_t i2c_start(uint8_t address) { // reset TWI control register - TWCR = 0; - // transmit START condition + //TWCR = 0; + // transmit START condition TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); // wait for end of transmission while( !(TWCR & (1<<TWINT)) ); - + // check if the start condition was successfully transmitted - if((TWSR & 0xF8) != TW_START){ return 1; } - + if(((TW_STATUS & 0xF8) != TW_START) && ((TW_STATUS & 0xF8) != TW_REP_START)){ return 1; } + // load slave address into data register TWDR = address; // start transmission of address TWCR = (1<<TWINT) | (1<<TWEN); // wait for end of transmission while( !(TWCR & (1<<TWINT)) ); - + // check if the device has acknowledged the READ / WRITE mode uint8_t twst = TW_STATUS & 0xF8; if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1; - + return 0; } @@ -50,17 +52,17 @@ uint8_t i2c_write(uint8_t data) TWCR = (1<<TWINT) | (1<<TWEN); // wait for end of transmission while( !(TWCR & (1<<TWINT)) ); - - if( (TWSR & 0xF8) != TW_MT_DATA_ACK ){ return 1; } - + + if( (TW_STATUS & 0xF8) != TW_MT_DATA_ACK ){ return 1; } + return 0; } uint8_t i2c_read_ack(void) { - + // start TWI module and acknowledge data after reception - TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA); + TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA); // wait for end of transmission while( !(TWCR & (1<<TWINT)) ); // return received data from TWDR @@ -69,7 +71,7 @@ uint8_t i2c_read_ack(void) uint8_t i2c_read_nack(void) { - + // start receiving without acknowledging reception TWCR = (1<<TWINT) | (1<<TWEN); // wait for end of transmission @@ -81,29 +83,29 @@ uint8_t i2c_read_nack(void) uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length) { if (i2c_start(address | I2C_WRITE)) return 1; - + for (uint16_t i = 0; i < length; i++) { if (i2c_write(data[i])) return 1; } - + i2c_stop(); - + return 0; } uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length) { if (i2c_start(address | I2C_READ)) return 1; - + for (uint16_t i = 0; i < (length-1); i++) { data[i] = i2c_read_ack(); } data[(length-1)] = i2c_read_nack(); - + i2c_stop(); - + return 0; } @@ -146,4 +148,6 @@ void i2c_stop(void) { // transmit STOP condition TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); + // wait until stop condition is executed and bus released + while(TWCR & (1<<TWSTO)); } diff --git a/drivers/avr/is31fl3731.c b/drivers/avr/is31fl3731.c index c7a99e3a3..13dfe6eaf 100644 --- a/drivers/avr/is31fl3731.c +++ b/drivers/avr/is31fl3731.c @@ -84,7 +84,8 @@ void IS31FL3731_write_register( uint8_t addr, uint8_t reg, uint8_t data ) g_twi_transfer_buffer[1] = data; //Transmit data until succesful - while(i2c_transmit(addr << 1, g_twi_transfer_buffer,2) != 0); + //while(i2c_transmit(addr << 1, g_twi_transfer_buffer,2) != 0); + i2c_transmit(addr << 1, g_twi_transfer_buffer,2); } void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) @@ -108,7 +109,9 @@ void IS31FL3731_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) } //Transmit buffer until succesful - while(i2c_transmit(addr << 1, g_twi_transfer_buffer,17) != 0); + //while(i2c_transmit(addr << 1, g_twi_transfer_buffer,17) != 0); + i2c_transmit(addr << 1, g_twi_transfer_buffer,17); + } } |