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

Dependencies:   MY9221 mbed

main.cpp

Committer:
suupen
Date:
2017-10-22
Revision:
0:104d4c4514b8
Child:
1:caa6335a5b06

File content as of revision 0:104d4c4514b8:

/**
 * @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