24 #include "ssd1306_i2c_conf.h" 32 #if defined(SSD1306_EMBEDDED_I2C) 34 static uint8_t s_sda = SSD1306_SDA;
35 static uint8_t s_scl = SSD1306_SCL;
37 #include <avr/interrupt.h> 39 #if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) 42 #define PORT_REG PORTB 46 #define PORT_REG PORTC 51 #warning "F_CPU is not defined, there can be I2C issues" 54 #define CPU_CYCLE_NS (1000000000/F_CPU) 57 #define DELAY_LOOP_CYCLES 4 58 #define ssd1306_delay(x) for(uint8_t i2=x; i2>0; i2--){__asm__("nop\n\t");} 63 #define SSD1306_I2C_START_STOP_DELAY 600 64 #define SSD1306_I2C_RISE_TIME 300 65 #define SSD1306_I2C_FALL_TIME 300 66 #define SSD1306_I2C_DATA_HOLD_TIME 300 67 #define SSD1306_I2C_IDLE_TIME 1300 68 #define SSD1306_I2C_CLOCK 2500 71 #define I2C_START_STOP_DELAY ((SSD1306_I2C_START_STOP_DELAY/CPU_CYCLE_NS + DELAY_LOOP_CYCLES/2)/DELAY_LOOP_CYCLES) 73 #define I2C_RISE_TIME ((SSD1306_I2C_RISE_TIME/CPU_CYCLE_NS)/DELAY_LOOP_CYCLES) 75 #define I2C_DATA_HOLD_TIME ((SSD1306_I2C_DATA_HOLD_TIME/CPU_CYCLE_NS + DELAY_LOOP_CYCLES/2)/DELAY_LOOP_CYCLES) 77 #define I2C_IDLE_TIME (((SSD1306_I2C_IDLE_TIME/CPU_CYCLE_NS) + DELAY_LOOP_CYCLES/2)/DELAY_LOOP_CYCLES) 79 #define I2C_HALF_CLOCK (((SSD1306_I2C_CLOCK - SSD1306_I2C_FALL_TIME - SSD1306_I2C_RISE_TIME - SSD1306_I2C_FALL_TIME)/CPU_CYCLE_NS/2 \ 84 #define DIGITAL_WRITE_HIGH(DREG, PREG, BIT) { DREG &= ~(1 << BIT); PREG |= (1 << BIT); } 87 #define DIGITAL_WRITE_LOW(DREG, PREG, BIT) { DREG |= (1 << BIT); PREG &= ~(1 << BIT); } 89 static uint8_t oldSREG;
90 static bool interruptsOff =
false;
100 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_sda);
101 ssd1306_delay(I2C_START_STOP_DELAY);
102 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_scl);
103 ssd1306_delay(I2C_HALF_CLOCK);
109 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_sda);
110 ssd1306_delay(I2C_RISE_TIME);
111 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_scl);
112 ssd1306_delay(I2C_START_STOP_DELAY);
113 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_sda);
114 ssd1306_delay(I2C_IDLE_TIME);
118 interruptsOff =
false;
131 if((data << i) & 0x80)
132 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_sda)
134 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_sda);
135 ssd1306_delay(I2C_RISE_TIME);
137 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_scl);
138 ssd1306_delay(I2C_HALF_CLOCK);
140 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_scl);
141 ssd1306_delay(I2C_HALF_CLOCK);
144 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_sda);
145 ssd1306_delay(I2C_RISE_TIME);
146 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_scl);
147 ssd1306_delay(I2C_HALF_CLOCK);
148 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_scl);
149 ssd1306_delay(I2C_HALF_CLOCK);
void ssd1306_i2cSendByte(uint8_t data)