122 lines
4.1 KiB
C
122 lines
4.1 KiB
C
|
|
#include "u8g2_hal.h"
|
|||
|
|
#include "menuConfig.h"
|
|||
|
|
#include "i2c.h"
|
|||
|
|
|
|||
|
|
|
|||
|
|
#define HARDWARE_I2C
|
|||
|
|
#define OLED_I2C_DEV_ADDRESS 0x78
|
|||
|
|
|
|||
|
|
|
|||
|
|
#ifdef HARDWARE_I2C
|
|||
|
|
static uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) {
|
|||
|
|
uint8_t* data = (uint8_t*) arg_ptr;
|
|||
|
|
switch(msg) {
|
|||
|
|
case U8X8_MSG_BYTE_SEND:
|
|||
|
|
while( arg_int-- > 0 ) {
|
|||
|
|
|
|||
|
|
///@todo <20><EFBFBD>
|
|||
|
|
/* ==================================== */
|
|||
|
|
I2C2->DR = *data++;
|
|||
|
|
while( __HAL_I2C_GET_FLAG(&hi2c2, I2C_FLAG_TXE) == RESET );
|
|||
|
|
/* ==================================== */
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case U8X8_MSG_BYTE_INIT:
|
|||
|
|
/* add your custom code to init i2c subsystem */
|
|||
|
|
break;
|
|||
|
|
case U8X8_MSG_BYTE_SET_DC:
|
|||
|
|
/* ignored for i2c */
|
|||
|
|
break;
|
|||
|
|
case U8X8_MSG_BYTE_START_TRANSFER:
|
|||
|
|
|
|||
|
|
///@todo <20><EFBFBD>
|
|||
|
|
/* ==================================== */
|
|||
|
|
/* Wait until BUSY flag is reset */
|
|||
|
|
while( __HAL_I2C_GET_FLAG( &hi2c2, I2C_FLAG_BUSY ) == SET );
|
|||
|
|
/* Disable Pos */
|
|||
|
|
CLEAR_BIT( I2C2->CR1, I2C_CR1_POS );
|
|||
|
|
/* Generate Start */
|
|||
|
|
SET_BIT( I2C2->CR1, I2C_CR1_START );
|
|||
|
|
/* Wait until SB flag is set */
|
|||
|
|
while( __HAL_I2C_GET_FLAG( &hi2c2, I2C_FLAG_SB ) == RESET );
|
|||
|
|
/* Send slave address */
|
|||
|
|
I2C2->DR = I2C_7BIT_ADD_WRITE( OLED_I2C_DEV_ADDRESS );
|
|||
|
|
/* Wait until ADDR flag is set */
|
|||
|
|
while ( __HAL_I2C_GET_FLAG( &hi2c2, I2C_FLAG_ADDR) == RESET );
|
|||
|
|
/* Clear ADDR flag */
|
|||
|
|
__HAL_I2C_CLEAR_ADDRFLAG( &hi2c2 );
|
|||
|
|
/* Wait until TXE flag is set */
|
|||
|
|
while( __HAL_I2C_GET_FLAG(&hi2c2, I2C_FLAG_TXE) == RESET );
|
|||
|
|
/* ==================================== */
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
case U8X8_MSG_BYTE_END_TRANSFER:
|
|||
|
|
|
|||
|
|
///@todo <20><EFBFBD>
|
|||
|
|
/* ==================================== */
|
|||
|
|
/* Generate Stop */
|
|||
|
|
SET_BIT( I2C2->CR1, I2C_CR1_STOP );
|
|||
|
|
/* ==================================== */
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
static uint8_t u8x8_gpio_and_delay_hw(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) {
|
|||
|
|
switch (msg) {
|
|||
|
|
case U8X8_MSG_DELAY_100NANO: // delay arg_int * 100 nano seconds
|
|||
|
|
break;
|
|||
|
|
case U8X8_MSG_DELAY_10MICRO: // delay arg_int * 10 micro seconds
|
|||
|
|
break;
|
|||
|
|
case U8X8_MSG_DELAY_MILLI: // delay arg_int * 1 milli second
|
|||
|
|
HAL_Delay(1);
|
|||
|
|
break;
|
|||
|
|
case U8X8_MSG_DELAY_I2C: // arg_int is the I2C speed in 100KHz, e.g. 4 = 400 KHz
|
|||
|
|
break; // arg_int=1: delay by 5us, arg_int = 4: delay by 1.25us
|
|||
|
|
case U8X8_MSG_GPIO_I2C_CLOCK: // arg_int=0: Output low at I2C clock pin
|
|||
|
|
break; // arg_int=1: Input dir with pullup high for I2C clock pin
|
|||
|
|
case U8X8_MSG_GPIO_I2C_DATA: // arg_int=0: Output low at I2C data pin
|
|||
|
|
break; // arg_int=1: Input dir with pullup high for I2C data pin
|
|||
|
|
case U8X8_MSG_GPIO_MENU_SELECT:
|
|||
|
|
u8x8_SetGPIOResult(u8x8, /* get menu select pin state */ 0);
|
|||
|
|
break;
|
|||
|
|
case U8X8_MSG_GPIO_MENU_NEXT:
|
|||
|
|
u8x8_SetGPIOResult(u8x8, /* get menu next pin state */ 0);
|
|||
|
|
break;
|
|||
|
|
case U8X8_MSG_GPIO_MENU_PREV:
|
|||
|
|
u8x8_SetGPIOResult(u8x8, /* get menu prev pin state */ 0);
|
|||
|
|
break;
|
|||
|
|
case U8X8_MSG_GPIO_MENU_HOME:
|
|||
|
|
u8x8_SetGPIOResult(u8x8, /* get menu home pin state */ 0);
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
u8x8_SetGPIOResult(u8x8, 1); // default return value
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//static void HardWare_I2C2_GPIOInit(void)
|
|||
|
|
//{
|
|||
|
|
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void u8g2Init(u8g2_t *u8g2)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
#ifdef HARDWARE_I2C
|
|||
|
|
// HardWare_I2C2_GPIOInit();//<2F><><EFBFBD><EFBFBD>i2c.c<><63><EFBFBD><EFBFBD><EFBFBD>ɳ<EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
|
u8g2_Setup_ssd1306_i2c_128x64_noname_f(u8g2, U8G2_R0, u8x8_byte_hw_i2c, u8x8_gpio_and_delay_hw);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
u8g2_InitDisplay(u8g2);
|
|||
|
|
u8g2_SetPowerSave(u8g2, 0);
|
|||
|
|
u8g2_ClearBuffer(u8g2);
|
|||
|
|
}
|