Object Model code with hardware support

Dependencies:   mbed

ToshibaTC62D723.cpp

Committer:
bgrissom
Date:
2014-09-05
Revision:
0:2b4bbe9ea495

File content as of revision 0:2b4bbe9ea495:

#include <cstddef>
#include <string.h>
#include "ToshibaTC62D723.hpp"

bool gSpiMode;
SPI* gSpiPtr = NULL;
DigitalOut gbbTRANS(PA_4); // Global bit bang TRANS (data) line

ToshibaTC62D723::ToshibaTC62D723(void)
 : _dataIn(NULL),
   _dataOut(NULL)
{
    memset(_channelBrightness, 0, sizeof(uint16_t) * NUM_CHANNELS);
}

ToshibaTC62D723::~ToshibaTC62D723(void)
{
    // Its good practice to clear memory in the destructor
    memset(_channelBrightness, 0, sizeof(uint16_t) * NUM_CHANNELS);
}

void ToshibaTC62D723::shiftBrightnessDataIn(const uint16_t p_brightness)
{
    // TODO check return code?
    s0(p_brightness);
}

void ToshibaTC62D723::outputBrightnessDataToLEDs(void)
{
    s1();
}

// S0 Command:
//      Needs only SCK and SIN (which are SPI_SCK and SPI_MOSI respectively).
//      This is because TRANS can be 0 for this command according to the datasheet.
int ToshibaTC62D723::s0(const uint16_t p_value)
{
    if (p_value > 0 ) {
        BAGINFO3("%x", p_value);
    } else {
        BAGINFO3(".");
    }

    // Command S0 and S1 share the same clock line, so we need to be
    // careful which mode we are in.  This avoids re-initializing these
    // pins if we are already in SPI mode.
    // WARNING: Re-initializing every time makes the MOSI line dirty and
    //          is wasteful for the CPU.
    if ( gSpiMode == false &&
         gSpiPtr  == NULL)
    {
        // We are not using MISO, this is a one-way bus
        gSpiPtr = new SPI(SPI_MOSI, NC, SPI_SCK);

        if (gSpiPtr == NULL) {
            printf("ERROR: Could not allocate SPI\n");
            return AERROR;
        }

        // Note: Polarity and phase are both 0 for the TC62D723FNG
        // For a graphical reminder on polarity and phase, visit:
        //     http://www.eetimes.com/document.asp?doc_id=1272534
        gSpiPtr->format(16, 0);
        // gSpiPtr->frequency(1000000);  // 1.5 MHz on the scope
        gSpiPtr->frequency(24000000); // 24 MHz
        gSpiMode = true;
    }
    gbbTRANS = 0; // Like an SPI slave select
    gSpiPtr->write(p_value);
    gbbTRANS = 1; // Like an SPI slave select

    return AOK;
}

void ToshibaTC62D723::s1(void)
{
    BAGINFO3("\nLATCH\n");

    int i = 0;
    int j = 0;

    gbbTRANS = 0;

    if ( gSpiMode == true &&
         gSpiPtr  != NULL)
    {
        delete gSpiPtr;
        gSpiPtr  = NULL;
        gSpiMode = false;
    }

    DigitalOut bbSCK (D13); // bit bang clock

    bbSCK    = 0; // Start off/low
    gbbTRANS = 1; // Set high

    // Loop 6 times = 3 clock cycles
    for (j=0; j<6; j++) { // Always use an even number here!
        // The order of these two lines matter!
        i == 0 ? i = 1 : i = 0;          // Toggle i
        i == 0 ? bbSCK = 0 : bbSCK = 1;  // Set SCK to the same value as i
    }
    gbbTRANS = 0; // Set low
}