30 #ifdef SSD1306_TWI_SUPPORTED 36 #define SSD1306_TWI_FREQ 400000 37 #define MAX_RETRIES 64 41 static uint8_t ssd1306_twi_start(
void)
44 uint8_t iters = MAX_RETRIES;
47 TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
48 while ( (TWCR & (1<<TWINT)) == 0 );
54 }
while (twst == TW_MT_ARB_LOST);
55 if ((twst != TW_START) && (twst != TW_REP_START))
62 static uint8_t ssd1306_twi_send(uint8_t data)
65 uint8_t iters = MAX_RETRIES;
69 TWCR = (1<<TWINT) | (1<<TWEN);
70 while ( (TWCR & (1<<TWINT)) == 0 );
72 if ((twsr == TW_MT_SLA_ACK) || (twsr == TW_MT_DATA_ACK))
76 if (twsr == TW_MT_ARB_LOST)
85 }
while (twsr != TW_MT_ARB_LOST);
90 static void ssd1306_twi_stop(
void)
92 TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT);
95 static void ssd1306_i2cStart_Twi(
void)
99 if (ssd1306_twi_start() != 0)
104 }
while (ssd1306_twi_send(s_sa << 1) == TW_MT_ARB_LOST);
107 static void ssd1306_i2cStop_Twi(
void)
112 void ssd1306_i2cConfigure_Twi(uint8_t arg)
114 #if defined(__AVR_ATmega328P__) 116 DDRC &= ~(1<<PINC4); PORTC |= (1<<PINC4);
117 DDRC &= ~(1<<PINC5); PORTC |= (1<<PINC5);
122 TWBR = ((F_CPU / SSD1306_TWI_FREQ) - 16) / 2 / (1);
123 TWCR = (1 << TWEN) | (1 << TWEA);
126 static void ssd1306_i2cSendByte_Twi(uint8_t data)
130 if (ssd1306_twi_send(data) != TW_MT_ARB_LOST)
134 if (ssd1306_twi_start() != 0)
139 if (ssd1306_twi_send(s_sa << 1) != TW_MT_ARB_LOST)
147 static void ssd1306_i2cClose_Twi()
151 void ssd1306_i2cInit_Twi(uint8_t sa)
void(* ssd1306_closeInterface)(void)
deinitializes internal resources, allocated for interface.
void(* ssd1306_sendByte)(uint8_t data)
void ssd1306_i2cCommandStart(void)
void(* ssd1306_dataStart)(void)
void(* ssd1306_startTransmission)(void)
void(* ssd1306_endTransmission)(void)
void ssd1306_i2cDataStart(void)
void(* ssd1306_commandStart)(void)