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.

RM48 - EMIF - Async Connection to SRAM - Address Problem

Other Parts Discussed in Thread: HALCOGEN, TMS5703137

Hi,

I have a RM48 950 on the HDK.

I have connected the EMIF to 16-bit SRAM(follow figure17-8) and  I do a basic EMIF configure, when I do a basic EMIF write from RM48 to SRAM.  

I am writing the data 0x60000000 to the CS2 address space. Why start address at 0x0000E0? and Repeat at 0x0000FE?

Why not start address at 0x000000?

Could anyone begin to guess what the problem is?.  Is this a software setup issue?

 I have simply configured the CE2CFG register, its code is as follows:

void emif_ASYNC1Init(void)
{
/* USER CODE BEGIN (2) */
/* USER CODE END */
emifREG->CE2CFG = 0x00000000U;
emifREG->CE2CFG = (0U << 31U)|
(0U << 30U)|
(0U << 26U)|
(0U << 20U)|
(0U << 17U)|
(1U << 13U)|
(1U << 7U)|
(0U << 4U)|
(0U << 2U)|
(emif_16_bit_port) ;

emifREG->AWCC = (emifREG->AWCC)|
(emif_pin_high << 29U)|
(emif_pin_low << 28U)|
(emif_wait_pin0 << 16U)|
(0U);

emifREG->PMCR = (emifREG->PMCR)|
(0U << 2U)|
(emif_4_words << 1U)|
(0U);
/* USER CODE BEGIN (3) */
/* USER CODE END */
}

This is my test code as follows:

void main(void)
{
/* USER CODE BEGIN (3) */
int i=0,waddr=0x60000000,raddr=0x60000000;

emif_ASYNC1Init();

for (i=0;i<100;i++) {
*((uint16_t *) waddr) = k++;
waddr = waddr + 16;
}

for (i=0;i<10;i++) {}

for (i=0;i<5;i++) {
Unt16Temp = *((uint16_t *) raddr);
raddr = raddr + 16;
}

while (1);

}

PS:I have do MPU initial and enable in sys_startup.c

