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

Неопределенный