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.
u8glibARM/u8g_com_raspberrypi_ssd_i2c.c@0:d8f4c441e032, 2016-06-10 (annotated)
- Committer:
- lixianyu
- Date:
- Fri Jun 10 15:20:20 2016 +0000
- Revision:
- 0:d8f4c441e032
u8glib???????????i2c???
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| lixianyu | 0:d8f4c441e032 | 1 | /* |
| lixianyu | 0:d8f4c441e032 | 2 | Special pin usage: |
| lixianyu | 0:d8f4c441e032 | 3 | U8G_PI_I2C_OPTION additional options |
| lixianyu | 0:d8f4c441e032 | 4 | U8G_PI_A0_STATE used to store the last value of the command/data register selection |
| lixianyu | 0:d8f4c441e032 | 5 | U8G_PI_SET_A0 1: Signal request to update I2C device with new A0_STATE, 0: Do nothing, A0_STATE matches I2C device |
| lixianyu | 0:d8f4c441e032 | 6 | U8G_PI_SCL clock line (NOT USED) |
| lixianyu | 0:d8f4c441e032 | 7 | U8G_PI_SDA data line (NOT USED) |
| lixianyu | 0:d8f4c441e032 | 8 | |
| lixianyu | 0:d8f4c441e032 | 9 | U8G_PI_RESET reset line (currently disabled, see below) |
| lixianyu | 0:d8f4c441e032 | 10 | |
| lixianyu | 0:d8f4c441e032 | 11 | Protocol: |
| lixianyu | 0:d8f4c441e032 | 12 | SLA, Cmd/Data Selection, Arguments |
| lixianyu | 0:d8f4c441e032 | 13 | The command/data register is selected by a special instruction byte, which is sent after SLA |
| lixianyu | 0:d8f4c441e032 | 14 | |
| lixianyu | 0:d8f4c441e032 | 15 | The continue bit is always 0 so that a (re)start is equired for the change from cmd to/data mode |
| lixianyu | 0:d8f4c441e032 | 16 | */ |
| lixianyu | 0:d8f4c441e032 | 17 | |
| lixianyu | 0:d8f4c441e032 | 18 | #include "u8g.h" |
| lixianyu | 0:d8f4c441e032 | 19 | |
| lixianyu | 0:d8f4c441e032 | 20 | #if defined(U8G_RASPBERRY_PI) |
| lixianyu | 0:d8f4c441e032 | 21 | |
| lixianyu | 0:d8f4c441e032 | 22 | #include <wiringPi.h> |
| lixianyu | 0:d8f4c441e032 | 23 | #include <wiringPiI2C.h> |
| lixianyu | 0:d8f4c441e032 | 24 | #include <stdio.h> |
| lixianyu | 0:d8f4c441e032 | 25 | #include <stdlib.h> |
| lixianyu | 0:d8f4c441e032 | 26 | #include <errno.h> |
| lixianyu | 0:d8f4c441e032 | 27 | |
| lixianyu | 0:d8f4c441e032 | 28 | #define I2C_SLA 0x3c |
| lixianyu | 0:d8f4c441e032 | 29 | #define I2C_CMD_MODE 0x000 |
| lixianyu | 0:d8f4c441e032 | 30 | #define I2C_DATA_MODE 0x040 |
| lixianyu | 0:d8f4c441e032 | 31 | |
| lixianyu | 0:d8f4c441e032 | 32 | #if defined(U8G_WITH_PINLIST) |
| lixianyu | 0:d8f4c441e032 | 33 | |
| lixianyu | 0:d8f4c441e032 | 34 | uint8_t u8g_com_raspberrypi_ssd_start_sequence(u8g_t *u8g) |
| lixianyu | 0:d8f4c441e032 | 35 | { |
| lixianyu | 0:d8f4c441e032 | 36 | /* are we requested to set the a0 state? */ |
| lixianyu | 0:d8f4c441e032 | 37 | if ( u8g->pin_list[U8G_PI_SET_A0] == 0 ) |
| lixianyu | 0:d8f4c441e032 | 38 | return 1; |
| lixianyu | 0:d8f4c441e032 | 39 | |
| lixianyu | 0:d8f4c441e032 | 40 | /* setup bus, might be a repeated start */ |
| lixianyu | 0:d8f4c441e032 | 41 | if ( u8g_i2c_start(I2C_SLA) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 42 | return 0; |
| lixianyu | 0:d8f4c441e032 | 43 | if ( u8g->pin_list[U8G_PI_A0_STATE] == 0 ) |
| lixianyu | 0:d8f4c441e032 | 44 | { |
| lixianyu | 0:d8f4c441e032 | 45 | if ( u8g_i2c_send_mode(I2C_CMD_MODE) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 46 | return 0; |
| lixianyu | 0:d8f4c441e032 | 47 | } |
| lixianyu | 0:d8f4c441e032 | 48 | else |
| lixianyu | 0:d8f4c441e032 | 49 | { |
| lixianyu | 0:d8f4c441e032 | 50 | if ( u8g_i2c_send_mode(I2C_DATA_MODE) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 51 | return 0; |
| lixianyu | 0:d8f4c441e032 | 52 | } |
| lixianyu | 0:d8f4c441e032 | 53 | |
| lixianyu | 0:d8f4c441e032 | 54 | |
| lixianyu | 0:d8f4c441e032 | 55 | u8g->pin_list[U8G_PI_SET_A0] = 0; |
| lixianyu | 0:d8f4c441e032 | 56 | return 1; |
| lixianyu | 0:d8f4c441e032 | 57 | } |
| lixianyu | 0:d8f4c441e032 | 58 | |
| lixianyu | 0:d8f4c441e032 | 59 | uint8_t u8g_com_raspberrypi_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) |
| lixianyu | 0:d8f4c441e032 | 60 | { |
| lixianyu | 0:d8f4c441e032 | 61 | switch(msg) |
| lixianyu | 0:d8f4c441e032 | 62 | { |
| lixianyu | 0:d8f4c441e032 | 63 | case U8G_COM_MSG_INIT: |
| lixianyu | 0:d8f4c441e032 | 64 | u8g_i2c_init(u8g->pin_list[U8G_PI_I2C_OPTION]); |
| lixianyu | 0:d8f4c441e032 | 65 | u8g_SetPIOutput(u8g, U8G_PI_RESET); |
| lixianyu | 0:d8f4c441e032 | 66 | u8g_SetPIOutput(u8g, U8G_PI_A0); |
| lixianyu | 0:d8f4c441e032 | 67 | break; |
| lixianyu | 0:d8f4c441e032 | 68 | |
| lixianyu | 0:d8f4c441e032 | 69 | case U8G_COM_MSG_STOP: |
| lixianyu | 0:d8f4c441e032 | 70 | break; |
| lixianyu | 0:d8f4c441e032 | 71 | |
| lixianyu | 0:d8f4c441e032 | 72 | case U8G_COM_MSG_RESET: |
| lixianyu | 0:d8f4c441e032 | 73 | break; |
| lixianyu | 0:d8f4c441e032 | 74 | |
| lixianyu | 0:d8f4c441e032 | 75 | case U8G_COM_MSG_CHIP_SELECT: |
| lixianyu | 0:d8f4c441e032 | 76 | u8g->pin_list[U8G_PI_A0_STATE] = 0; |
| lixianyu | 0:d8f4c441e032 | 77 | u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again, also forces start condition */ |
| lixianyu | 0:d8f4c441e032 | 78 | if ( arg_val == 0 ) |
| lixianyu | 0:d8f4c441e032 | 79 | { |
| lixianyu | 0:d8f4c441e032 | 80 | /* disable chip, send stop condition */ |
| lixianyu | 0:d8f4c441e032 | 81 | u8g_i2c_stop(); |
| lixianyu | 0:d8f4c441e032 | 82 | } |
| lixianyu | 0:d8f4c441e032 | 83 | else |
| lixianyu | 0:d8f4c441e032 | 84 | { |
| lixianyu | 0:d8f4c441e032 | 85 | /* enable, do nothing: any byte writing will trigger the i2c start */ |
| lixianyu | 0:d8f4c441e032 | 86 | } |
| lixianyu | 0:d8f4c441e032 | 87 | break; |
| lixianyu | 0:d8f4c441e032 | 88 | |
| lixianyu | 0:d8f4c441e032 | 89 | case U8G_COM_MSG_WRITE_BYTE: |
| lixianyu | 0:d8f4c441e032 | 90 | //u8g->pin_list[U8G_PI_SET_A0] = 1; |
| lixianyu | 0:d8f4c441e032 | 91 | if ( u8g_com_raspberrypi_ssd_start_sequence(u8g) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 92 | return u8g_i2c_stop(), 0; |
| lixianyu | 0:d8f4c441e032 | 93 | if ( u8g_i2c_send_byte(arg_val) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 94 | return u8g_i2c_stop(), 0; |
| lixianyu | 0:d8f4c441e032 | 95 | // u8g_i2c_stop(); |
| lixianyu | 0:d8f4c441e032 | 96 | break; |
| lixianyu | 0:d8f4c441e032 | 97 | |
| lixianyu | 0:d8f4c441e032 | 98 | case U8G_COM_MSG_WRITE_SEQ: |
| lixianyu | 0:d8f4c441e032 | 99 | //u8g->pin_list[U8G_PI_SET_A0] = 1; |
| lixianyu | 0:d8f4c441e032 | 100 | if ( u8g_com_raspberrypi_ssd_start_sequence(u8g) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 101 | return u8g_i2c_stop(), 0; |
| lixianyu | 0:d8f4c441e032 | 102 | { |
| lixianyu | 0:d8f4c441e032 | 103 | register uint8_t *ptr = (uint8_t *)arg_ptr; |
| lixianyu | 0:d8f4c441e032 | 104 | while( arg_val > 0 ) |
| lixianyu | 0:d8f4c441e032 | 105 | { |
| lixianyu | 0:d8f4c441e032 | 106 | if ( u8g_i2c_send_byte(*ptr++) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 107 | return u8g_i2c_stop(), 0; |
| lixianyu | 0:d8f4c441e032 | 108 | arg_val--; |
| lixianyu | 0:d8f4c441e032 | 109 | } |
| lixianyu | 0:d8f4c441e032 | 110 | } |
| lixianyu | 0:d8f4c441e032 | 111 | // u8g_i2c_stop(); |
| lixianyu | 0:d8f4c441e032 | 112 | break; |
| lixianyu | 0:d8f4c441e032 | 113 | |
| lixianyu | 0:d8f4c441e032 | 114 | case U8G_COM_MSG_WRITE_SEQ_P: |
| lixianyu | 0:d8f4c441e032 | 115 | //u8g->pin_list[U8G_PI_SET_A0] = 1; |
| lixianyu | 0:d8f4c441e032 | 116 | if ( u8g_com_raspberrypi_ssd_start_sequence(u8g) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 117 | return u8g_i2c_stop(), 0; |
| lixianyu | 0:d8f4c441e032 | 118 | { |
| lixianyu | 0:d8f4c441e032 | 119 | register uint8_t *ptr = (uint8_t *)arg_ptr; |
| lixianyu | 0:d8f4c441e032 | 120 | while( arg_val > 0 ) |
| lixianyu | 0:d8f4c441e032 | 121 | { |
| lixianyu | 0:d8f4c441e032 | 122 | if ( u8g_i2c_send_byte(u8g_pgm_read(ptr)) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 123 | return 0; |
| lixianyu | 0:d8f4c441e032 | 124 | ptr++; |
| lixianyu | 0:d8f4c441e032 | 125 | arg_val--; |
| lixianyu | 0:d8f4c441e032 | 126 | } |
| lixianyu | 0:d8f4c441e032 | 127 | } |
| lixianyu | 0:d8f4c441e032 | 128 | // u8g_i2c_stop(); |
| lixianyu | 0:d8f4c441e032 | 129 | break; |
| lixianyu | 0:d8f4c441e032 | 130 | |
| lixianyu | 0:d8f4c441e032 | 131 | case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ |
| lixianyu | 0:d8f4c441e032 | 132 | u8g->pin_list[U8G_PI_A0_STATE] = arg_val; |
| lixianyu | 0:d8f4c441e032 | 133 | u8g->pin_list[U8G_PI_SET_A0] = 1; /* force a0 to set again */ |
| lixianyu | 0:d8f4c441e032 | 134 | |
| lixianyu | 0:d8f4c441e032 | 135 | #ifdef OLD_CODE |
| lixianyu | 0:d8f4c441e032 | 136 | if ( i2c_state != 0 ) |
| lixianyu | 0:d8f4c441e032 | 137 | { |
| lixianyu | 0:d8f4c441e032 | 138 | u8g_i2c_stop(); |
| lixianyu | 0:d8f4c441e032 | 139 | i2c_state = 0; |
| lixianyu | 0:d8f4c441e032 | 140 | } |
| lixianyu | 0:d8f4c441e032 | 141 | |
| lixianyu | 0:d8f4c441e032 | 142 | if ( u8g_com_raspberrypi_ssd_start_sequence(arg_val) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 143 | return 0; |
| lixianyu | 0:d8f4c441e032 | 144 | |
| lixianyu | 0:d8f4c441e032 | 145 | /* setup bus, might be a repeated start */ |
| lixianyu | 0:d8f4c441e032 | 146 | /* |
| lixianyu | 0:d8f4c441e032 | 147 | if ( u8g_i2c_start(I2C_SLA) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 148 | return 0; |
| lixianyu | 0:d8f4c441e032 | 149 | if ( arg_val == 0 ) |
| lixianyu | 0:d8f4c441e032 | 150 | { |
| lixianyu | 0:d8f4c441e032 | 151 | i2c_state = 1; |
| lixianyu | 0:d8f4c441e032 | 152 | |
| lixianyu | 0:d8f4c441e032 | 153 | if ( u8g_i2c_send_byte(I2C_CMD_MODE) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 154 | return 0; |
| lixianyu | 0:d8f4c441e032 | 155 | } |
| lixianyu | 0:d8f4c441e032 | 156 | else |
| lixianyu | 0:d8f4c441e032 | 157 | { |
| lixianyu | 0:d8f4c441e032 | 158 | i2c_state = 2; |
| lixianyu | 0:d8f4c441e032 | 159 | if ( u8g_i2c_send_byte(I2C_DATA_MODE) == 0 ) |
| lixianyu | 0:d8f4c441e032 | 160 | return 0; |
| lixianyu | 0:d8f4c441e032 | 161 | } |
| lixianyu | 0:d8f4c441e032 | 162 | */ |
| lixianyu | 0:d8f4c441e032 | 163 | #endif |
| lixianyu | 0:d8f4c441e032 | 164 | break; |
| lixianyu | 0:d8f4c441e032 | 165 | } |
| lixianyu | 0:d8f4c441e032 | 166 | return 1; |
| lixianyu | 0:d8f4c441e032 | 167 | } |
| lixianyu | 0:d8f4c441e032 | 168 | |
| lixianyu | 0:d8f4c441e032 | 169 | #else /* defined(U8G_WITH_PINLIST) */ |
| lixianyu | 0:d8f4c441e032 | 170 | |
| lixianyu | 0:d8f4c441e032 | 171 | uint8_t u8g_com_raspberrypi_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { |
| lixianyu | 0:d8f4c441e032 | 172 | return 1; |
| lixianyu | 0:d8f4c441e032 | 173 | } |
| lixianyu | 0:d8f4c441e032 | 174 | |
| lixianyu | 0:d8f4c441e032 | 175 | #endif /* defined(U8G_WITH_PINLIST) */ |
| lixianyu | 0:d8f4c441e032 | 176 | #endif |
| lixianyu | 0:d8f4c441e032 | 177 |