我已经能够将 SDRAM IC MT48LC4M32B2 连接到 STM32F767 Nucleo bord 并配置 FMC 以读写 SDRAM。我想检查我的 SDRAM 芯片的实际容量。但无法计算 32 位字中有多少可以存储在 I2C 中。以及如何检测可用空间的尽头? 这是我的写作和阅读代码:
#define BUFFER_SIZE ((uint32_t)0x1000)
#define WRITE_READ_ADDR ((uint32_t)0x800)
Fill_Buffer(aTxBuffer, BUFFER_SIZE, 0x55555555);
/* Write data to the SDRAM memory */
for (uwIndex = 0; uwIndex < BUFFER_SIZE; uwIndex++)
{
*(__IO uint32_t*) (SDRAM_BANK_ADDR + WRITE_READ_ADDR + 4*uwIndex) = aTxBuffer[uwIndex];
}
/* Read back data from the SDRAM memory */
for (uwIndex = 0; uwIndex < BUFFER_SIZE; uwIndex++)
{
aRxBuffer[uwIndex] = *(__IO uint32_t*) (SDRAM_BANK_ADDR + WRITE_READ_ADDR + 4*uwIndex);
}
/*##-3- Checking data integrity ############################################*/
for (uwIndex = 0; (uwIndex < BUFFER_SIZE); uwIndex++)
{
if (aRxBuffer[uwIndex] != aTxBuffer[uwIndex])
{
uwWriteReadStatus++; //error counter
badByte[uwIndex] = 1;
}
}
static void Fill_Buffer(uint32_t *pBuffer, uint32_t uwBufferLenght, uint32_t uwOffset)
{
uint32_t tmpIndex = 0;
/* Put in global buffer different values */
for (tmpIndex = 0; tmpIndex < uwBufferLenght; tmpIndex++ )
{
pBuffer[tmpIndex] = uwOffset;
uwOffset = ~uwOffset;
}
}
一种典型的方法依赖于这样一个事实,即存储在超过内存大小的值将与存储在地址
0x0
的值相同。这是因为地址的高位没有被解码,所以你在那个地址得到了你的 SDRAM 的“另一个”副本。
你可以在地址
0x0
存储一个“不寻常”的值,然后循环重复两次猜测内存大小,直到找到重复的值。
一些完全未经测试的代码,希望能够展示这个想法:
#define MAGIC_VAL (0xdeadbeef)
uint32_t check_sdram_size(void)
{
uint32_t *zero = (uint32_t *) (SDRAM_BANK_ADDR);
*zero = MAGIC_VAL;
uint32_t test_size;
for (test_size = 1024u ; ; test_size *= 2u)
{
uint32_t *check = (uint32_t *) (SDRAM_BANK_ADDR + test_size);
if (*check == MAGIC_VAL)
break;
}
return test_size;
}
首先猜测内存只有1024字节。如果你知道它肯定会比那个大,你可以输入一个更合理的起始猜测。
这仅在您的 MCU 实际尝试对超过 SDRAM 大小的地址执行事务时才有效。据推测,您已经为 MCU 中的 SDRAM 配置了某种最大尺寸,因此如果达到该尺寸,您会想要停止循环,并假设您有一个最大尺寸的 SDRAM。