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 | |
parent | 6dc215cd679d54ca2ab985c21c9bb299aca74b01 (diff) | |
download | qmk_firmware-682555faac8a67deff5688b956165cd1c39389cb.tar.gz qmk_firmware-682555faac8a67deff5688b956165cd1c39389cb.tar.xz |
i2c fix
-rwxr-xr-x | drivers/avr/i2c_master.c | 42 | ||||
-rw-r--r-- | drivers/avr/is31fl3731.c | 7 | ||||
-rw-r--r-- | keyboards/ergodox_ez/ergodox_ez.c | 4 | ||||
-rw-r--r-- | keyboards/ergodox_ez/ergodox_ez.h | 2 | ||||
-rw-r--r-- | keyboards/ergodox_ez/matrix.c | 3 | ||||
-rw-r--r-- | keyboards/ergodox_ez/rules.mk | 4 |
6 files changed, 33 insertions, 29 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); + } } diff --git a/keyboards/ergodox_ez/ergodox_ez.c b/keyboards/ergodox_ez/ergodox_ez.c index 21854ef77..36eb58a3c 100644 --- a/keyboards/ergodox_ez/ergodox_ez.c +++ b/keyboards/ergodox_ez/ergodox_ez.c @@ -1,6 +1,4 @@ #include QMK_KEYBOARD_H -#include "i2cmaster.h" - extern inline void ergodox_board_led_on(void); extern inline void ergodox_right_led_1_on(void); @@ -329,7 +327,7 @@ const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { {{3|(9<<4)}, {24.9*0, 16*2}, 0}, // LED 20 {{4|(6<<4)}, {24.9*3, 16*2}, 0}, // LED 21 - {{4|(7<<4)}, {24.9*3, 16*2}, 0}, // LED 22 + {{4|(7<<4)}, {24.9*2, 16*2}, 0}, // LED 22 {{4|(8<<4)}, {24.9*1, 16*2}, 0}, // LED 23 {{4|(9<<4)}, {24.9*0, 16*2}, 0}, // LED 24 }; diff --git a/keyboards/ergodox_ez/ergodox_ez.h b/keyboards/ergodox_ez/ergodox_ez.h index eda6d767c..3ffc32553 100644 --- a/keyboards/ergodox_ez/ergodox_ez.h +++ b/keyboards/ergodox_ez/ergodox_ez.h @@ -4,7 +4,7 @@ #include "quantum.h" #include <stdint.h> #include <stdbool.h> -#include "i2cmaster.h" +#include "i2c_master.h" #include <util/delay.h> #define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) diff --git a/keyboards/ergodox_ez/matrix.c b/keyboards/ergodox_ez/matrix.c index e10171133..2aad99781 100644 --- a/keyboards/ergodox_ez/matrix.c +++ b/keyboards/ergodox_ez/matrix.c @@ -34,7 +34,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "util.h" #include "matrix.h" #include QMK_KEYBOARD_H -#include "i2cmaster.h" #ifdef DEBUG_MATRIX_SCAN_RATE #include "timer.h" #endif @@ -297,7 +296,7 @@ static matrix_row_t read_cols(uint8_t row) mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; mcp23018_status = i2c_write(GPIOB); if (mcp23018_status) goto out; mcp23018_status = i2c_start(I2C_ADDR_READ); if (mcp23018_status) goto out; - data = i2c_readNak(); + data = i2c_read_nack(); data = ~data; out: i2c_stop(); diff --git a/keyboards/ergodox_ez/rules.mk b/keyboards/ergodox_ez/rules.mk index a3b2ba5ca..0e0b3cdef 100644 --- a/keyboards/ergodox_ez/rules.mk +++ b/keyboards/ergodox_ez/rules.mk @@ -15,8 +15,8 @@ #---------------------------------------------------------------------------- # # project specific files -SRC = twimaster.c \ - matrix.c +SRC = matrix.c \ + i2c_master.c # MCU name MCU = atmega32u4 |