void _c_int00(void)
{

/* USER CODE BEGIN (5) */
/* USER CODE END */

/* Initialize Core Registers to avoid CCM Error */
_coreInitRegisters_();

/* USER CODE BEGIN (6) */
/* USER CODE END */

/* Initialize Stack Pointers */
_coreInitStackPointer_();

/* USER CODE BEGIN (7) */
_mpuInit_();
_mpuEnable_();
/* USER CODE END */

/* Work Around for Errata DEVICE#140: ( Only on Rev A silicon)
*
* Errata Description:
* The Core Compare Module(CCM-R4) may cause nERROR to be asserted after a cold power-on
* Workaround:
* Clear ESM Group2 Channel 2 error in ESMSR2 and Compare error in CCMSR register */
if (DEVICE_ID_REV == 0x802AAD05U)
{
_esmCcmErrorsClear_();
}

Any help please?

Thanks

Sam.

  • Hello Sam,

    I have forwarded your post to one of our experts.  They will respond back soon.

  • Hi Sam,

    Did you configure the pinmux before using EMIF? Here is the example to enable EMIF pins which are multiplexed with other function pins:

    void Gladiator_PINMUX_EMIF()
    {
    *(int *) 0xFFFFEB14 = 0x02020101;//P1 //EMIF_DATA[5],EMIF_DATA[4]
    *(int *) 0xFFFFEB18 = 0x01010201;//P2 //EMIF_DATA[6]
    *(int *) 0xFFFFEB1C = 0x02010102;//P3 //EMIF_DATA[8],EMIF_DATA[7]
    *(int *) 0xFFFFEB20 = 0x01010201;//P4 //EMIF_DATA[9]
    *(int *) 0xFFFFEB24 = 0x02010101;//P5 //EMIF_DATA[10]
    *(int *) 0xFFFFEB28 = 0x02010201;//P6 //EMIF_DATA[12],EMIF_DATA[11]
    *(int *) 0xFFFFEB2C = 0x02010102;//P7 //EMIF_DATA[14],EMIF_DATA[13]
    *(int *) 0xFFFFEB30 = 0x02010101;//P8 //EMIF_DATA[15]
    *(int *) 0xFFFFEB38 = 0x02010201;//P10 //EMIF_DATA[2],EMIF_DATA[3]
    *(int *) 0xFFFFEB3C = 0x01020101;//P11 //EMIF_DATA[1]
    *(int *) 0xFFFFEB40 = 0x01010201;//P12 //EMIF_DATA[0]
    // *(int *) 0xFFFFEB48 = 0x01020101;//P14 // EMIF_RNW Read not Write
    *(int *) 0xFFFFEB50 = 0x02010102;//P16 //EMIF_nOE,EMIF_BA[0]
    *(int *) 0xFFFFEB54 = 0x02010201;//P17 //EMIF_ADDR[5],EMIF_nDQM[1]
    *(int *) 0xFFFFEB5C = 0x02020102;//P19 //EMIF_ADDR[3],EMIF_nDQM[0],EMIF_ADDR[4]
    *(int *) 0xFFFFEB68 = 0x02010101;//P22 //EMIF_ADDR[2]
    *(int *) 0xFFFFEB84 = 0x01010001;//P29 //EMIF_CLK

    }

    Regards,

    QJ

  • Hi QJ

    I have configure the pinmux before using EMIF (HALCoGen Version 03.04.00), but not like your example.

    This is my EMIF configure(I have check EMIF, no conflicts)

    This is my pinmux.c as follow.

    void muxInit(void){

    /* USER CODE BEGIN (1) */
    /* USER CODE END */

    /* Enable Pin Muxing */
    kickerReg->KICKER0 = 0x83E70B13U;
    kickerReg->KICKER1 = 0x95A4F1E0U;

    /* USER CODE BEGIN (2) */
    /* USER CODE END */

    pinMuxReg->PINMUX0 = PINMUX_BALL_W10_GIOB_3 | PINMUX_BALL_A5_GIOA_0 | PINMUX_BALL_C3_I2C_SCL | PINMUX_BALL_B2_I2C_SDA;

    pinMuxReg->PINMUX1 = PINMUX_BALL_C2_GIOA_1 | PINMUX_BALL_E3_HET1_11 | PINMUX_BALL_E5_EMIF_DATA_4 | PINMUX_BALL_F5_EMIF_DATA_5;

    pinMuxReg->PINMUX2 = PINMUX_BALL_C1_GIOA_2 | PINMUX_BALL_G5_EMIF_DATA_6 | PINMUX_BALL_E1_GIOA_3 | PINMUX_BALL_B5_GIOA_5;

    pinMuxReg->PINMUX3 = PINMUX_BALL_K5_EMIF_DATA_7 | PINMUX_BALL_B3_HET1_22 | PINMUX_BALL_H3_GIOA_6 | PINMUX_BALL_L5_EMIF_DATA_8;

    pinMuxReg->PINMUX4 = PINMUX_BALL_M1_GIOA_7 | PINMUX_BALL_M5_EMIF_DATA_9 | PINMUX_BALL_V2_SPI4NENA | PINMUX_BALL_U1_SPI4NCS_0;

    pinMuxReg->PINMUX5 = PINMUX_BALL_K18_SPI4CLK | PINMUX_BALL_W5_SPI4SIMO | PINMUX_BALL_V6_SPI4SOMI | PINMUX_BALL_N5_EMIF_DATA_10;

    pinMuxReg->PINMUX6 = PINMUX_BALL_T1_HET1_07 | PINMUX_BALL_P5_EMIF_DATA_11 | PINMUX_BALL_V7_HET1_09 | PINMUX_BALL_R5_EMIF_DATA_12;

    pinMuxReg->PINMUX7 = PINMUX_BALL_R6_EMIF_DATA_13 | PINMUX_BALL_V5_MIBSPI3NCS_1 | PINMUX_BALL_W3_SCIRX | PINMUX_BALL_R7_EMIF_DATA_14;

    pinMuxReg->PINMUX8 = PINMUX_BALL_N2_SCITX | PINMUX_BALL_G3_MIBSPI1NCS_2 | PINMUX_BALL_N1_HET1_15 | PINMUX_BALL_R8_EMIF_DATA_15;

    pinMuxReg->PINMUX9 = (~(pinMuxReg->PINMUX9 >> 18U) & 0x00000001U ) << 18U| PINMUX_BALL_R9_ETMTRACECLKIN | PINMUX_BALL_W9_MIBSPI3NENA | PINMUX_BALL_V10_MIBSPI3NCS_0 | PINMUX_BALL_J3_MIBSPI1NCS_3;

    pinMuxReg->PINMUX10 = PINMUX_BALL_N19_AD1EVT | PINMUX_BALL_N15_EMIF_DATA_3 | PINMUX_BALL_N17_EMIF_nCS_0 | PINMUX_BALL_M15_EMIF_DATA_2;

    pinMuxReg->PINMUX11 = PINMUX_BALL_K17_EMIF_nCS_3 | PINMUX_BALL_M17_EMIF_nCS_4 | PINMUX_BALL_L15_EMIF_DATA_1 | PINMUX_BALL_P1_HET1_24;

    pinMuxReg->PINMUX12 = PINMUX_BALL_A14_HET1_26 | PINMUX_BALL_K15_EMIF_DATA_0 | PINMUX_BALL_G19_MIBSPI1NENA | PINMUX_BALL_H18_MIBSPI5NENA;

    pinMuxReg->PINMUX13 = PINMUX_BALL_J18_MIBSPI5SOMI_0 | PINMUX_BALL_J19_MIBSPI5SIMO_0 | PINMUX_BALL_H19_MIBSPI5CLK | PINMUX_BALL_R2_MIBSPI1NCS_0;

    pinMuxReg->PINMUX14 = PINMUX_BALL_E18_HET1_08 | PINMUX_BALL_K19_HET1_28 | PINMUX_BALL_D17_EMIF_nWE | PINMUX_BALL_D16_EMIF_BA_1;

    pinMuxReg->PINMUX15 = PINMUX_BALL_C17_EMIF_ADDR_21 | PINMUX_BALL_C16_EMIF_ADDR_20 | PINMUX_BALL_C15_EMIF_ADDR_19 | PINMUX_BALL_D15_EMIF_ADDR_18;

    pinMuxReg->PINMUX16 = PINMUX_BALL_E13_EMIF_BA_0 | PINMUX_BALL_C14_EMIF_ADDR_17 | PINMUX_BALL_D14_EMIF_ADDR_16 | PINMUX_BALL_E12_EMIF_nOE;

    pinMuxReg->PINMUX17 = PINMUX_BALL_D19_HET1_10 | PINMUX_BALL_E11_EMIF_nDQM_1 | PINMUX_BALL_B4_HET1_12 | PINMUX_BALL_E9_EMIF_ADDR_5;

    pinMuxReg->PINMUX18 = PINMUX_BALL_C13_EMIF_ADDR_15 | PINMUX_BALL_A11_HET1_14 | PINMUX_BALL_C12_EMIF_ADDR_14 | PINMUX_BALL_M2_GIOB_0;

    pinMuxReg->PINMUX19 = PINMUX_BALL_E8_EMIF_ADDR_4 | PINMUX_BALL_B11_HET1_30 | PINMUX_BALL_E10_EMIF_nDQM_0 | PINMUX_BALL_E7_EMIF_ADDR_3;

    pinMuxReg->PINMUX20 = PINMUX_BALL_C11_EMIF_ADDR_13 | PINMUX_BALL_C10_EMIF_ADDR_12 | PINMUX_BALL_F3_MIBSPI1NCS_1 | PINMUX_BALL_C9_EMIF_ADDR_11;

    pinMuxReg->PINMUX21 = PINMUX_BALL_D5_EMIF_ADDR_1 | PINMUX_BALL_K2_GIOB_1 | PINMUX_BALL_C8_EMIF_ADDR_10 | PINMUX_BALL_C7_EMIF_ADDR_9;

    pinMuxReg->PINMUX22 = PINMUX_BALL_D4_EMIF_ADDR_0 | PINMUX_BALL_C5_EMIF_ADDR_7 | PINMUX_BALL_C4_EMIF_ADDR_6 | PINMUX_BALL_E6_EMIF_ADDR_2;

    pinMuxReg->PINMUX23 = (~(pinMuxReg->PINMUX5 >> 1U) & 0x00000001U ) << 8U |(~(pinMuxReg->PINMUX5 >> 9U) & 0x00000001U ) << 16U|(~(pinMuxReg->PINMUX5 >> 17U) & 0x00000001U ) << 24U| PINMUX_BALL_C6_EMIF_ADDR_8;

    pinMuxReg->PINMUX24 = (~(pinMuxReg->PINMUX4 >> 17U) & 0x00000001U ) << 0U|(~(pinMuxReg->PINMUX4 >> 25U) & 0x00000001U ) << 8U|(~(pinMuxReg->PINMUX20 >> 17U) & 0x00000001U ) << 16U | (~(pinMuxReg->PINMUX8 >> 9U) & 0x00000001U ) << 24U;

    pinMuxReg->PINMUX25 = (~(pinMuxReg->PINMUX12 >> 17U) & 0x00000001U ) << 8U|(~(pinMuxReg->PINMUX7 >> 9U) & 0x00000001U ) << 16U|(~(pinMuxReg->PINMUX0 >> 26U) & 0x00000001U ) << 24U;

    pinMuxReg->PINMUX26 = (~(pinMuxReg->PINMUX0 >> 18U) & 0x00000001U ) << 0U|(~(pinMuxReg->PINMUX9 >> 10U) & 0x00000001U ) << 8U|PINMUX_BALL_W6_MIBSPI5NCS_2 | PINMUX_BALL_T12_MIBSPI5NCS_3;

    pinMuxReg->PINMUX27 = PINMUX_BALL_E19_MIBSPI5NCS_0 | PINMUX_BALL_B6_MIBSPI5NCS_1 | PINMUX_BALL_E16_MIBSPI5SIMO_1 | PINMUX_BALL_H17_MIBSPI5SIMO_2;

    pinMuxReg->PINMUX28 = PINMUX_BALL_G17_MIBSPI5SIMO_3 | PINMUX_BALL_E17_MIBSPI5SOMI_1 | PINMUX_BALL_H16_MIBSPI5SOMI_2 | PINMUX_BALL_G16_MIBSPI5SOMI_3;

    pinMuxReg->PINMUX29 = PINMUX_BALL_D3_SPI2NCS_1;

    PINMUX_GATE_EMIF_CLK_ENABLE(OFF);
    PINMUX_GIOB_DISABLE_HET2_ENABLE(OFF);
    PINMUX_ALT_ADC_TRIGGER_SELECT(1);
    PINMUX_ETHERNET_SELECT(RMII);

    /* USER CODE BEGIN (3) */
    /* USER CODE END */

    /* Disable Pin Muxing */
    kickerReg->KICKER0 = 0x00000000U;
    kickerReg->KICKER1 = 0x00000000U;

    /* USER CODE BEGIN (4) */
    /* USER CODE END */
    }

    So, I need to do other EMIF configure?like your example?

    Thanks

    Sam

  • Hi Sam,

    I have not gone into details of your issue - but I did encounter some EMIF problem a few weeks ago. Please try to follow instructions proposed by this post:

    The EMIF signals multiplexed with other general-purpose I/O signals have an additional control to enable EMIF outputs. These EMIF outputs are enabled by setting the bit 31 of GPREG1 register (address 0xFFFFFFA0) in the "system" module.

    Maybe you should consider a small difference in setting because this solution was applied on the TMS5703137 device.

    Hope it will help, cheers

    Jiri

  • Hi Sam,

    Jiri is right, you need to set bit 31 of GPREG1 register too.

    Regards,

    QJ


  • Hi QJ & Jiri

    Thanks a lot for your hint!

    It works.

    sam