12-Channel LED Driver With Gray scale Adaptive Pulse Density Modulation Control IC Library. maker MY-Semi
Revision 2:4d9aee0bd724, committed 2017-10-22
- Comitter:
- suupen
- Date:
- Sun Oct 22 12:08:22 2017 +0000
- Parent:
- 1:60440eb16f81
- Child:
- 3:2131a24e5489
- Commit message:
- ??????
Changed in this revision
MY9221.cpp | Show annotated file Show diff for this revision Revisions of this file |
MY9221.h | Show annotated file Show diff for this revision Revisions of this file |
--- 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); +}
--- a/MY9221.h Sun Oct 22 00:22:18 2017 +0000 +++ b/MY9221.h Sun Oct 22 12:08:22 2017 +0000 @@ -1,6 +1,6 @@ #ifndef MBED_MY9221_H #define MBED_MY9221_H - + #include "mbed.h" #include "MY9221.h" @@ -16,9 +16,9 @@ */ class MY9221 { - + public: - + /** Create a MY9221 port, connected to the specified IC pins * @param DI pin * @param DCKI pin @@ -26,7 +26,7 @@ * @note nothing */ MY9221(PinName di, PinName dcki, uint8_t number); - + //========================= // command data description @@ -37,12 +37,24 @@ #define LOUT_SLOW_MODE (0x0000) #define LOUT_FAST_MODE (0x0400) + enum hspd_t { + slow = 0, + fast + }; + // CMD[9:8] 0000 00xx 0000 0000 Gryascale resolution select #define GRAYSCALE_8BIT (0x0000) #define GRAYSCALE_12BIT (0x0100) #define GRAYSCALE_14BIT (0x0200) #define GRAYSCALE_16BIT (0x0300) + enum bs_t { + bit8 = 0, + bit12, + bit14, + bit16 + }; + // CMD[7:5] 0000 0000 xxx0 0000 Internal oscillator freq select #define ORIGINAL_FREQ1 (0x0000) #define ORIGINAL_FREQ2 (0x0020) @@ -53,26 +65,66 @@ #define ORIGINAL_FREQ128 (0x00c0) #define ORIGINAL_FREQ256 (0x00e0) + enum gck_t { + freq1 = 0, + freq2, + freq4, + freq8, + freq16, + freq64, + freq128, + freq256 + }; + // CMD[4] 0000 0000 000x 0000 Output waveform select #define WAVE_MYPWM (0x0000) // Only Grayscale = 8bit #define WAVE_APDM (0x0010) + enum sep_t { + waveMypwm = 0, + waveApdm + }; + + // CMD[3] 0000 0000 0000 x000 Grayscale clock source select #define GCLOCK_INTERNAL (0x0000) #define GCLOCK_EXTERNAL (0x0008) + enum osc_t { + internal = 0, + external + }; + // CMD[2] 0000 0000 0000 0x00 Output polarity select #define WORK_LED (0x0000) #define WORK_MYPWM (0x0004) + enum pol_t { + workLed = 0, + workMypwm + }; + // CMD[1] 0000 0000 0000 00x0 Counter reset select #define COUNTER_FREE (0x0000) #define COUNTER_RESET (0x0002) + enum cntset_t { + free = 0, + reset + }; + // CMD[0] 0000 0000 0000 000x One-shot select #define SHOT_REPEAT (0x0000) #define SHOT_SHOT (0x0001) + enum onest_t { + repeat = 0, + shot + }; + + + + // commandData_t D[]の配列番号 // MY9221のOUTxの番号と配列番号をあわせるための定義 #define OUT3 (0) @@ -83,43 +135,68 @@ //========================= // MY9221 command data 定義 //========================= -typedef struct { - uint16_t DA; - uint16_t DB; - uint16_t DC; -} dataSet_t; + typedef struct { + uint16_t DA; + uint16_t DB; + uint16_t DC; + } dataSet_t; + + typedef struct { + uint16_t CMD; + dataSet_t D[4]; // [0]:OUT3 [1]:OUT2 [2]:OUT1 [3]:OUT0 + } commandData_t; -typedef struct { - uint16_t CMD; - dataSet_t D[4]; // [0]:OUT3 [1]:OUT2 [2]:OUT1 [3]:OUT0 -} commandData_t; + /** command raw set + * @param uint16_t hardware manual 16-bit COmmand Data Description CMD[15:0] = D[207:192] + */ + void commandRawSet(uint16_t command); + + /** command nomalization set + * @param hspd_t hspd fast, slow + * @param bs_t bs bit8, bit12, bit14, bit16 + * @param gck_t gck freq1, freq2, freq4, freq8, freq16, freq64, freq128, freq256 + * @param sep_t sep waveMypwm, waveApdm + * @param osc_t osc internal, external + * @param pol_t pol workLed, workMypwm + * @param cntset_t cntset free, reset + * @param onest_t onest repeat, shot + */ + void 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); -void initialTest(void); -void test(void); + /** gray data set + * @param uint16_t *data [0]=OUTA[0], [1]=OUTB[0], [2]=OUTC[0], ... [9]=OUTA[3], [10]=OUTB[3], [11]=OUTC[3] + * @param uint8_t number MY9221 number (1 to 10) + */ + void dataRawSet(uint16_t *data, uint8_t number); + void dataSet(float *data, uint8_t number); + /** MY9221 send data and latch + * + */ + void refresh(void); //---------------------------------------------------------- private: - -/** send one word data - * @param uint16_t data : send data - * @param return none - */ -void sendWord(uint16_t data); + + /** send one word data + * @param uint16_t data : send data + * @param return none + */ + void sendWord(uint16_t data); -/** data latch & display - * @param none - * @param return none - */ -void latch(void); + /** data latch & display + * @param none + * @param return none + */ + void latch(void); -/** send brock data - * @param commandData_t *data : MY9221 Data - * @param uint8_t number : connection number (min=1) - * @param none - */ -void sendBrock(commandData_t *data, uint8_t number); + /** send brock data + * @param commandData_t *data : MY9221 Data + * @param uint8_t number : connection number (min=1) + * @param none + */ + void sendBrock(commandData_t *data); @@ -130,11 +207,12 @@ DigitalOut _dcki; int8_t _number; + uint16_t command; commandData_t MY9221_data[10];//_number]; - + }; -#undef _MY9221_C +//#undef _MY9221_C #endif // MBED_PCA9547_H \ No newline at end of file