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

Dependents:   Library_MY9221

Committer:
suupen
Date:
Sun Oct 22 12:08:22 2017 +0000
Revision:
2:4d9aee0bd724
Parent:
1:60440eb16f81
Child:
3:2131a24e5489
??????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
suupen 0:3a18655ada14 1 /**
suupen 0:3a18655ada14 2 * MY9221 Library
suupen 0:3a18655ada14 3 */
suupen 1:60440eb16f81 4 #define _MY9221_C
suupen 0:3a18655ada14 5
suupen 1:60440eb16f81 6 #include "mbed.h"
suupen 0:3a18655ada14 7 #include "MY9221.h"
suupen 1:60440eb16f81 8
suupen 0:3a18655ada14 9 /**
suupen 0:3a18655ada14 10 *
suupen 0:3a18655ada14 11 */
suupen 0:3a18655ada14 12 MY9221::MY9221(PinName di, PinName dcki, uint8_t number
suupen 1:60440eb16f81 13 ) : _di(di), _dcki(dcki), _number(number)
suupen 0:3a18655ada14 14 {
suupen 1:60440eb16f81 15
suupen 0:3a18655ada14 16 // 変数初期化 ,マイコン機能の設定
suupen 0:3a18655ada14 17 _di = 0;
suupen 1:60440eb16f81 18 _dcki = 0;
suupen 2:4d9aee0bd724 19
suupen 2:4d9aee0bd724 20 command = 0x0000;
suupen 2:4d9aee0bd724 21 commandRawSet(command);
suupen 1:60440eb16f81 22
suupen 1:60440eb16f81 23
suupen 1:60440eb16f81 24 }
suupen 1:60440eb16f81 25
suupen 1:60440eb16f81 26 /** send one word data
suupen 1:60440eb16f81 27 * @param uint16_t data : send data
suupen 1:60440eb16f81 28 * @param return none
suupen 1:60440eb16f81 29 */
suupen 1:60440eb16f81 30 void MY9221::sendWord(uint16_t data)
suupen 1:60440eb16f81 31 {
suupen 1:60440eb16f81 32 uint16_t temp = data;
suupen 1:60440eb16f81 33 uint8_t count = 8;
suupen 1:60440eb16f81 34
suupen 1:60440eb16f81 35 __disable_irq(); // 禁止
suupen 1:60440eb16f81 36 _dcki = 0;
suupen 1:60440eb16f81 37 wait_us(1);
suupen 1:60440eb16f81 38
suupen 1:60440eb16f81 39 do {
suupen 1:60440eb16f81 40
suupen 1:60440eb16f81 41 _di = ((temp & 0x8000) == 0x8000) ? 1 : 0;
suupen 1:60440eb16f81 42 temp <<= 1;
suupen 1:60440eb16f81 43 wait_us(1);
suupen 1:60440eb16f81 44
suupen 1:60440eb16f81 45 _dcki = 1;
suupen 1:60440eb16f81 46 wait_us(1);
suupen 1:60440eb16f81 47
suupen 1:60440eb16f81 48 _di = ((temp & 0x8000) == 0x8000) ? 1 : 0;
suupen 1:60440eb16f81 49 temp <<= 1;
suupen 1:60440eb16f81 50 wait_us(1);
suupen 1:60440eb16f81 51
suupen 1:60440eb16f81 52 _dcki = 0;
suupen 1:60440eb16f81 53 wait_us(1);
suupen 1:60440eb16f81 54
suupen 1:60440eb16f81 55 } while(--count > 0);
suupen 1:60440eb16f81 56
suupen 1:60440eb16f81 57 _di = 0;
suupen 1:60440eb16f81 58 _dcki = 0;
suupen 1:60440eb16f81 59 __enable_irq(); // 許可
suupen 1:60440eb16f81 60
suupen 1:60440eb16f81 61 }
suupen 1:60440eb16f81 62
suupen 1:60440eb16f81 63 /** data latch & display
suupen 1:60440eb16f81 64 * @param none
suupen 1:60440eb16f81 65 * @param return none
suupen 1:60440eb16f81 66 */
suupen 1:60440eb16f81 67 void MY9221::latch(void)
suupen 1:60440eb16f81 68 {
suupen 1:60440eb16f81 69 __disable_irq(); // 禁止
suupen 1:60440eb16f81 70
suupen 1:60440eb16f81 71 _dcki = 0;
suupen 1:60440eb16f81 72 wait_us(1);
suupen 1:60440eb16f81 73
suupen 1:60440eb16f81 74 _di = 1;
suupen 1:60440eb16f81 75 wait_us(1);
suupen 1:60440eb16f81 76 _di = 0;
suupen 1:60440eb16f81 77 wait_us(1);
suupen 1:60440eb16f81 78
suupen 1:60440eb16f81 79 _di = 1;
suupen 1:60440eb16f81 80 wait_us(1);
suupen 1:60440eb16f81 81 _di = 0;
suupen 1:60440eb16f81 82 wait_us(1);
suupen 1:60440eb16f81 83
suupen 1:60440eb16f81 84 _di = 1;
suupen 1:60440eb16f81 85 wait_us(1);
suupen 1:60440eb16f81 86 _di = 0;
suupen 1:60440eb16f81 87 wait_us(1);
suupen 1:60440eb16f81 88
suupen 1:60440eb16f81 89 _di = 1;
suupen 1:60440eb16f81 90 wait_us(1);
suupen 1:60440eb16f81 91 _di = 0;
suupen 1:60440eb16f81 92 wait_us(1);
suupen 1:60440eb16f81 93
suupen 1:60440eb16f81 94
suupen 1:60440eb16f81 95 _dcki = 0;
suupen 1:60440eb16f81 96 __enable_irq(); // 許可
suupen 1:60440eb16f81 97
suupen 1:60440eb16f81 98 }
suupen 0:3a18655ada14 99
suupen 1:60440eb16f81 100 /** send brock data
suupen 1:60440eb16f81 101 * @param commandData_t *data : MY9221 Data
suupen 1:60440eb16f81 102 * @param uint8_t number : connection number (min=1)
suupen 1:60440eb16f81 103 * @param none
suupen 1:60440eb16f81 104 */
suupen 2:4d9aee0bd724 105 void MY9221::sendBrock(commandData_t *data)
suupen 1:60440eb16f81 106 {
suupen 2:4d9aee0bd724 107 for(uint8_t i = 0; i < _number; i++) {
suupen 1:60440eb16f81 108
suupen 1:60440eb16f81 109 sendWord((data + i)->CMD);
suupen 1:60440eb16f81 110
suupen 2:4d9aee0bd724 111 sendWord((data + i)->D[OUT3].DA);
suupen 2:4d9aee0bd724 112 sendWord((data + i)->D[OUT3].DB);
suupen 2:4d9aee0bd724 113 sendWord((data + i)->D[OUT3].DC);
suupen 1:60440eb16f81 114
suupen 2:4d9aee0bd724 115 sendWord((data + i)->D[OUT2].DA);
suupen 2:4d9aee0bd724 116 sendWord((data + i)->D[OUT2].DB);
suupen 2:4d9aee0bd724 117 sendWord((data + i)->D[OUT2].DC);
suupen 1:60440eb16f81 118
suupen 2:4d9aee0bd724 119 sendWord((data + i)->D[OUT1].DA);
suupen 2:4d9aee0bd724 120 sendWord((data + i)->D[OUT1].DB);
suupen 2:4d9aee0bd724 121 sendWord((data + i)->D[OUT1].DC);
suupen 1:60440eb16f81 122
suupen 2:4d9aee0bd724 123 sendWord((data + i)->D[OUT0].DA);
suupen 2:4d9aee0bd724 124 sendWord((data + i)->D[OUT0].DB);
suupen 2:4d9aee0bd724 125 sendWord((data + i)->D[OUT0].DC);
suupen 0:3a18655ada14 126 }
suupen 1:60440eb16f81 127
suupen 1:60440eb16f81 128 latch();
suupen 1:60440eb16f81 129 }
suupen 1:60440eb16f81 130
suupen 2:4d9aee0bd724 131
suupen 2:4d9aee0bd724 132 void MY9221::commandRawSet(uint16_t command)
suupen 2:4d9aee0bd724 133 {
suupen 2:4d9aee0bd724 134 for(int i = 0; i < _number; i++) {
suupen 2:4d9aee0bd724 135 MY9221_data[i].CMD = command;
suupen 2:4d9aee0bd724 136 }
suupen 2:4d9aee0bd724 137 }
suupen 2:4d9aee0bd724 138
suupen 2:4d9aee0bd724 139
suupen 2:4d9aee0bd724 140 void MY9221::commandSet(hspd_t hspd, bs_t bs, gck_t gck, sep_t sep, osc_t osc, pol_t pol, cntset_t cntset, onest_t onest)
suupen 2:4d9aee0bd724 141 {
suupen 2:4d9aee0bd724 142
suupen 2:4d9aee0bd724 143 command =
suupen 2:4d9aee0bd724 144 ((hspd << 11) & 0x0400) |
suupen 2:4d9aee0bd724 145 ((bs << 8) & 0x0300) |
suupen 2:4d9aee0bd724 146 ((gck << 5) & 0x0e00) |
suupen 2:4d9aee0bd724 147 ((sep << 4) & 0x0010) |
suupen 2:4d9aee0bd724 148 ((osc << 3) & 0x0008) |
suupen 2:4d9aee0bd724 149 ((pol << 2) & 0x0004) |
suupen 2:4d9aee0bd724 150 ((cntset << 1) & 0x0002) |
suupen 2:4d9aee0bd724 151 ((onest) & 0x0001);
suupen 2:4d9aee0bd724 152
suupen 2:4d9aee0bd724 153 for(int i = 0; i < _number; i++) {
suupen 2:4d9aee0bd724 154 MY9221_data[i].CMD = command;
suupen 2:4d9aee0bd724 155 }
suupen 2:4d9aee0bd724 156 }
suupen 2:4d9aee0bd724 157
suupen 2:4d9aee0bd724 158 void MY9221::dataRawSet(uint16_t *data, uint8_t number)
suupen 1:60440eb16f81 159 {
suupen 1:60440eb16f81 160
suupen 2:4d9aee0bd724 161 uint8_t num = 0;
suupen 1:60440eb16f81 162
suupen 2:4d9aee0bd724 163 if((number > 0) && (number < 11)) {
suupen 2:4d9aee0bd724 164 num = number - 1;
suupen 2:4d9aee0bd724 165 }
suupen 2:4d9aee0bd724 166
suupen 2:4d9aee0bd724 167 MY9221_data[num].D[OUT0].DA = *(data + 0);
suupen 2:4d9aee0bd724 168 MY9221_data[num].D[OUT0].DB = *(data + 1);
suupen 2:4d9aee0bd724 169 MY9221_data[num].D[OUT0].DC = *(data + 2);
suupen 1:60440eb16f81 170
suupen 2:4d9aee0bd724 171 MY9221_data[num].D[OUT1].DA = *(data + 3);
suupen 2:4d9aee0bd724 172 MY9221_data[num].D[OUT1].DB = *(data + 4);
suupen 2:4d9aee0bd724 173 MY9221_data[num].D[OUT1].DC = *(data + 5);
suupen 1:60440eb16f81 174
suupen 2:4d9aee0bd724 175 MY9221_data[num].D[OUT2].DA = *(data + 6);
suupen 2:4d9aee0bd724 176 MY9221_data[num].D[OUT2].DB = *(data + 7);
suupen 2:4d9aee0bd724 177 MY9221_data[num].D[OUT2].DC = *(data + 8);
suupen 1:60440eb16f81 178
suupen 2:4d9aee0bd724 179 MY9221_data[num].D[OUT3].DA = *(data + 9);
suupen 2:4d9aee0bd724 180 MY9221_data[num].D[OUT3].DB = *(data + 10);
suupen 2:4d9aee0bd724 181 MY9221_data[num].D[OUT3].DC = *(data + 11);
suupen 2:4d9aee0bd724 182
suupen 2:4d9aee0bd724 183 // printf("%04x %04x %04x %04x ",MY9221_data[num].CMD, 0, *(data + 0), MY9221_data[num].D[OUT0].DA);
suupen 2:4d9aee0bd724 184
suupen 1:60440eb16f81 185 }
suupen 1:60440eb16f81 186
suupen 2:4d9aee0bd724 187 void MY9221::dataSet(float *data, uint8_t number)
suupen 1:60440eb16f81 188 {
suupen 2:4d9aee0bd724 189 uint16_t bit = (command >> 8 ) & 0x0003;
suupen 2:4d9aee0bd724 190 uint16_t bias;
suupen 1:60440eb16f81 191
suupen 2:4d9aee0bd724 192 uint8_t num = 0;
suupen 1:60440eb16f81 193
suupen 2:4d9aee0bd724 194 if((number > 0) && (number < 11)) {
suupen 2:4d9aee0bd724 195 num = number - 1;
suupen 2:4d9aee0bd724 196 }
suupen 1:60440eb16f81 197
suupen 2:4d9aee0bd724 198 switch(bit){
suupen 2:4d9aee0bd724 199 case MY9221::bit8:
suupen 2:4d9aee0bd724 200 bias = 0x00ff;
suupen 2:4d9aee0bd724 201 break;
suupen 2:4d9aee0bd724 202 case MY9221::bit12:
suupen 2:4d9aee0bd724 203 bias = 0x0fff;
suupen 2:4d9aee0bd724 204 break;
suupen 2:4d9aee0bd724 205 case MY9221::bit14:
suupen 2:4d9aee0bd724 206 bias = 0x3fff;
suupen 2:4d9aee0bd724 207 break;
suupen 2:4d9aee0bd724 208 case MY9221::bit16:
suupen 2:4d9aee0bd724 209 bias = 0xffff;
suupen 2:4d9aee0bd724 210 break;
suupen 2:4d9aee0bd724 211 default:
suupen 2:4d9aee0bd724 212 bias = 0x00ff;
suupen 2:4d9aee0bd724 213 break;
suupen 2:4d9aee0bd724 214 }
suupen 1:60440eb16f81 215
suupen 2:4d9aee0bd724 216 MY9221_data[num].D[OUT0].DA = (uint16_t)(*(data + 0) * bias);
suupen 2:4d9aee0bd724 217 MY9221_data[num].D[OUT0].DB = (uint16_t)(*(data + 1) * bias);
suupen 2:4d9aee0bd724 218 MY9221_data[num].D[OUT0].DC = (uint16_t)(*(data + 2) * bias);
suupen 2:4d9aee0bd724 219
suupen 2:4d9aee0bd724 220 MY9221_data[num].D[OUT1].DA = (uint16_t)(*(data + 3) * bias);
suupen 2:4d9aee0bd724 221 MY9221_data[num].D[OUT1].DB = (uint16_t)(*(data + 4) * bias);
suupen 2:4d9aee0bd724 222 MY9221_data[num].D[OUT1].DC = (uint16_t)(*(data + 5) * bias);
suupen 1:60440eb16f81 223
suupen 2:4d9aee0bd724 224 MY9221_data[num].D[OUT2].DA = (uint16_t)(*(data + 6) * bias);
suupen 2:4d9aee0bd724 225 MY9221_data[num].D[OUT2].DB = (uint16_t)(*(data + 7) * bias);
suupen 2:4d9aee0bd724 226 MY9221_data[num].D[OUT2].DC = (uint16_t)(*(data + 8) * bias);
suupen 1:60440eb16f81 227
suupen 2:4d9aee0bd724 228 MY9221_data[num].D[OUT3].DA = (uint16_t)(*(data + 9) * bias);
suupen 2:4d9aee0bd724 229 MY9221_data[num].D[OUT3].DB = (uint16_t)(*(data + 10) * bias);
suupen 2:4d9aee0bd724 230 MY9221_data[num].D[OUT3].DC = (uint16_t)(*(data + 11) * bias);
suupen 2:4d9aee0bd724 231
suupen 2:4d9aee0bd724 232 // printf("%04x %04x %f %04x\r\n",MY9221_data[num].CMD, bias, *(data + 0), MY9221_data[num].D[OUT0].DA);
suupen 1:60440eb16f81 233
suupen 1:60440eb16f81 234 }
suupen 2:4d9aee0bd724 235
suupen 2:4d9aee0bd724 236 void MY9221::refresh(void){
suupen 2:4d9aee0bd724 237
suupen 2:4d9aee0bd724 238 sendBrock(MY9221_data);
suupen 2:4d9aee0bd724 239 }