26 #ifdef SSD1306_I2C_SW_SUPPORTED 40 #include <avr/interrupt.h> 42 #if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) 45 #define PORT_REG PORTB 49 #define PORT_REG PORTC 54 #warning "F_CPU is not defined, there can be I2C issues" 57 #define CPU_CYCLE_NS (1000000000/F_CPU) 60 #define DELAY_LOOP_CYCLES 4 61 #define ssd1306_delay(x) for(uint8_t i2=x; i2>0; i2--){__asm__("nop\n\t");} 66 #define SSD1306_I2C_START_STOP_DELAY 600 67 #define SSD1306_I2C_RISE_TIME 300 68 #define SSD1306_I2C_FALL_TIME 300 69 #define SSD1306_I2C_DATA_HOLD_TIME 300 70 #define SSD1306_I2C_IDLE_TIME 1300 71 #define SSD1306_I2C_CLOCK 2500 74 #define I2C_START_STOP_DELAY ((SSD1306_I2C_START_STOP_DELAY/CPU_CYCLE_NS + DELAY_LOOP_CYCLES/2)/DELAY_LOOP_CYCLES) 76 #define I2C_RISE_TIME ((SSD1306_I2C_RISE_TIME/CPU_CYCLE_NS)/DELAY_LOOP_CYCLES) 78 #define I2C_DATA_HOLD_TIME ((SSD1306_I2C_DATA_HOLD_TIME/CPU_CYCLE_NS + DELAY_LOOP_CYCLES/2)/DELAY_LOOP_CYCLES) 80 #define I2C_IDLE_TIME (((SSD1306_I2C_IDLE_TIME/CPU_CYCLE_NS) + DELAY_LOOP_CYCLES/2)/DELAY_LOOP_CYCLES) 82 #define I2C_HALF_CLOCK (((SSD1306_I2C_CLOCK - SSD1306_I2C_FALL_TIME - SSD1306_I2C_RISE_TIME - SSD1306_I2C_FALL_TIME)/CPU_CYCLE_NS/2 \ 88 #define DIGITAL_WRITE_HIGH(DREG, PREG, BIT) { DREG &= ~BIT; PREG |= BIT; } 92 #define DIGITAL_WRITE_LOW(DREG, PREG, BIT) { DREG |= BIT; PREG &= ~BIT; } 94 static uint8_t oldSREG;
95 static uint8_t interruptsOff = 0;
105 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_sda);
106 ssd1306_delay(I2C_START_STOP_DELAY);
107 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_scl);
108 ssd1306_delay(I2C_HALF_CLOCK);
114 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_sda);
115 ssd1306_delay(I2C_RISE_TIME);
116 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_scl);
117 ssd1306_delay(I2C_START_STOP_DELAY);
118 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_sda);
119 ssd1306_delay(I2C_IDLE_TIME);
139 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_sda)
141 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_sda);
143 ssd1306_delay(I2C_RISE_TIME);
145 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_scl);
146 ssd1306_delay(I2C_HALF_CLOCK);
148 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_scl);
149 ssd1306_delay(I2C_HALF_CLOCK);
152 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_sda);
153 ssd1306_delay(I2C_RISE_TIME);
154 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_scl);
155 ssd1306_delay(I2C_HALF_CLOCK);
156 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_scl);
157 ssd1306_delay(I2C_HALF_CLOCK);
162 if (scl>=0) s_scl = (1<<scl);
163 if (sda>=0) s_sda = (1<<sda);
void ssd1306_i2cInit_Embedded(int8_t scl, int8_t sda, uint8_t sa)
void(* ssd1306_sendByte)(uint8_t data)
void ssd1306_i2cStart_Embedded(void)
void(* ssd1306_dataStart)()
void(* ssd1306_endTransmission)()
#define SSD1306_SCL
SCL, Pin 3 on SSD1306 Board.
void ssd1306_i2cSendByte_Embedded(uint8_t data)
void ssd1306_i2cStop_Embedded(void)
void ssd1306_i2cCommandStart()
void ssd1306_i2cDataStart()
void(* ssd1306_startTransmission)()
#define SSD1306_SDA
SDA, Pin 4 on SSD1306 Board.
void(* ssd1306_commandStart)()