12-Channel LED Driver With Gray scale Adaptive Pulse Density Modulation Control IC Library. maker MY-Semi
MY9221.h@3:2131a24e5489, 2017-10-22 (annotated)
- Committer:
- suupen
- Date:
- Sun Oct 22 22:59:19 2017 +0000
- Revision:
- 3:2131a24e5489
- Parent:
- 2:4d9aee0bd724
Completion;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
suupen | 0:3a18655ada14 | 1 | #ifndef MBED_MY9221_H |
suupen | 0:3a18655ada14 | 2 | #define MBED_MY9221_H |
suupen | 2:4d9aee0bd724 | 3 | |
suupen | 3:2131a24e5489 | 4 | /** |
suupen | 3:2131a24e5489 | 5 | * MY9221 Library |
suupen | 3:2131a24e5489 | 6 | * IC name : MY9221 |
suupen | 3:2131a24e5489 | 7 | * maker : http://www.my-semi.com/content/products/product_mean.aspx?id=4 |
suupen | 3:2131a24e5489 | 8 | * 12-Channel LED Driver With Grayscale Adaptive Pulse Density Modulation Control |
suupen | 3:2131a24e5489 | 9 | * data sheet : http://akizukidenshi.com/download/ds/mysemi/MY9221_DS1_0.pdf |
suupen | 3:2131a24e5489 | 10 | */ |
suupen | 3:2131a24e5489 | 11 | |
suupen | 3:2131a24e5489 | 12 | /** Example |
suupen | 3:2131a24e5489 | 13 | * @code |
suupen | 3:2131a24e5489 | 14 | * #include "mbed.h" |
suupen | 3:2131a24e5489 | 15 | *#include "MY9221.h" |
suupen | 3:2131a24e5489 | 16 | *MY9221 MY9221(p5, p10, 2); // di, clk, number |
suupen | 3:2131a24e5489 | 17 | * |
suupen | 3:2131a24e5489 | 18 | *uint16_t D_gray[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; |
suupen | 3:2131a24e5489 | 19 | *float D_gray2[12] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; |
suupen | 3:2131a24e5489 | 20 | * |
suupen | 3:2131a24e5489 | 21 | *int main() |
suupen | 3:2131a24e5489 | 22 | *{ |
suupen | 3:2131a24e5489 | 23 | * |
suupen | 3:2131a24e5489 | 24 | * MY9221.commandSet(MY9221::fast, MY9221::bit16, MY9221::freq1, MY9221::waveApdm, MY9221::internal, MY9221::workLed, MY9221::free, MY9221::repeat); |
suupen | 3:2131a24e5489 | 25 | * |
suupen | 3:2131a24e5489 | 26 | * |
suupen | 3:2131a24e5489 | 27 | * while(1) { |
suupen | 3:2131a24e5489 | 28 | * |
suupen | 3:2131a24e5489 | 29 | * for(int i=0; i < 12; i++) { |
suupen | 3:2131a24e5489 | 30 | * D_gray[i] += 0x100; |
suupen | 3:2131a24e5489 | 31 | * D_gray2[i] += 0.01; |
suupen | 3:2131a24e5489 | 32 | * if(D_gray2[i] > 1)D_gray2[i] = 0; |
suupen | 3:2131a24e5489 | 33 | * } |
suupen | 3:2131a24e5489 | 34 | * MY9221.dataRawSet(D_gray, 1); |
suupen | 3:2131a24e5489 | 35 | * MY9221.dataSet(D_gray2, 2); |
suupen | 3:2131a24e5489 | 36 | * wait_ms(20); // Image refresh Rate [s] < led gray data update cycle [s] |
suupen | 3:2131a24e5489 | 37 | * MY9221.refresh(); |
suupen | 3:2131a24e5489 | 38 | * |
suupen | 3:2131a24e5489 | 39 | * } |
suupen | 3:2131a24e5489 | 40 | *} |
suupen | 3:2131a24e5489 | 41 | * @endcode |
suupen | 3:2131a24e5489 | 42 | */ |
suupen | 3:2131a24e5489 | 43 | |
suupen | 3:2131a24e5489 | 44 | |
suupen | 0:3a18655ada14 | 45 | #include "mbed.h" |
suupen | 0:3a18655ada14 | 46 | #include "MY9221.h" |
suupen | 0:3a18655ada14 | 47 | |
suupen | 0:3a18655ada14 | 48 | |
suupen | 0:3a18655ada14 | 49 | |
suupen | 0:3a18655ada14 | 50 | /** |
suupen | 0:3a18655ada14 | 51 | * @class MY9221 |
suupen | 0:3a18655ada14 | 52 | * @brief nothine |
suupen | 0:3a18655ada14 | 53 | */ |
suupen | 0:3a18655ada14 | 54 | class MY9221 |
suupen | 0:3a18655ada14 | 55 | { |
suupen | 2:4d9aee0bd724 | 56 | |
suupen | 0:3a18655ada14 | 57 | public: |
suupen | 2:4d9aee0bd724 | 58 | |
suupen | 0:3a18655ada14 | 59 | /** Create a MY9221 port, connected to the specified IC pins |
suupen | 0:3a18655ada14 | 60 | * @param DI pin |
suupen | 0:3a18655ada14 | 61 | * @param DCKI pin |
suupen | 0:3a18655ada14 | 62 | * @param IC serial connection number :min = 1(default) |
suupen | 0:3a18655ada14 | 63 | * @note nothing |
suupen | 0:3a18655ada14 | 64 | */ |
suupen | 1:60440eb16f81 | 65 | MY9221(PinName di, PinName dcki, uint8_t number); |
suupen | 2:4d9aee0bd724 | 66 | |
suupen | 0:3a18655ada14 | 67 | |
suupen | 0:3a18655ada14 | 68 | //========================= |
suupen | 0:3a18655ada14 | 69 | // command data description |
suupen | 0:3a18655ada14 | 70 | //========================= |
suupen | 0:3a18655ada14 | 71 | // 0x0000にクリアした上で、下記の定義をorしていく |
suupen | 0:3a18655ada14 | 72 | |
suupen | 0:3a18655ada14 | 73 | // CMD[10] 0000 0x00 0000 0000 lout Tr/Tf select |
suupen | 0:3a18655ada14 | 74 | #define LOUT_SLOW_MODE (0x0000) |
suupen | 0:3a18655ada14 | 75 | #define LOUT_FAST_MODE (0x0400) |
suupen | 0:3a18655ada14 | 76 | |
suupen | 2:4d9aee0bd724 | 77 | enum hspd_t { |
suupen | 2:4d9aee0bd724 | 78 | slow = 0, |
suupen | 2:4d9aee0bd724 | 79 | fast |
suupen | 2:4d9aee0bd724 | 80 | }; |
suupen | 2:4d9aee0bd724 | 81 | |
suupen | 0:3a18655ada14 | 82 | // CMD[9:8] 0000 00xx 0000 0000 Gryascale resolution select |
suupen | 0:3a18655ada14 | 83 | #define GRAYSCALE_8BIT (0x0000) |
suupen | 0:3a18655ada14 | 84 | #define GRAYSCALE_12BIT (0x0100) |
suupen | 0:3a18655ada14 | 85 | #define GRAYSCALE_14BIT (0x0200) |
suupen | 0:3a18655ada14 | 86 | #define GRAYSCALE_16BIT (0x0300) |
suupen | 0:3a18655ada14 | 87 | |
suupen | 2:4d9aee0bd724 | 88 | enum bs_t { |
suupen | 2:4d9aee0bd724 | 89 | bit8 = 0, |
suupen | 2:4d9aee0bd724 | 90 | bit12, |
suupen | 2:4d9aee0bd724 | 91 | bit14, |
suupen | 2:4d9aee0bd724 | 92 | bit16 |
suupen | 2:4d9aee0bd724 | 93 | }; |
suupen | 2:4d9aee0bd724 | 94 | |
suupen | 0:3a18655ada14 | 95 | // CMD[7:5] 0000 0000 xxx0 0000 Internal oscillator freq select |
suupen | 0:3a18655ada14 | 96 | #define ORIGINAL_FREQ1 (0x0000) |
suupen | 0:3a18655ada14 | 97 | #define ORIGINAL_FREQ2 (0x0020) |
suupen | 0:3a18655ada14 | 98 | #define ORIGINAL_FREQ4 (0x0040) |
suupen | 0:3a18655ada14 | 99 | #define ORIGINAL_FREQ8 (0x0060) |
suupen | 0:3a18655ada14 | 100 | #define ORIGINAL_FREQ16 (0x0080) |
suupen | 0:3a18655ada14 | 101 | #define ORIGINAL_FREQ64 (0x00a0) |
suupen | 0:3a18655ada14 | 102 | #define ORIGINAL_FREQ128 (0x00c0) |
suupen | 0:3a18655ada14 | 103 | #define ORIGINAL_FREQ256 (0x00e0) |
suupen | 0:3a18655ada14 | 104 | |
suupen | 2:4d9aee0bd724 | 105 | enum gck_t { |
suupen | 2:4d9aee0bd724 | 106 | freq1 = 0, |
suupen | 2:4d9aee0bd724 | 107 | freq2, |
suupen | 2:4d9aee0bd724 | 108 | freq4, |
suupen | 2:4d9aee0bd724 | 109 | freq8, |
suupen | 2:4d9aee0bd724 | 110 | freq16, |
suupen | 2:4d9aee0bd724 | 111 | freq64, |
suupen | 2:4d9aee0bd724 | 112 | freq128, |
suupen | 2:4d9aee0bd724 | 113 | freq256 |
suupen | 2:4d9aee0bd724 | 114 | }; |
suupen | 2:4d9aee0bd724 | 115 | |
suupen | 0:3a18655ada14 | 116 | // CMD[4] 0000 0000 000x 0000 Output waveform select |
suupen | 0:3a18655ada14 | 117 | #define WAVE_MYPWM (0x0000) // Only Grayscale = 8bit |
suupen | 0:3a18655ada14 | 118 | #define WAVE_APDM (0x0010) |
suupen | 0:3a18655ada14 | 119 | |
suupen | 2:4d9aee0bd724 | 120 | enum sep_t { |
suupen | 2:4d9aee0bd724 | 121 | waveMypwm = 0, |
suupen | 2:4d9aee0bd724 | 122 | waveApdm |
suupen | 2:4d9aee0bd724 | 123 | }; |
suupen | 2:4d9aee0bd724 | 124 | |
suupen | 2:4d9aee0bd724 | 125 | |
suupen | 0:3a18655ada14 | 126 | // CMD[3] 0000 0000 0000 x000 Grayscale clock source select |
suupen | 0:3a18655ada14 | 127 | #define GCLOCK_INTERNAL (0x0000) |
suupen | 0:3a18655ada14 | 128 | #define GCLOCK_EXTERNAL (0x0008) |
suupen | 0:3a18655ada14 | 129 | |
suupen | 2:4d9aee0bd724 | 130 | enum osc_t { |
suupen | 2:4d9aee0bd724 | 131 | internal = 0, |
suupen | 2:4d9aee0bd724 | 132 | external |
suupen | 2:4d9aee0bd724 | 133 | }; |
suupen | 2:4d9aee0bd724 | 134 | |
suupen | 0:3a18655ada14 | 135 | // CMD[2] 0000 0000 0000 0x00 Output polarity select |
suupen | 0:3a18655ada14 | 136 | #define WORK_LED (0x0000) |
suupen | 0:3a18655ada14 | 137 | #define WORK_MYPWM (0x0004) |
suupen | 0:3a18655ada14 | 138 | |
suupen | 2:4d9aee0bd724 | 139 | enum pol_t { |
suupen | 2:4d9aee0bd724 | 140 | workLed = 0, |
suupen | 2:4d9aee0bd724 | 141 | workMypwm |
suupen | 2:4d9aee0bd724 | 142 | }; |
suupen | 2:4d9aee0bd724 | 143 | |
suupen | 0:3a18655ada14 | 144 | // CMD[1] 0000 0000 0000 00x0 Counter reset select |
suupen | 0:3a18655ada14 | 145 | #define COUNTER_FREE (0x0000) |
suupen | 0:3a18655ada14 | 146 | #define COUNTER_RESET (0x0002) |
suupen | 0:3a18655ada14 | 147 | |
suupen | 2:4d9aee0bd724 | 148 | enum cntset_t { |
suupen | 2:4d9aee0bd724 | 149 | free = 0, |
suupen | 2:4d9aee0bd724 | 150 | reset |
suupen | 2:4d9aee0bd724 | 151 | }; |
suupen | 2:4d9aee0bd724 | 152 | |
suupen | 0:3a18655ada14 | 153 | // CMD[0] 0000 0000 0000 000x One-shot select |
suupen | 0:3a18655ada14 | 154 | #define SHOT_REPEAT (0x0000) |
suupen | 0:3a18655ada14 | 155 | #define SHOT_SHOT (0x0001) |
suupen | 0:3a18655ada14 | 156 | |
suupen | 2:4d9aee0bd724 | 157 | enum onest_t { |
suupen | 2:4d9aee0bd724 | 158 | repeat = 0, |
suupen | 2:4d9aee0bd724 | 159 | shot |
suupen | 2:4d9aee0bd724 | 160 | }; |
suupen | 2:4d9aee0bd724 | 161 | |
suupen | 2:4d9aee0bd724 | 162 | |
suupen | 2:4d9aee0bd724 | 163 | |
suupen | 2:4d9aee0bd724 | 164 | |
suupen | 0:3a18655ada14 | 165 | // commandData_t D[]の配列番号 |
suupen | 0:3a18655ada14 | 166 | // MY9221のOUTxの番号と配列番号をあわせるための定義 |
suupen | 0:3a18655ada14 | 167 | #define OUT3 (0) |
suupen | 0:3a18655ada14 | 168 | #define OUT2 (1) |
suupen | 0:3a18655ada14 | 169 | #define OUT1 (2) |
suupen | 0:3a18655ada14 | 170 | #define OUT0 (3) |
suupen | 0:3a18655ada14 | 171 | |
suupen | 0:3a18655ada14 | 172 | //========================= |
suupen | 0:3a18655ada14 | 173 | // MY9221 command data 定義 |
suupen | 0:3a18655ada14 | 174 | //========================= |
suupen | 2:4d9aee0bd724 | 175 | typedef struct { |
suupen | 2:4d9aee0bd724 | 176 | uint16_t DA; |
suupen | 2:4d9aee0bd724 | 177 | uint16_t DB; |
suupen | 2:4d9aee0bd724 | 178 | uint16_t DC; |
suupen | 2:4d9aee0bd724 | 179 | } dataSet_t; |
suupen | 2:4d9aee0bd724 | 180 | |
suupen | 2:4d9aee0bd724 | 181 | typedef struct { |
suupen | 2:4d9aee0bd724 | 182 | uint16_t CMD; |
suupen | 2:4d9aee0bd724 | 183 | dataSet_t D[4]; // [0]:OUT3 [1]:OUT2 [2]:OUT1 [3]:OUT0 |
suupen | 2:4d9aee0bd724 | 184 | } commandData_t; |
suupen | 0:3a18655ada14 | 185 | |
suupen | 2:4d9aee0bd724 | 186 | /** command raw set |
suupen | 2:4d9aee0bd724 | 187 | * @param uint16_t hardware manual 16-bit COmmand Data Description CMD[15:0] = D[207:192] |
suupen | 2:4d9aee0bd724 | 188 | */ |
suupen | 2:4d9aee0bd724 | 189 | void commandRawSet(uint16_t command); |
suupen | 3:2131a24e5489 | 190 | |
suupen | 2:4d9aee0bd724 | 191 | /** command nomalization set |
suupen | 2:4d9aee0bd724 | 192 | * @param hspd_t hspd fast, slow |
suupen | 2:4d9aee0bd724 | 193 | * @param bs_t bs bit8, bit12, bit14, bit16 |
suupen | 2:4d9aee0bd724 | 194 | * @param gck_t gck freq1, freq2, freq4, freq8, freq16, freq64, freq128, freq256 |
suupen | 2:4d9aee0bd724 | 195 | * @param sep_t sep waveMypwm, waveApdm |
suupen | 2:4d9aee0bd724 | 196 | * @param osc_t osc internal, external |
suupen | 2:4d9aee0bd724 | 197 | * @param pol_t pol workLed, workMypwm |
suupen | 2:4d9aee0bd724 | 198 | * @param cntset_t cntset free, reset |
suupen | 2:4d9aee0bd724 | 199 | * @param onest_t onest repeat, shot |
suupen | 2:4d9aee0bd724 | 200 | */ |
suupen | 2:4d9aee0bd724 | 201 | 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); |
suupen | 0:3a18655ada14 | 202 | |
suupen | 2:4d9aee0bd724 | 203 | /** gray data set |
suupen | 2:4d9aee0bd724 | 204 | * @param uint16_t *data [0]=OUTA[0], [1]=OUTB[0], [2]=OUTC[0], ... [9]=OUTA[3], [10]=OUTB[3], [11]=OUTC[3] |
suupen | 2:4d9aee0bd724 | 205 | * @param uint8_t number MY9221 number (1 to 10) |
suupen | 2:4d9aee0bd724 | 206 | */ |
suupen | 2:4d9aee0bd724 | 207 | void dataRawSet(uint16_t *data, uint8_t number); |
suupen | 3:2131a24e5489 | 208 | |
suupen | 3:2131a24e5489 | 209 | /** gray data set |
suupen | 3:2131a24e5489 | 210 | * @param float *data (0.0 to 1.0) [0]=OUTA[0], [1]=OUTB[0], [2]=OUTC[0], ... [9]=OUTA[3], [10]=OUTB[3], [11]=OUTC[3] |
suupen | 3:2131a24e5489 | 211 | * @param uint8_t number MY9221 number (1 to 10) |
suupen | 3:2131a24e5489 | 212 | */ |
suupen | 2:4d9aee0bd724 | 213 | void dataSet(float *data, uint8_t number); |
suupen | 0:3a18655ada14 | 214 | |
suupen | 2:4d9aee0bd724 | 215 | /** MY9221 send data and latch |
suupen | 2:4d9aee0bd724 | 216 | * |
suupen | 3:2131a24e5489 | 217 | */ |
suupen | 2:4d9aee0bd724 | 218 | void refresh(void); |
suupen | 0:3a18655ada14 | 219 | |
suupen | 0:3a18655ada14 | 220 | //---------------------------------------------------------- |
suupen | 0:3a18655ada14 | 221 | private: |
suupen | 1:60440eb16f81 | 222 | |
suupen | 2:4d9aee0bd724 | 223 | |
suupen | 2:4d9aee0bd724 | 224 | /** send one word data |
suupen | 2:4d9aee0bd724 | 225 | * @param uint16_t data : send data |
suupen | 2:4d9aee0bd724 | 226 | * @param return none |
suupen | 2:4d9aee0bd724 | 227 | */ |
suupen | 2:4d9aee0bd724 | 228 | void sendWord(uint16_t data); |
suupen | 0:3a18655ada14 | 229 | |
suupen | 2:4d9aee0bd724 | 230 | /** data latch & display |
suupen | 2:4d9aee0bd724 | 231 | * @param none |
suupen | 2:4d9aee0bd724 | 232 | * @param return none |
suupen | 2:4d9aee0bd724 | 233 | */ |
suupen | 2:4d9aee0bd724 | 234 | void latch(void); |
suupen | 0:3a18655ada14 | 235 | |
suupen | 2:4d9aee0bd724 | 236 | /** send brock data |
suupen | 2:4d9aee0bd724 | 237 | * @param commandData_t *data : MY9221 Data |
suupen | 2:4d9aee0bd724 | 238 | * @param uint8_t number : connection number (min=1) |
suupen | 2:4d9aee0bd724 | 239 | * @param none |
suupen | 2:4d9aee0bd724 | 240 | */ |
suupen | 2:4d9aee0bd724 | 241 | void sendBrock(commandData_t *data); |
suupen | 1:60440eb16f81 | 242 | |
suupen | 1:60440eb16f81 | 243 | |
suupen | 1:60440eb16f81 | 244 | |
suupen | 1:60440eb16f81 | 245 | |
suupen | 1:60440eb16f81 | 246 | |
suupen | 1:60440eb16f81 | 247 | |
suupen | 0:3a18655ada14 | 248 | DigitalOut _di; |
suupen | 0:3a18655ada14 | 249 | DigitalOut _dcki; |
suupen | 1:60440eb16f81 | 250 | |
suupen | 0:3a18655ada14 | 251 | int8_t _number; |
suupen | 2:4d9aee0bd724 | 252 | uint16_t command; |
suupen | 1:60440eb16f81 | 253 | |
suupen | 1:60440eb16f81 | 254 | commandData_t MY9221_data[10];//_number]; |
suupen | 1:60440eb16f81 | 255 | |
suupen | 2:4d9aee0bd724 | 256 | |
suupen | 1:60440eb16f81 | 257 | |
suupen | 0:3a18655ada14 | 258 | }; |
suupen | 3:2131a24e5489 | 259 | #endif // MBED_MY9221_H |