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 22:59:19 2017 +0000
Revision:
3:2131a24e5489
Parent:
2:4d9aee0bd724
Completion;

Who changed what in which revision?

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