12-Channel LED Driver With Gray scale Adaptive Pulse Density Modulation Control IC Library. maker MY-Semi
Diff: MY9221.cpp
- Revision:
- 2:4d9aee0bd724
- Parent:
- 1:60440eb16f81
- Child:
- 3:2131a24e5489
--- a/MY9221.cpp Sun Oct 22 00:22:18 2017 +0000 +++ b/MY9221.cpp Sun Oct 22 12:08:22 2017 +0000 @@ -16,6 +16,9 @@ // 変数初期化 ,マイコン機能の設定 _di = 0; _dcki = 0; + + command = 0x0000; + commandRawSet(command); } @@ -99,83 +102,138 @@ * @param uint8_t number : connection number (min=1) * @param none */ -void MY9221::sendBrock(commandData_t *data, uint8_t number) +void MY9221::sendBrock(commandData_t *data) { - for(uint8_t i = 0; i < number; i++) { + for(uint8_t i = 0; i < _number; i++) { sendWord((data + i)->CMD); - sendWord((data + i)->D[0].DA); - sendWord((data + i)->D[0].DB); - sendWord((data + i)->D[0].DC); + sendWord((data + i)->D[OUT3].DA); + sendWord((data + i)->D[OUT3].DB); + sendWord((data + i)->D[OUT3].DC); - sendWord((data + i)->D[1].DA); - sendWord((data + i)->D[1].DB); - sendWord((data + i)->D[1].DC); + sendWord((data + i)->D[OUT2].DA); + sendWord((data + i)->D[OUT2].DB); + sendWord((data + i)->D[OUT2].DC); - sendWord((data + i)->D[2].DA); - sendWord((data + i)->D[2].DB); - sendWord((data + i)->D[2].DC); + sendWord((data + i)->D[OUT1].DA); + sendWord((data + i)->D[OUT1].DB); + sendWord((data + i)->D[OUT1].DC); - sendWord((data + i)->D[3].DA); - sendWord((data + i)->D[3].DB); - sendWord((data + i)->D[3].DC); + sendWord((data + i)->D[OUT0].DA); + sendWord((data + i)->D[OUT0].DB); + sendWord((data + i)->D[OUT0].DC); } latch(); } -void MY9221::initialTest(void) + +void MY9221::commandRawSet(uint16_t command) +{ + for(int i = 0; i < _number; i++) { + MY9221_data[i].CMD = command; + } +} + + +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) +{ + + command = + ((hspd << 11) & 0x0400) | + ((bs << 8) & 0x0300) | + ((gck << 5) & 0x0e00) | + ((sep << 4) & 0x0010) | + ((osc << 3) & 0x0008) | + ((pol << 2) & 0x0004) | + ((cntset << 1) & 0x0002) | + ((onest) & 0x0001); + + for(int i = 0; i < _number; i++) { + MY9221_data[i].CMD = command; + } +} + +void MY9221::dataRawSet(uint16_t *data, uint8_t number) { - MY9221::MY9221_data[0].CMD = 0; + uint8_t num = 0; - MY9221_data[0].CMD = LOUT_FAST_MODE - | GRAYSCALE_16BIT - | ORIGINAL_FREQ1 - | WAVE_APDM - | GCLOCK_INTERNAL - | WORK_LED - | COUNTER_FREE - | SHOT_REPEAT; + if((number > 0) && (number < 11)) { + num = number - 1; + } + + MY9221_data[num].D[OUT0].DA = *(data + 0); + MY9221_data[num].D[OUT0].DB = *(data + 1); + MY9221_data[num].D[OUT0].DC = *(data + 2); - MY9221_data[0].D[OUT0].DA = 0x0002; - MY9221_data[0].D[OUT0].DB = 0x0004; - MY9221_data[0].D[OUT0].DC = 0x0008; - - MY9221_data[0].D[OUT1].DA = 0x0020; - MY9221_data[0].D[OUT1].DB = 0x0040; - MY9221_data[0].D[OUT1].DC = 0x0080; + MY9221_data[num].D[OUT1].DA = *(data + 3); + MY9221_data[num].D[OUT1].DB = *(data + 4); + MY9221_data[num].D[OUT1].DC = *(data + 5); - MY9221_data[0].D[OUT2].DA = 0x0200; - MY9221_data[0].D[OUT2].DB = 0x0400; - MY9221_data[0].D[OUT2].DC = 0x0800; + MY9221_data[num].D[OUT2].DA = *(data + 6); + MY9221_data[num].D[OUT2].DB = *(data + 7); + MY9221_data[num].D[OUT2].DC = *(data + 8); - MY9221_data[0].D[OUT3].DA = 0x2000; - MY9221_data[0].D[OUT3].DB = 0x4000; - MY9221_data[0].D[OUT3].DC = 0x8000; + MY9221_data[num].D[OUT3].DA = *(data + 9); + MY9221_data[num].D[OUT3].DB = *(data + 10); + MY9221_data[num].D[OUT3].DC = *(data + 11); + +// printf("%04x %04x %04x %04x ",MY9221_data[num].CMD, 0, *(data + 0), MY9221_data[num].D[OUT0].DA); + } -void MY9221::test(void) +void MY9221::dataSet(float *data, uint8_t number) { + uint16_t bit = (command >> 8 ) & 0x0003; + uint16_t bias; - MY9221_data[0].D[OUT0].DA += 0x0002; - MY9221_data[0].D[OUT0].DB += 0x0004; - MY9221_data[0].D[OUT0].DC += 0x0008; + uint8_t num = 0; - MY9221_data[0].D[OUT1].DA += 0x0020; - MY9221_data[0].D[OUT1].DB += 0x0040; - MY9221_data[0].D[OUT1].DC += 0x0080; + if((number > 0) && (number < 11)) { + num = number - 1; + } - MY9221_data[0].D[OUT2].DA += 0x0200; - MY9221_data[0].D[OUT2].DB += 0x0400; - MY9221_data[0].D[OUT2].DC += 0x0800; + switch(bit){ + case MY9221::bit8: + bias = 0x00ff; + break; + case MY9221::bit12: + bias = 0x0fff; + break; + case MY9221::bit14: + bias = 0x3fff; + break; + case MY9221::bit16: + bias = 0xffff; + break; + default: + bias = 0x00ff; + break; + } - MY9221_data[0].D[OUT3].DA += 0x2000; - MY9221_data[0].D[OUT3].DB += 0x4000; - MY9221_data[0].D[OUT3].DC += 0x8000; + MY9221_data[num].D[OUT0].DA = (uint16_t)(*(data + 0) * bias); + MY9221_data[num].D[OUT0].DB = (uint16_t)(*(data + 1) * bias); + MY9221_data[num].D[OUT0].DC = (uint16_t)(*(data + 2) * bias); + + MY9221_data[num].D[OUT1].DA = (uint16_t)(*(data + 3) * bias); + MY9221_data[num].D[OUT1].DB = (uint16_t)(*(data + 4) * bias); + MY9221_data[num].D[OUT1].DC = (uint16_t)(*(data + 5) * bias); + MY9221_data[num].D[OUT2].DA = (uint16_t)(*(data + 6) * bias); + MY9221_data[num].D[OUT2].DB = (uint16_t)(*(data + 7) * bias); + MY9221_data[num].D[OUT2].DC = (uint16_t)(*(data + 8) * bias); - sendBrock(MY9221_data, 1); + MY9221_data[num].D[OUT3].DA = (uint16_t)(*(data + 9) * bias); + MY9221_data[num].D[OUT3].DB = (uint16_t)(*(data + 10) * bias); + MY9221_data[num].D[OUT3].DC = (uint16_t)(*(data + 11) * bias); + +// printf("%04x %04x %f %04x\r\n",MY9221_data[num].CMD, bias, *(data + 0), MY9221_data[num].D[OUT0].DA); } + +void MY9221::refresh(void){ + + sendBrock(MY9221_data); +}