uint8_t u8g_com_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
{
switch(msg)
{
case U8G_COM_MSG_STOP:
break; //do nothing...
case U8G_COM_MSG_INIT:
i2c_init(); //inits the i2c hardware, gpios and timers
u8g_MicroDelay();
break;
case U8G_COM_MSG_ADDRESS:
//the control byte switches the mode on the device and is set here
if (arg_val == 0)
{
control = 0;
}
else
{
control = 0x40;
}
u8g_10MicroDelay();
break;
case U8G_COM_MSG_RESET:
//pin 9 is my reset pin
GPIO_WriteBit(GPIOB, GPIO_Pin_9, arg_val);
u8g_10MicroDelay();
break;
case U8G_COM_MSG_WRITE_BYTE:
//simple: just write one byte
i2c_out(arg_val);
u8g_MicroDelay();
break;
case U8G_COM_MSG_WRITE_SEQ:
case U8G_COM_MSG_WRITE_SEQ_P:
{
register uint8_t *ptr = arg_ptr;
//send the control byte (to switch from command to data mode)
I2C_start(SSD1306_I2C_ADDRESS, I2C_Direction_Transmitter);
I2C_SendData(I2C2, control);
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
//now send the rest of data
while( arg_val > 0 )
{
I2C_SendData(I2C2, *ptr++);
arg_val--;
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}
//done
I2C_stop();
u8g_MicroDelay();
}
break;
}
return 1;
}