This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DLPC3478: Reading the DMD I/F Training Data register

Part Number: DLPC3478
Other Parts Discussed in Thread: DLPA2000, DLP3010,

Tool/software:

Hello,

I am bringing up a board with a DLPC3478, DLPA2000, and DLP3010. We have previously used all three chips together in other products.  I am using a custom build of the 8.1.1 DLPC firmware which disables LED control via the DLPA2000, as we are using a dedicated IC for LED control.

I have successfully programmed and DLPC's external flash, and I can communicate with it over I2C. However, when I command the DLPC to display a test pattern or stream internal patterns, the DLP3010 does not work as expected.  The exact pattern displayed for the solid on test pattern varies from run to run, see below for two examples:

I wanted to check if the controller to DMD interface was working,and I saw the DMD I/F Training Data register (0xDC). I added the following code to dlpc34xx.c/.h to the TI DLP API module to read it.

typedef enum {
    PIN_PAIR_A = 0x00,
    PIN_PAIR_B = 0x01,
    PIN_PAIR_C = 0x02,
    PIN_PAIR_D = 0x03,
    PIN_PAIR_E = 0x04,
    PIN_PAIR_F = 0x05,
    PIN_PAIR_G = 0x06,
    PIN_PAIR_H = 0x07,
} DLPC34XX_DMDInterfacePinPair_e;

typedef struct
{
    DLPC34XX_DMDInterfacePinPair_e PinPair;
    bool PairSelectedForTraining;
    bool TrainingError;
    uint8_t SelectedDLL;
    uint8_t LowPassDLL;
    uint8_t HighPassDLL;
} DLPC34XX_DMDInterfaceTrainingResult_s;

uint32_t DLPC34XX_ReadTrainingResult(DLPC34XX_DMDInterfacePinPair_e pinPair, DLPC34XX_DMDInterfaceTrainingResult_s *result)
{
    uint32_t Status = 0;
    uint8_t data[4] = {0};
    uint8_t param = 0;
    
    DLPC_COMMON_ClearWriteBuffer();
    DLPC_COMMON_ClearReadBuffer();

    DLPC_COMMON_PackOpcode(1, 0xDC);
    
    param = 0x00 | (pinPair & 0x0F);
    DLPC_COMMON_PackBytes(&param, 1);

    DLPC_COMMON_SetCommandDestination(0);
    Status = DLPC_COMMON_SendRead(4);

    for (int i = 0; i < sizeof(data); i++)
    {
        data[i] = *(DLPC_COMMON_UnpackBytes(1));
    }

    if (Status == 0)
    {
        uint8_t overviewByte = data[0];
        result->TrainingError = (overviewByte >> 5) & 0x01;
        result->PairSelectedForTraining = (overviewByte >> 4) & 0x01;
        result->PinPair = overviewByte & 0x0F;
        result->SelectedDLL = data[1] & 0x3F;
        result->LowPassDLL = data[2] & 0x3F;
        result->HighPassDLL = data[3] & 0x3F;
    }
    return Status;
}


However, when I try to read each pin pair, they all report back data as

0xDC, 0x3F, 0x3F, 0x3F.

This does not seem correct to me, as the decoded pin pair is 12, which is not a valid pin pair.

Is this register supported in the 8.1.1 DLPC firmware?

  • Hello Andy,

    Thanks for reaching out through E2E!

    That doesn't seem correct to me either. The "DMD I/F Training" has to do with aligning delays to your DMD.

    Based on your image it seems that possibly the pin mapping is incorrect? Could you advise which version of pin mapping you've utilized in your design? See section 7.3.10.1 of the DLPC3478 datasheet

    Again, the "DMD I/F Training" is only a Read register and is very unlikely to be the cause of issues.

    Please advise if you have built a custom DMD yourself or if you've worked with an optical manufacturer to do so? It seems that traces could possibly not be terminated correctly and you will have to check and follow the guildelines under the Layout section (10) of the DLP3010LC datasheet.

    Best,

    Aaron

  • Hello Andy,

    We will continue this via e-mail.

    Best,

    Aaron