SDRAM Test
Source code can be downloaded from source:/Examples/SDRAM_Test
Description
SDRAM writing/verifying data test.
From the main.c source file:
Initialization
1 SystemInit();
2 CGU_Init();
3
4 MemoryPinInit();
5 EMCSRDRAMInit();
6 EMCFlashInit();
Configure LEDs
1 scu_pinmux(D2_SCU_PORT, D2_SCU_PIN, MD_BUK, FUNC0);
2 scu_pinmux(D3_SCU_PORT, D3_SCU_PIN, MD_BUK, FUNC4);
3 scu_pinmux(D4_SCU_PORT, D4_SCU_PIN, MD_BUK, FUNC4);
4 scu_pinmux(D5_SCU_PORT, D5_SCU_PIN, MD_BUK, FUNC4);
5 scu_pinmux(D6_SCU_PORT, D6_SCU_PIN, MD_BUK, FUNC4);
6 GPIO_SetDir(D2_GPIO_PORT, D2_GPIO_MASK, 1);
7 GPIO_ClearValue(D2_GPIO_PORT, D2_GPIO_MASK);
8 GPIO_SetDir(D3_GPIO_PORT, D3_GPIO_MASK, 1);
9 GPIO_ClearValue(D3_GPIO_PORT, D3_GPIO_MASK);
10 GPIO_SetDir(D4_GPIO_PORT, D4_GPIO_MASK, 1);
11 GPIO_ClearValue(D4_GPIO_PORT, D4_GPIO_MASK);
12 GPIO_SetDir(D5_GPIO_PORT, D5_GPIO_MASK, 1);
13 GPIO_ClearValue(D5_GPIO_PORT, D5_GPIO_MASK);
14 GPIO_SetDir(D6_GPIO_PORT, D6_GPIO_MASK, 1);
15 GPIO_ClearValue(D6_GPIO_PORT, D6_GPIO_MASK);
"1" test
1 while (1)
2 {
3 uint32_t i;
4 uint32_t value;
5 volatile uint32_t *pData;
6
7 GPIO_SetValue(D3_GPIO_PORT, D3_GPIO_MASK);
8
9 // Running "1" test
10 value = 0x1;
11
12 while (value != 0)
13 {
14 // Write
15 pData = (volatile uint32_t *)SDRAM_BASE_ADDR;
16 for (i = 0; i < (SDRAM_SIZE_BYTES / 4); i++)
17 {
18 *pData++ = value;
19 }
20 // Verify
21 pData = (volatile uint32_t *)SDRAM_BASE_ADDR;
22 for (i = 0; i < (SDRAM_SIZE_BYTES / 4); i++)
23 {
24 if (*pData++ != value)
25 {
26 GPIO_SetValue(D2_GPIO_PORT, D2_GPIO_MASK);
27 while (1); // catch the error
28 }
29 }
30
31 value <<= 1; // next bit
32 }
33
34 GPIO_SetValue(D4_GPIO_PORT, D4_GPIO_MASK);
Running "0" test
1 value = ~0x1;
2
3 while (value != ~0)
4 {
5 // Write
6 pData = (volatile uint32_t *)SDRAM_BASE_ADDR;
7 for (i = 0; i < (SDRAM_SIZE_BYTES / 4); i++)
8 {
9 *pData++ = value;
10 }
11 // Verify
12 pData = (volatile uint32_t *)SDRAM_BASE_ADDR;
13 for (i = 0; i < (SDRAM_SIZE_BYTES / 4); i++)
14 {
15 if (*pData++ != value)
16 {
17 GPIO_SetValue(D2_GPIO_PORT, D2_GPIO_MASK);
18 while (1); // catch the error
19 }
20 }
21
22 value = (value << 1) | 0x1; // next bit
23 }
24
25 GPIO_SetValue(D5_GPIO_PORT, D5_GPIO_MASK);
"Const" test
1 value = 0x55555555;
2
3 // Write
4 pData = (volatile uint32_t *)SDRAM_BASE_ADDR;
5 for (i = 0; i < (SDRAM_SIZE_BYTES / 4 / 2); i++)
6 {
7 *pData++ = value;
8 *pData++ = ~value;
9 }
10 // Verify
11 pData = (volatile uint32_t *)SDRAM_BASE_ADDR;
12 for (i = 0; i < (SDRAM_SIZE_BYTES / 4 / 2); i++)
13 {
14 if (*pData++ != value || *pData++ != ~value)
15 {
16 GPIO_SetValue(D2_GPIO_PORT, D2_GPIO_MASK);
17 while (1); // catch the error
18 }
19 }
For single test this will set D6 (D3..D5 are already on) indicating success. For continuous test D6 will toggle every pass.
1 GPIO_ToggleValue(D6_GPIO_PORT, D6_GPIO_MASK);
2
3 #ifndef CONTINUOUS_TEST
4 while(1);
5 #else
6 GPIO_ClearValue(D3_GPIO_PORT, D3_GPIO_MASK);
7 GPIO_ClearValue(D4_GPIO_PORT, D4_GPIO_MASK);
8 GPIO_ClearValue(D5_GPIO_PORT, D5_GPIO_MASK);
9 #endif