12-Channel LED Driver With Gray scale Adaptive Pulse Density Modulation Control IC maker MY-Semi

Dependencies:   MY9221 mbed

Committer:
suupen
Date:
Sun Oct 22 00:22:36 2017 +0000
Revision:
0:104d4c4514b8
Child:
1:caa6335a5b06
main???????libary???????;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
suupen 0:104d4c4514b8 1 /**
suupen 0:104d4c4514b8 2 * @section DESCRIPTION
suupen 0:104d4c4514b8 3 * maker http://www.my-semi.com/content/products/product_mean.aspx?id=9
suupen 0:104d4c4514b8 4 * shop http://akizukidenshi.com/catalog/g/gI-09678/
suupen 0:104d4c4514b8 5 */
suupen 0:104d4c4514b8 6
suupen 0:104d4c4514b8 7 /*
suupen 0:104d4c4514b8 8 MY9366
suupen 0:104d4c4514b8 9 http://www.my-semi.com/content/products/product_mean.aspx?id=28
suupen 0:104d4c4514b8 10 */
suupen 0:104d4c4514b8 11 #define LIBMY9221
suupen 0:104d4c4514b8 12
suupen 0:104d4c4514b8 13 #include "mbed.h"
suupen 0:104d4c4514b8 14
suupen 0:104d4c4514b8 15 #ifdef LIBMY9221
suupen 0:104d4c4514b8 16 #include "MY9221.h"
suupen 0:104d4c4514b8 17 MY9221 MY9221(p5, p10, 1); // di, clk, number
suupen 0:104d4c4514b8 18 #else
suupen 0:104d4c4514b8 19 DigitalOut DCKI (p10); // clk
suupen 0:104d4c4514b8 20 DigitalOut DI(p5);
suupen 0:104d4c4514b8 21
suupen 0:104d4c4514b8 22 //=========================
suupen 0:104d4c4514b8 23 // command data description
suupen 0:104d4c4514b8 24 //=========================
suupen 0:104d4c4514b8 25 // 0x0000にクリアした上で、下記の定義をorしていく
suupen 0:104d4c4514b8 26
suupen 0:104d4c4514b8 27 // CMD[10] 0000 0x00 0000 0000 lout Tr/Tf select
suupen 0:104d4c4514b8 28 #define LOUT_SLOW_MODE (0x0000)
suupen 0:104d4c4514b8 29 #define LOUT_FAST_MODE (0x0400)
suupen 0:104d4c4514b8 30
suupen 0:104d4c4514b8 31 // CMD[9:8] 0000 00xx 0000 0000 Gryascale resolution select
suupen 0:104d4c4514b8 32 #define GRAYSCALE_8BIT (0x0000)
suupen 0:104d4c4514b8 33 #define GRAYSCALE_12BIT (0x0100)
suupen 0:104d4c4514b8 34 #define GRAYSCALE_14BIT (0x0200)
suupen 0:104d4c4514b8 35 #define GRAYSCALE_16BIT (0x0300)
suupen 0:104d4c4514b8 36
suupen 0:104d4c4514b8 37 // CMD[7:5] 0000 0000 xxx0 0000 Internal oscillator freq select
suupen 0:104d4c4514b8 38 #define ORIGINAL_FREQ1 (0x0000)
suupen 0:104d4c4514b8 39 #define ORIGINAL_FREQ2 (0x0020)
suupen 0:104d4c4514b8 40 #define ORIGINAL_FREQ4 (0x0040)
suupen 0:104d4c4514b8 41 #define ORIGINAL_FREQ8 (0x0060)
suupen 0:104d4c4514b8 42 #define ORIGINAL_FREQ16 (0x0080)
suupen 0:104d4c4514b8 43 #define ORIGINAL_FREQ64 (0x00a0)
suupen 0:104d4c4514b8 44 #define ORIGINAL_FREQ128 (0x00c0)
suupen 0:104d4c4514b8 45 #define ORIGINAL_FREQ256 (0x00e0)
suupen 0:104d4c4514b8 46
suupen 0:104d4c4514b8 47 // CMD[4] 0000 0000 000x 0000 Output waveform select
suupen 0:104d4c4514b8 48 #define WAVE_MYPWM (0x0000) // Only Grayscale = 8bit
suupen 0:104d4c4514b8 49 #define WAVE_APDM (0x0010)
suupen 0:104d4c4514b8 50
suupen 0:104d4c4514b8 51 // CMD[3] 0000 0000 0000 x000 Grayscale clock source select
suupen 0:104d4c4514b8 52 #define GCLOCK_INTERNAL (0x0000)
suupen 0:104d4c4514b8 53 #define GCLOCK_EXTERNAL (0x0008)
suupen 0:104d4c4514b8 54
suupen 0:104d4c4514b8 55 // CMD[2] 0000 0000 0000 0x00 Output polarity select
suupen 0:104d4c4514b8 56 #define WORK_LED (0x0000)
suupen 0:104d4c4514b8 57 #define WORK_MYPWM (0x0004)
suupen 0:104d4c4514b8 58
suupen 0:104d4c4514b8 59 // CMD[1] 0000 0000 0000 00x0 Counter reset select
suupen 0:104d4c4514b8 60 #define COUNTER_FREE (0x0000)
suupen 0:104d4c4514b8 61 #define COUNTER_RESET (0x0002)
suupen 0:104d4c4514b8 62
suupen 0:104d4c4514b8 63 // CMD[0] 0000 0000 0000 000x One-shot select
suupen 0:104d4c4514b8 64 #define SHOT_REPEAT (0x0000)
suupen 0:104d4c4514b8 65 #define SHOT_SHOT (0x0001)
suupen 0:104d4c4514b8 66
suupen 0:104d4c4514b8 67 // commandData_t D[]の配列番号
suupen 0:104d4c4514b8 68 // MY9221のOUTxの番号と配列番号をあわせるための定義
suupen 0:104d4c4514b8 69 #define OUT3 (0)
suupen 0:104d4c4514b8 70 #define OUT2 (1)
suupen 0:104d4c4514b8 71 #define OUT1 (2)
suupen 0:104d4c4514b8 72 #define OUT0 (3)
suupen 0:104d4c4514b8 73
suupen 0:104d4c4514b8 74 //=========================
suupen 0:104d4c4514b8 75 // MY9221 command data 定義
suupen 0:104d4c4514b8 76 //=========================
suupen 0:104d4c4514b8 77 typedef struct {
suupen 0:104d4c4514b8 78 uint16_t DA;
suupen 0:104d4c4514b8 79 uint16_t DB;
suupen 0:104d4c4514b8 80 uint16_t DC;
suupen 0:104d4c4514b8 81 } dataSet_t;
suupen 0:104d4c4514b8 82
suupen 0:104d4c4514b8 83 typedef struct {
suupen 0:104d4c4514b8 84 uint16_t CMD;
suupen 0:104d4c4514b8 85 dataSet_t D[4]; // [0]:OUT3 [1]:OUT2 [2]:OUT1 [3]:OUT0
suupen 0:104d4c4514b8 86 } commandData_t;
suupen 0:104d4c4514b8 87
suupen 0:104d4c4514b8 88
suupen 0:104d4c4514b8 89 commandData_t MY9221_data[1] = {
suupen 0:104d4c4514b8 90
suupen 0:104d4c4514b8 91 0x0000, // CMD
suupen 0:104d4c4514b8 92
suupen 0:104d4c4514b8 93 0xffff, // DA3;
suupen 0:104d4c4514b8 94 0xffff, // DB3;
suupen 0:104d4c4514b8 95 0xffff, // DC3;
suupen 0:104d4c4514b8 96
suupen 0:104d4c4514b8 97 0x00ff, // DA2;
suupen 0:104d4c4514b8 98 0x00ff, // DB2;
suupen 0:104d4c4514b8 99 0x00ff, // DC2;
suupen 0:104d4c4514b8 100
suupen 0:104d4c4514b8 101 0x000f, // DA1;
suupen 0:104d4c4514b8 102 0x000f, // DB1;
suupen 0:104d4c4514b8 103 0x000f, // DC1;
suupen 0:104d4c4514b8 104
suupen 0:104d4c4514b8 105 0x0000, // DA0;
suupen 0:104d4c4514b8 106 0x0000, // DB0;
suupen 0:104d4c4514b8 107 0x0000 // DC0;
suupen 0:104d4c4514b8 108
suupen 0:104d4c4514b8 109 };
suupen 0:104d4c4514b8 110
suupen 0:104d4c4514b8 111 /** send one word data
suupen 0:104d4c4514b8 112 * @param uint16_t data : send data
suupen 0:104d4c4514b8 113 * @param return none
suupen 0:104d4c4514b8 114 */
suupen 0:104d4c4514b8 115 void sendWord(uint16_t data)
suupen 0:104d4c4514b8 116 {
suupen 0:104d4c4514b8 117 uint16_t temp = data;
suupen 0:104d4c4514b8 118 uint8_t count = 8;
suupen 0:104d4c4514b8 119
suupen 0:104d4c4514b8 120 __disable_irq(); // 禁止
suupen 0:104d4c4514b8 121 DCKI = 0;
suupen 0:104d4c4514b8 122 wait_us(1);
suupen 0:104d4c4514b8 123
suupen 0:104d4c4514b8 124 do {
suupen 0:104d4c4514b8 125
suupen 0:104d4c4514b8 126 DI = ((temp & 0x8000) == 0x8000) ? 1 : 0;
suupen 0:104d4c4514b8 127 temp <<= 1;
suupen 0:104d4c4514b8 128 wait_us(1);
suupen 0:104d4c4514b8 129
suupen 0:104d4c4514b8 130 DCKI = 1;
suupen 0:104d4c4514b8 131 wait_us(1);
suupen 0:104d4c4514b8 132
suupen 0:104d4c4514b8 133 DI = ((temp & 0x8000) == 0x8000) ? 1 : 0;
suupen 0:104d4c4514b8 134 temp <<= 1;
suupen 0:104d4c4514b8 135 wait_us(1);
suupen 0:104d4c4514b8 136
suupen 0:104d4c4514b8 137 DCKI = 0;
suupen 0:104d4c4514b8 138 wait_us(1);
suupen 0:104d4c4514b8 139
suupen 0:104d4c4514b8 140 } while(--count > 0);
suupen 0:104d4c4514b8 141
suupen 0:104d4c4514b8 142 DI = 0;
suupen 0:104d4c4514b8 143 DCKI = 0;
suupen 0:104d4c4514b8 144 __enable_irq(); // 許可
suupen 0:104d4c4514b8 145
suupen 0:104d4c4514b8 146 }
suupen 0:104d4c4514b8 147
suupen 0:104d4c4514b8 148 /** data latch & display
suupen 0:104d4c4514b8 149 * @param none
suupen 0:104d4c4514b8 150 * @param return none
suupen 0:104d4c4514b8 151 */
suupen 0:104d4c4514b8 152 void latch(void)
suupen 0:104d4c4514b8 153 {
suupen 0:104d4c4514b8 154 __disable_irq(); // 禁止
suupen 0:104d4c4514b8 155
suupen 0:104d4c4514b8 156 DCKI = 0;
suupen 0:104d4c4514b8 157 wait_us(1);
suupen 0:104d4c4514b8 158
suupen 0:104d4c4514b8 159 DI = 1;
suupen 0:104d4c4514b8 160 wait_us(1);
suupen 0:104d4c4514b8 161 DI = 0;
suupen 0:104d4c4514b8 162 wait_us(1);
suupen 0:104d4c4514b8 163
suupen 0:104d4c4514b8 164 DI = 1;
suupen 0:104d4c4514b8 165 wait_us(1);
suupen 0:104d4c4514b8 166 DI = 0;
suupen 0:104d4c4514b8 167 wait_us(1);
suupen 0:104d4c4514b8 168
suupen 0:104d4c4514b8 169 DI = 1;
suupen 0:104d4c4514b8 170 wait_us(1);
suupen 0:104d4c4514b8 171 DI = 0;
suupen 0:104d4c4514b8 172 wait_us(1);
suupen 0:104d4c4514b8 173
suupen 0:104d4c4514b8 174 DI = 1;
suupen 0:104d4c4514b8 175 wait_us(1);
suupen 0:104d4c4514b8 176 DI = 0;
suupen 0:104d4c4514b8 177 wait_us(1);
suupen 0:104d4c4514b8 178
suupen 0:104d4c4514b8 179
suupen 0:104d4c4514b8 180 DCKI = 0;
suupen 0:104d4c4514b8 181 __enable_irq(); // 許可
suupen 0:104d4c4514b8 182
suupen 0:104d4c4514b8 183 }
suupen 0:104d4c4514b8 184
suupen 0:104d4c4514b8 185 /** send brock data
suupen 0:104d4c4514b8 186 * @param commandData_t *data : MY9221 Data
suupen 0:104d4c4514b8 187 * @param uint8_t number : connection number (min=1)
suupen 0:104d4c4514b8 188 * @param none
suupen 0:104d4c4514b8 189 */
suupen 0:104d4c4514b8 190
suupen 0:104d4c4514b8 191 void sendBrock(commandData_t *data, uint8_t number)
suupen 0:104d4c4514b8 192 {
suupen 0:104d4c4514b8 193 for(uint8_t i = 0; i < number; i++) {
suupen 0:104d4c4514b8 194
suupen 0:104d4c4514b8 195 sendWord((data + i)->CMD);
suupen 0:104d4c4514b8 196
suupen 0:104d4c4514b8 197 sendWord((data + i)->D[0].DA);
suupen 0:104d4c4514b8 198 sendWord((data + i)->D[0].DB);
suupen 0:104d4c4514b8 199 sendWord((data + i)->D[0].DC);
suupen 0:104d4c4514b8 200
suupen 0:104d4c4514b8 201 sendWord((data + i)->D[1].DA);
suupen 0:104d4c4514b8 202 sendWord((data + i)->D[1].DB);
suupen 0:104d4c4514b8 203 sendWord((data + i)->D[1].DC);
suupen 0:104d4c4514b8 204
suupen 0:104d4c4514b8 205 sendWord((data + i)->D[2].DA);
suupen 0:104d4c4514b8 206 sendWord((data + i)->D[2].DB);
suupen 0:104d4c4514b8 207 sendWord((data + i)->D[2].DC);
suupen 0:104d4c4514b8 208
suupen 0:104d4c4514b8 209 sendWord((data + i)->D[3].DA);
suupen 0:104d4c4514b8 210 sendWord((data + i)->D[3].DB);
suupen 0:104d4c4514b8 211 sendWord((data + i)->D[3].DC);
suupen 0:104d4c4514b8 212 }
suupen 0:104d4c4514b8 213
suupen 0:104d4c4514b8 214 latch();
suupen 0:104d4c4514b8 215 }
suupen 0:104d4c4514b8 216
suupen 0:104d4c4514b8 217 DigitalOut myled(LED1);
suupen 0:104d4c4514b8 218 #endif
suupen 0:104d4c4514b8 219
suupen 0:104d4c4514b8 220
suupen 0:104d4c4514b8 221 #ifndef LIBMY9221
suupen 0:104d4c4514b8 222 int main()
suupen 0:104d4c4514b8 223 {
suupen 0:104d4c4514b8 224
suupen 0:104d4c4514b8 225 uint16_t temp[12];
suupen 0:104d4c4514b8 226
suupen 0:104d4c4514b8 227 MY9221_data[0].CMD = 0;
suupen 0:104d4c4514b8 228
suupen 0:104d4c4514b8 229 MY9221_data[0].CMD = LOUT_FAST_MODE
suupen 0:104d4c4514b8 230 | GRAYSCALE_16BIT
suupen 0:104d4c4514b8 231 | ORIGINAL_FREQ1
suupen 0:104d4c4514b8 232 | WAVE_APDM
suupen 0:104d4c4514b8 233 | GCLOCK_INTERNAL
suupen 0:104d4c4514b8 234 | WORK_LED
suupen 0:104d4c4514b8 235 | COUNTER_FREE
suupen 0:104d4c4514b8 236 | SHOT_REPEAT;
suupen 0:104d4c4514b8 237
suupen 0:104d4c4514b8 238
suupen 0:104d4c4514b8 239 for(uint8_t i=0; i < 12; i++){
suupen 0:104d4c4514b8 240 temp[i] = i * 0x0100;
suupen 0:104d4c4514b8 241 }
suupen 0:104d4c4514b8 242
suupen 0:104d4c4514b8 243 while(1) {
suupen 0:104d4c4514b8 244
suupen 0:104d4c4514b8 245 sendBrock(MY9221_data, 1);
suupen 0:104d4c4514b8 246
suupen 0:104d4c4514b8 247 for(uint8_t i=0; i < 12; i++){
suupen 0:104d4c4514b8 248 temp[i] += 0x100;
suupen 0:104d4c4514b8 249 if(temp[i] == 0){temp[i] = 1;}
suupen 0:104d4c4514b8 250 }
suupen 0:104d4c4514b8 251 printf("%04x %04x %04x\r\n",MY9221_data[0].CMD, temp[0], temp[1]);
suupen 0:104d4c4514b8 252
suupen 0:104d4c4514b8 253 MY9221_data[0].D[OUT3].DA = temp[0];
suupen 0:104d4c4514b8 254 MY9221_data[0].D[OUT3].DB = 0;//temp[1];
suupen 0:104d4c4514b8 255 MY9221_data[0].D[OUT3].DC = 0;//temp[2];
suupen 0:104d4c4514b8 256
suupen 0:104d4c4514b8 257 MY9221_data[0].D[OUT2].DA = 0;//temp[3];
suupen 0:104d4c4514b8 258 MY9221_data[0].D[OUT2].DB = temp[4];
suupen 0:104d4c4514b8 259 MY9221_data[0].D[OUT2].DC = 0;//temp[5];
suupen 0:104d4c4514b8 260
suupen 0:104d4c4514b8 261 myled = 1;
suupen 0:104d4c4514b8 262
suupen 0:104d4c4514b8 263 MY9221_data[0].D[OUT1].DA = 0;//temp[6];
suupen 0:104d4c4514b8 264 MY9221_data[0].D[OUT1].DB = 0;//temp[7];
suupen 0:104d4c4514b8 265 MY9221_data[0].D[OUT1].DC = temp[8];
suupen 0:104d4c4514b8 266
suupen 0:104d4c4514b8 267 MY9221_data[0].D[OUT0].DA = temp[9];
suupen 0:104d4c4514b8 268 MY9221_data[0].D[OUT0].DB = 0;//temp[10];
suupen 0:104d4c4514b8 269 MY9221_data[0].D[OUT0].DC = temp[11];
suupen 0:104d4c4514b8 270
suupen 0:104d4c4514b8 271 /*
suupen 0:104d4c4514b8 272 tempA++;
suupen 0:104d4c4514b8 273 tempB++;
suupen 0:104d4c4514b8 274 tempC++;
suupen 0:104d4c4514b8 275
suupen 0:104d4c4514b8 276 MY9221_data[0].D[OUT3].DA = tempA;
suupen 0:104d4c4514b8 277 MY9221_data[0].D[OUT3].DB = tempA;
suupen 0:104d4c4514b8 278 MY9221_data[0].D[OUT3].DC = tempA;
suupen 0:104d4c4514b8 279
suupen 0:104d4c4514b8 280 MY9221_data[0].D[OUT2].DA = tempA;
suupen 0:104d4c4514b8 281 MY9221_data[0].D[OUT2].DB = tempA;
suupen 0:104d4c4514b8 282 MY9221_data[0].D[OUT2].DC = tempA;
suupen 0:104d4c4514b8 283
suupen 0:104d4c4514b8 284 myled = 1;
suupen 0:104d4c4514b8 285
suupen 0:104d4c4514b8 286 MY9221_data[0].D[OUT1].DA = tempA;
suupen 0:104d4c4514b8 287 MY9221_data[0].D[OUT1].DB = tempA;
suupen 0:104d4c4514b8 288 MY9221_data[0].D[OUT1].DC = tempA;
suupen 0:104d4c4514b8 289
suupen 0:104d4c4514b8 290 MY9221_data[0].D[OUT0].DA = tempA;
suupen 0:104d4c4514b8 291 MY9221_data[0].D[OUT0].DB = tempA;
suupen 0:104d4c4514b8 292 MY9221_data[0].D[OUT0].DC = tempA;
suupen 0:104d4c4514b8 293 */
suupen 0:104d4c4514b8 294 // wait(0.1);
suupen 0:104d4c4514b8 295 myled = 0;
suupen 0:104d4c4514b8 296 // wait(0.2);
suupen 0:104d4c4514b8 297 }
suupen 0:104d4c4514b8 298 }
suupen 0:104d4c4514b8 299 #else
suupen 0:104d4c4514b8 300 int main()
suupen 0:104d4c4514b8 301 {
suupen 0:104d4c4514b8 302 MY9221.initialTest();
suupen 0:104d4c4514b8 303 while(1){
suupen 0:104d4c4514b8 304 MY9221.test();
suupen 0:104d4c4514b8 305 }
suupen 0:104d4c4514b8 306 }
suupen 0:104d4c4514b8 307 #endif