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

Dependents:   Library_MY9221

MY9221.cpp

Committer:
suupen
Date:
2017-10-22
Revision:
1:60440eb16f81
Parent:
0:3a18655ada14
Child:
2:4d9aee0bd724

File content as of revision 1:60440eb16f81:

/**
 * MY9221 Library
 */
#define _MY9221_C

#include "mbed.h"
#include "MY9221.h"

/**
 *
 */
MY9221::MY9221(PinName di, PinName dcki, uint8_t number
              ) : _di(di), _dcki(dcki), _number(number)
{

    // 変数初期化 ,マイコン機能の設定
    _di = 0;
    _dcki = 0;


}

/** send one word data
 * @param uint16_t data : send data
 * @param return none
 */
void MY9221::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 MY9221::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 MY9221::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();
}

void MY9221::initialTest(void)
{

    MY9221::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;

    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[0].D[OUT2].DA = 0x0200;
    MY9221_data[0].D[OUT2].DB = 0x0400;
    MY9221_data[0].D[OUT2].DC = 0x0800;

    MY9221_data[0].D[OUT3].DA = 0x2000;
    MY9221_data[0].D[OUT3].DB = 0x4000;
    MY9221_data[0].D[OUT3].DC = 0x8000;
}

void MY9221::test(void)
{

    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[0].D[OUT2].DA += 0x0200;
    MY9221_data[0].D[OUT2].DB += 0x0400;
    MY9221_data[0].D[OUT2].DC += 0x0800;

    MY9221_data[0].D[OUT3].DA += 0x2000;
    MY9221_data[0].D[OUT3].DB += 0x4000;
    MY9221_data[0].D[OUT3].DC += 0x8000;


    sendBrock(MY9221_data, 1);

}