12-Channel LED Driver With Gray scale Adaptive Pulse Density Modulation Control IC maker MY-Semi

Dependencies:   MY9221 mbed

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