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.

TMS320F28388D: emif

Part Number: TMS320F28388D


I am developing on a F28388D ControlCard and have run into a slight issue using External Memory Interface2 (EMIF2). I have configured GPIO's -
GPIO_setPinConfig(GPIO_118_EMIF2_CLK);
GPIO_setPinConfig(GPIO_120_EMIF2_WEN);
GPIO_setPinConfig(GPIO_116_EMIF2_CS2N);
GPIO_setPinConfig(GPIO_121_EMIF2_OEN);
GPIO_setPinConfig(GPIO_98_EMIF2_A0);
GPIO_setPinConfig(GPIO_99_EMIF2_A1);
GPIO_setPinConfig(GPIO_100_EMIF2_A2);
GPIO_setPinConfig(GPIO_101_EMIF2_A3);
GPIO_setPinConfig(GPIO_102_EMIF2_A4);
GPIO_setPinConfig(GPIO_103_EMIF2_A5);
GPIO_setPinConfig(GPIO_104_EMIF2_A6);
GPIO_setPinConfig(GPIO_105_EMIF2_A7);
GPIO_setPinConfig(GPIO_106_EMIF2_A8);
GPIO_setPinConfig(GPIO_107_EMIF2_A9);
GPIO_setPinConfig(GPIO_108_EMIF2_A10);
GPIO_setPinConfig(GPIO_109_EMIF2_A11);
GPIO_setPinConfig(GPIO_95_EMIF2_A12);

GPIO_setPinConfig(GPIO_53_EMIF2_D15);
GPIO_setPinConfig(GPIO_54_EMIF2_D14);
GPIO_setPinConfig(GPIO_55_EMIF2_D13);
GPIO_setPinConfig(GPIO_56_EMIF2_D12);
GPIO_setPinConfig(GPIO_57_EMIF2_D11);
GPIO_setPinConfig(GPIO_58_EMIF2_D10);
GPIO_setPinConfig(GPIO_59_EMIF2_D9);
GPIO_setPinConfig(GPIO_60_EMIF2_D8);
GPIO_setPinConfig(GPIO_61_EMIF2_D7);
GPIO_setPinConfig(GPIO_62_EMIF2_D6);
GPIO_setPinConfig(GPIO_63_EMIF2_D5);
GPIO_setPinConfig(GPIO_134_EMIF2_D4);
GPIO_setPinConfig(GPIO_65_EMIF2_D3);
GPIO_setPinConfig(GPIO_66_EMIF2_D2);
GPIO_setPinConfig(GPIO_67_EMIF2_D1);
GPIO_setPinConfig(GPIO_68_EMIF2_D0);

GPIO_setPinConfig(GPIO_112_EMIF2_BA1);

EM2A12-EM2A0, and EM2BA1 (respectively). I am using chip select 2 (CS2) and have configured it for 16-bit data (ASIZE=1)

EMIF_setAsyncMode(EMIF2_BASE, EMIF_ASYNC_CS2_OFFSET,
EMIF_ASYNC_STROBE_MODE);

EMIF_setAsyncDataBusWidth(EMIF2_BASE, EMIF_ASYNC_CS2_OFFSET, EMIF_ASYNC_DATA_WIDTH_16);

I am performing consecutive 16-bit writes to addresses 0x2000 - 0x20FF and am monitoring the CS2 on an oscilloscope. When I write to address 0x20xx, I see two cycle:

CS2 go LOW and EM2BA1 LOW with 16bit DATAWRITE==memDATAW (it's OK)
then cycle 2:
CS2 go LOW and EM2BA1 HIGH with 16bit DATAWRITE== 0x00 (it's problem)
In cycle 2 damage Last data SRAM .

uint16_t ASRAM_WriteMem(uint32_t startAddr, uint16_t memDATAW)
{
uint16_t memWriteData;
uint32_t *memPtr;

memPtr = (uint32_t *)startAddr;
memWriteData = memDATAW;
*memPtr = memWriteData; // In cycle 2 - ??????
return(0);
}
What am I doing wrong? Am I not correctly understanding EMIF_setAsyncMode

  • Hi,

    I am performing consecutive 16-bit writes to addresses 0x2000 - 0x20FF and am monitoring the CS2 on an oscilloscope. When I write to address 0x20xx, I see two cycle:

    Can you provide the code which is preforming 16bit write ? It look like code is doing 32bit write instead of 16bit.

    Regards,

    Vivek Singh

  • I was hoping you could tell me how to do this,
    Convert to 16-bit write cycle.
    Or do you ask to disassemble the following line:
    * memPtr = memWriteData; == MOVL *+XAR4[0], ACC //32bit

    // uint32 - * memPtr
    // uint16 - memDATAW
    //////////////////////////////////////////////// /////////////////////////////////////////////
    ASRAM_WriteMem():
    0848e1: FE06 ADDB SP, #6
    0848e2: 7C45 MOV *-SP[5], AR4
    0848e3: 1E42 MOVL *-SP[2], ACC
    129 memPtr = (uint32_t *)startAddr;
    0848e4: 0642 MOVL ACC, *-SP[2]
    0848e5: 1E44 MOVL *-SP[4], ACC
    133 memWriteData = memDATAW;
    0848e6: 9245 MOV AL, *-SP[5]
    0848e7: 9646 MOV *-SP[6], AL
    135 *memPtr = memWriteData;
    0848e8: 8A44 MOVL XAR4, *-SP[4]
    0848e9: 0E46 MOVU ACC, *-SP[6]
    0848ea: 1EC4 MOVL *+XAR4[0], ACC
    136 return(0);

    I want this line convert to 16bit format.
    i can't do it.
    * memPtr = memWriteData; => MOV *+XAR4[0], AL //16bit
    //////////////////////////////////////////////// /////////////////////////////////////////////
    uint16_t ASRAM_WriteMem (uint32_t startAddr, uint16_t memDATAW)
    {
    uint16_t memWriteData;
    uint32_t * memPtr;

    memPtr = (uint32_t *) startAddr; // uint32
    memWriteData = memDATAW; // uint16
    * memPtr = memWriteData; // double loop - 32 bits
    return (0);
    }

  • Sorry, I missed the code section in earlier post. You have defined memPtr as 32bit pointer hence it is doing 32bit write. Define that as 16bit pointer and that should fix the issue.

    Regards,

    Vivek Singh