33 #ifdef SSD1306_I2C_SW_SUPPORTED 45 #if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) 48 #define PORT_REG PORTB 52 #define PORT_REG PORTC 57 #warning "F_CPU is not defined, there can be I2C issues" 60 #define CPU_CYCLE_NS (1000000000/F_CPU) 63 #define DELAY_LOOP_CYCLES 4 64 #define ssd1306_delay(x) for(uint8_t i2=x; i2>0; i2--){__asm__("nop\n\t");} 69 #define SSD1306_I2C_START_STOP_DELAY 600 70 #define SSD1306_I2C_RISE_TIME 300 71 #define SSD1306_I2C_FALL_TIME 300 72 #define SSD1306_I2C_DATA_HOLD_TIME 300 73 #define SSD1306_I2C_IDLE_TIME 1300 74 #define SSD1306_I2C_CLOCK 2500 77 #define I2C_START_STOP_DELAY ((SSD1306_I2C_START_STOP_DELAY/CPU_CYCLE_NS + DELAY_LOOP_CYCLES/2)/DELAY_LOOP_CYCLES) 79 #define I2C_RISE_TIME ((SSD1306_I2C_RISE_TIME/CPU_CYCLE_NS)/DELAY_LOOP_CYCLES) 81 #define I2C_DATA_HOLD_TIME ((SSD1306_I2C_DATA_HOLD_TIME/CPU_CYCLE_NS + DELAY_LOOP_CYCLES/2)/DELAY_LOOP_CYCLES) 83 #define I2C_IDLE_TIME (((SSD1306_I2C_IDLE_TIME/CPU_CYCLE_NS) + DELAY_LOOP_CYCLES/2)/DELAY_LOOP_CYCLES) 85 #define I2C_HALF_CLOCK (((SSD1306_I2C_CLOCK - SSD1306_I2C_FALL_TIME - SSD1306_I2C_RISE_TIME - SSD1306_I2C_FALL_TIME)/CPU_CYCLE_NS/2 \ 91 #define DIGITAL_WRITE_HIGH(DREG, PREG, BIT) { DREG &= ~BIT; PREG |= BIT; } 95 #define DIGITAL_WRITE_LOW(DREG, PREG, BIT) { DREG |= BIT; PREG &= ~BIT; } 97 static uint8_t oldSREG;
98 static uint8_t interruptsOff = 0;
104 static void ssd1306_i2cSendByte_Embedded(uint8_t data)
110 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_sda)
112 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_sda);
114 ssd1306_delay(I2C_RISE_TIME);
116 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_scl);
117 ssd1306_delay(I2C_HALF_CLOCK);
119 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_scl);
120 ssd1306_delay(I2C_HALF_CLOCK);
123 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_sda);
124 ssd1306_delay(I2C_RISE_TIME);
125 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_scl);
126 ssd1306_delay(I2C_HALF_CLOCK);
127 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_scl);
128 ssd1306_delay(I2C_HALF_CLOCK);
131 static void ssd1306_i2cSendBytes_Embedded(
const uint8_t *buffer, uint16_t size)
135 ssd1306_i2cSendByte_Embedded(*buffer);
143 static void ssd1306_i2cStart_Embedded(
void)
148 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_sda);
149 ssd1306_delay(I2C_START_STOP_DELAY);
150 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_scl);
151 ssd1306_delay(I2C_HALF_CLOCK);
152 ssd1306_i2cSendByte_Embedded((s_sa << 1) | 0);
155 static void ssd1306_i2cStop_Embedded(
void)
157 DIGITAL_WRITE_LOW(DDR_REG, PORT_REG, s_sda);
158 ssd1306_delay(I2C_RISE_TIME);
159 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_scl);
160 ssd1306_delay(I2C_START_STOP_DELAY);
161 DIGITAL_WRITE_HIGH(DDR_REG, PORT_REG, s_sda);
162 ssd1306_delay(I2C_IDLE_TIME);
170 static void ssd1306_i2cClose_Embedded()
176 if (scl>=0) s_scl = (1<<scl);
177 if (sda>=0) s_sda = (1<<sda);
void(* send)(uint8_t data)
#define SSD1306_SDA
SDA, Pin 4 on SSD1306 Board.
void(* close)(void)
deinitializes internal resources, allocated for interface.
ssd1306_interface_t ssd1306_intf
#define SSD1306_SCL
SCL, Pin 3 on SSD1306 Board.
void ssd1306_i2cInit_Embedded(int8_t scl, int8_t sda, uint8_t sa)
void(* send_buffer)(const uint8_t *buffer, uint16_t size)
Sends bytes to SSD1306 device.