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

Dependents:   Library_MY9221

Files at this revision

API Documentation at this revision

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