~ruther/qmk_firmware

682555faac8a67deff5688b956165cd1c39389cb — Jack Humbert 7 years ago 6dc215c
i2c fix
M drivers/avr/i2c_master.c => drivers/avr/i2c_master.c +23 -19
@@ 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));
}

M drivers/avr/is31fl3731.c => drivers/avr/is31fl3731.c +5 -2
@@ 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);

	}
}


M keyboards/ergodox_ez/ergodox_ez.c => keyboards/ergodox_ez/ergodox_ez.c +1 -3
@@ 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
};

M keyboards/ergodox_ez/ergodox_ez.h => keyboards/ergodox_ez/ergodox_ez.h +1 -1
@@ 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))

M keyboards/ergodox_ez/matrix.c => keyboards/ergodox_ez/matrix.c +1 -2
@@ 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();

M keyboards/ergodox_ez/rules.mk => keyboards/ergodox_ez/rules.mk +2 -2
@@ 15,8 15,8 @@
#----------------------------------------------------------------------------

# # project specific files
SRC = twimaster.c \
	  matrix.c
SRC = matrix.c \
  i2c_master.c

# MCU name
MCU = atmega32u4