suu pen
/
Library_MY9221
12-Channel LED Driver With Gray scale Adaptive Pulse Density Modulation Control IC maker MY-Semi
Diff: main.cpp
- Revision:
- 0:104d4c4514b8
- Child:
- 1:caa6335a5b06
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Oct 22 00:22:36 2017 +0000 @@ -0,0 +1,307 @@ +/** + * @section DESCRIPTION + * maker http://www.my-semi.com/content/products/product_mean.aspx?id=9 + * shop http://akizukidenshi.com/catalog/g/gI-09678/ + */ + +/* +MY9366 +http://www.my-semi.com/content/products/product_mean.aspx?id=28 +*/ +#define LIBMY9221 + +#include "mbed.h" + +#ifdef LIBMY9221 +#include "MY9221.h" +MY9221 MY9221(p5, p10, 1); // di, clk, number +#else +DigitalOut DCKI (p10); // clk +DigitalOut DI(p5); + +//========================= +// command data description +//========================= +// 0x0000にクリアした上で、下記の定義をorしていく + +// CMD[10] 0000 0x00 0000 0000 lout Tr/Tf select +#define LOUT_SLOW_MODE (0x0000) +#define LOUT_FAST_MODE (0x0400) + +// 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) + +// CMD[7:5] 0000 0000 xxx0 0000 Internal oscillator freq select +#define ORIGINAL_FREQ1 (0x0000) +#define ORIGINAL_FREQ2 (0x0020) +#define ORIGINAL_FREQ4 (0x0040) +#define ORIGINAL_FREQ8 (0x0060) +#define ORIGINAL_FREQ16 (0x0080) +#define ORIGINAL_FREQ64 (0x00a0) +#define ORIGINAL_FREQ128 (0x00c0) +#define ORIGINAL_FREQ256 (0x00e0) + +// CMD[4] 0000 0000 000x 0000 Output waveform select +#define WAVE_MYPWM (0x0000) // Only Grayscale = 8bit +#define WAVE_APDM (0x0010) + +// CMD[3] 0000 0000 0000 x000 Grayscale clock source select +#define GCLOCK_INTERNAL (0x0000) +#define GCLOCK_EXTERNAL (0x0008) + +// CMD[2] 0000 0000 0000 0x00 Output polarity select +#define WORK_LED (0x0000) +#define WORK_MYPWM (0x0004) + +// CMD[1] 0000 0000 0000 00x0 Counter reset select +#define COUNTER_FREE (0x0000) +#define COUNTER_RESET (0x0002) + +// CMD[0] 0000 0000 0000 000x One-shot select +#define SHOT_REPEAT (0x0000) +#define SHOT_SHOT (0x0001) + +// commandData_t D[]の配列番号 +// MY9221のOUTxの番号と配列番号をあわせるための定義 +#define OUT3 (0) +#define OUT2 (1) +#define OUT1 (2) +#define OUT0 (3) + +//========================= +// MY9221 command data 定義 +//========================= +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; + + +commandData_t MY9221_data[1] = { + + 0x0000, // CMD + + 0xffff, // DA3; + 0xffff, // DB3; + 0xffff, // DC3; + + 0x00ff, // DA2; + 0x00ff, // DB2; + 0x00ff, // DC2; + + 0x000f, // DA1; + 0x000f, // DB1; + 0x000f, // DC1; + + 0x0000, // DA0; + 0x0000, // DB0; + 0x0000 // DC0; + +}; + +/** send one word data + * @param uint16_t data : send data + * @param return none + */ +void sendWord(uint16_t data) +{ + uint16_t temp = data; + uint8_t count = 8; + + __disable_irq(); // 禁止 + DCKI = 0; + wait_us(1); + + do { + + DI = ((temp & 0x8000) == 0x8000) ? 1 : 0; + temp <<= 1; + wait_us(1); + + DCKI = 1; + wait_us(1); + + DI = ((temp & 0x8000) == 0x8000) ? 1 : 0; + temp <<= 1; + wait_us(1); + + DCKI = 0; + wait_us(1); + + } while(--count > 0); + + DI = 0; + DCKI = 0; + __enable_irq(); // 許可 + +} + +/** data latch & display + * @param none + * @param return none + */ +void latch(void) +{ + __disable_irq(); // 禁止 + + DCKI = 0; + wait_us(1); + + DI = 1; + wait_us(1); + DI = 0; + wait_us(1); + + DI = 1; + wait_us(1); + DI = 0; + wait_us(1); + + DI = 1; + wait_us(1); + DI = 0; + wait_us(1); + + DI = 1; + wait_us(1); + DI = 0; + wait_us(1); + + + DCKI = 0; + __enable_irq(); // 許可 + +} + +/** 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) +{ + 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[1].DA); + sendWord((data + i)->D[1].DB); + sendWord((data + i)->D[1].DC); + + sendWord((data + i)->D[2].DA); + sendWord((data + i)->D[2].DB); + sendWord((data + i)->D[2].DC); + + sendWord((data + i)->D[3].DA); + sendWord((data + i)->D[3].DB); + sendWord((data + i)->D[3].DC); + } + + latch(); +} + +DigitalOut myled(LED1); +#endif + + +#ifndef LIBMY9221 +int main() +{ + + uint16_t temp[12]; + +MY9221_data[0].CMD = 0; + + MY9221_data[0].CMD = LOUT_FAST_MODE + | GRAYSCALE_16BIT + | ORIGINAL_FREQ1 + | WAVE_APDM + | GCLOCK_INTERNAL + | WORK_LED + | COUNTER_FREE + | SHOT_REPEAT; + + + for(uint8_t i=0; i < 12; i++){ + temp[i] = i * 0x0100; + } + + while(1) { + + sendBrock(MY9221_data, 1); + + for(uint8_t i=0; i < 12; i++){ + temp[i] += 0x100; + if(temp[i] == 0){temp[i] = 1;} +} + printf("%04x %04x %04x\r\n",MY9221_data[0].CMD, temp[0], temp[1]); + + MY9221_data[0].D[OUT3].DA = temp[0]; + MY9221_data[0].D[OUT3].DB = 0;//temp[1]; + MY9221_data[0].D[OUT3].DC = 0;//temp[2]; + + MY9221_data[0].D[OUT2].DA = 0;//temp[3]; + MY9221_data[0].D[OUT2].DB = temp[4]; + MY9221_data[0].D[OUT2].DC = 0;//temp[5]; + + myled = 1; + + MY9221_data[0].D[OUT1].DA = 0;//temp[6]; + MY9221_data[0].D[OUT1].DB = 0;//temp[7]; + MY9221_data[0].D[OUT1].DC = temp[8]; + + MY9221_data[0].D[OUT0].DA = temp[9]; + MY9221_data[0].D[OUT0].DB = 0;//temp[10]; + MY9221_data[0].D[OUT0].DC = temp[11]; + +/* + tempA++; + tempB++; + tempC++; + + MY9221_data[0].D[OUT3].DA = tempA; + MY9221_data[0].D[OUT3].DB = tempA; + MY9221_data[0].D[OUT3].DC = tempA; + + MY9221_data[0].D[OUT2].DA = tempA; + MY9221_data[0].D[OUT2].DB = tempA; + MY9221_data[0].D[OUT2].DC = tempA; + + myled = 1; + + MY9221_data[0].D[OUT1].DA = tempA; + MY9221_data[0].D[OUT1].DB = tempA; + MY9221_data[0].D[OUT1].DC = tempA; + + MY9221_data[0].D[OUT0].DA = tempA; + MY9221_data[0].D[OUT0].DB = tempA; + MY9221_data[0].D[OUT0].DC = tempA; +*/ +// wait(0.1); + myled = 0; +// wait(0.2); + } +} +#else +int main() +{ + MY9221.initialTest(); + while(1){ + MY9221.test(); + } +} +#endif