Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: u8glibARM/u8g_com_lpc824_ssd_i2c.c
- Revision:
- 1:0e75de2a5d21
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/u8glibARM/u8g_com_lpc824_ssd_i2c.c Mon Jun 13 02:21:11 2016 +0000
@@ -0,0 +1,202 @@
+#include "u8g.h"
+#include "i2c_api.h"
+
+//extern gpio_t g_LED;
+//extern int i2c_write(int address, const char *data, int length);
+i2c_t _i2c;
+static uint8_t isCmd = 1;
+//#define I2C_SLA (0x3c*2)
+uint8_t I2C_SLA = 0x3C << 1;
+//#define I2C_CMD_MODE 0x080
+#define I2C_CMD_MODE 0x00
+#define I2C_DATA_MODE 0x40
+
+uint8_t u8g_com_lpc824_ssd_start_sequence(u8g_t *u8g)
+{
+#if 0
+ /* are we requested to set the a0 state? */
+ if ( u8g->pin_list[U8G_PI_SET_A0] == 0 )
+ return 1;
+
+ /* setup bus, might be a repeated start */
+ if ( u8g_i2c_start(I2C_SLA) == 0 )
+ return 0;
+ if ( u8g->pin_list[U8G_PI_A0_STATE] == 0 ) {
+ if ( u8g_i2c_send_byte(I2C_CMD_MODE) == 0 )
+ return 0;
+ } else {
+ if ( u8g_i2c_send_byte(I2C_DATA_MODE) == 0 )
+ return 0;
+ }
+
+ u8g->pin_list[U8G_PI_SET_A0] = 0;
+ return 1;
+#else
+ char cmd;
+ if (isCmd == 1) {
+ cmd = I2C_CMD_MODE;
+ int cmdRet = i2c_write(&_i2c, I2C_SLA, &cmd, 1, 0);
+ } else {
+ cmd = I2C_DATA_MODE;
+ int cmdRet = i2c_write(&_i2c, I2C_SLA, &cmd, 1, 0);
+ }
+
+ //printf("isCmd = %d, cmdRet = %d\r\n", isCmd, cmdRet);
+ return 0;
+#endif
+}
+
+uint8_t u8g_com_lpc824_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
+{
+ static uint8_t ifFirst = 0;
+ switch(msg) {
+ case U8G_COM_MSG_INIT:
+ if (ifFirst == 0) {
+ //printf("U8G_COM_MSG_INIT:_i2c = 0x%x\r\n", &_i2c);
+ //u8g_com_arduino_digital_write(u8g, U8G_PI_SCL, HIGH);
+ //u8g_com_arduino_digital_write(u8g, U8G_PI_SDA, HIGH);
+ //u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: unknown mode */
+#if 0
+ u8g_i2c_init(u8g->pin_list[U8G_PI_I2C_OPTION]);
+#else
+ i2c_init(&_i2c, P0_11, P0_10);
+ printf("_i2c = 0x%x, I2C_SLA = 0x%x\r\n", &_i2c, I2C_SLA);
+
+#endif
+ ifFirst = 1;
+ }
+ break;
+
+ case U8G_COM_MSG_STOP:
+ printf("U8G_COM_MSG_STOP\r\n");
+ break;
+
+ case U8G_COM_MSG_RESET:
+ /* Currently disabled, but it could be enable. Previous restrictions have been removed */
+ /* u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); */
+ printf("U8G_COM_MSG_RESET\r\n");
+ i2c_reset(&_i2c);
+ break;
+
+ case U8G_COM_MSG_CHIP_SELECT:
+#if 0
+ u8g->pin_list[U8G_PI_A0_STATE] = 0;
+ u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again, also forces start condition */
+ if ( arg_val == 0 ) {
+ /* disable chip, send stop condition */
+ u8g_i2c_stop();
+ } else {
+ /* enable, do nothing: any byte writing will trigger the i2c start */
+ }
+ #else
+ //printf("U8G_COM_MSG_CHIP_SELECT\r\n");
+#endif
+ break;
+
+ case U8G_COM_MSG_WRITE_BYTE:
+#if 0
+ //u8g->pin_list[U8G_PI_SET_A0] = 1;
+ if ( u8g_com_lpc824_ssd_start_sequence(u8g) == 0 )
+ return u8g_i2c_stop(), 0;
+ if ( u8g_i2c_send_byte(arg_val) == 0 )
+ return u8g_i2c_stop(), 0;
+ // u8g_i2c_stop();
+#else
+ u8g_com_lpc824_ssd_start_sequence(u8g);
+ i2c_write(&_i2c, I2C_SLA, &arg_val, 1, 1);
+ //printf("arg_val = 0x%x\r\n", arg_val);
+#endif
+ break;
+
+ case U8G_COM_MSG_WRITE_SEQ:
+#if 0
+ //u8g->pin_list[U8G_PI_SET_A0] = 1;
+ if ( u8g_com_lpc824_ssd_start_sequence(u8g) == 0 )
+ return u8g_i2c_stop(), 0;
+ {
+ register uint8_t *ptr = arg_ptr;
+ while( arg_val > 0 ) {
+ if ( u8g_i2c_send_byte(*ptr++) == 0 )
+ return u8g_i2c_stop(), 0;
+ arg_val--;
+ }
+ }
+ // u8g_i2c_stop();
+#else
+ u8g_com_lpc824_ssd_start_sequence(u8g);
+ {
+ char *ptr = arg_ptr;
+ int ret = i2c_write(&_i2c, I2C_SLA, ptr, arg_val, 1);
+ //printf("ret = %d, arg_val = %d\r\n", ret, arg_val);
+ }
+#endif
+ break;
+
+ case U8G_COM_MSG_WRITE_SEQ_P:
+#if 0
+ //u8g->pin_list[U8G_PI_SET_A0] = 1;
+ if ( u8g_com_lpc824_ssd_start_sequence(u8g) == 0 )
+ return u8g_i2c_stop(), 0;
+ {
+ register uint8_t *ptr = arg_ptr;
+ while( arg_val > 0 ) {
+ if ( u8g_i2c_send_byte(u8g_pgm_read(ptr)) == 0 )
+ return 0;
+ ptr++;
+ arg_val--;
+ }
+ }
+ // u8g_i2c_stop();
+#else
+ u8g_com_lpc824_ssd_start_sequence(u8g);
+ {
+ register uint8_t *ptr = arg_ptr;
+ int r = i2c_write(&_i2c, I2C_SLA, ptr, arg_val, 1);
+ if (r == arg_val) {
+ //gpio_write(&g_LED, 1);
+ }
+ //printf("r = %d\r\n", r);
+ }
+#endif
+ break;
+
+ case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
+ //u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
+ //u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again */
+ if (arg_val == 1) {
+ isCmd = 0;
+ } else {
+ isCmd = 1;
+ }
+#ifdef OLD_CODE
+ if ( i2c_state != 0 ) {
+ u8g_i2c_stop();
+ i2c_state = 0;
+ }
+
+ if ( u8g_com_arduino_ssd_start_sequence(arg_val) == 0 )
+ return 0;
+
+ /* setup bus, might be a repeated start */
+ /*
+ if ( u8g_i2c_start(I2C_SLA) == 0 )
+ return 0;
+ if ( arg_val == 0 )
+ {
+ i2c_state = 1;
+
+ if ( u8g_i2c_send_byte(I2C_CMD_MODE) == 0 )
+ return 0;
+ }
+ else
+ {
+ i2c_state = 2;
+ if ( u8g_i2c_send_byte(I2C_DATA_MODE) == 0 )
+ return 0;
+ }
+ */
+#endif
+ break;
+ }
+ return 1;
+}