主题中讨论的其他器件: C2000WARE
我尝试使用 TMS320F28379D 和外部 SDRAM 存储器(2M 字 x 32位 x 4组 - AS4C8M32S-6TIN)设置定制板、EMIF1设置 EMIF1CLK = CPU1SYSCLK/2、CPU1SYSCLK = 200MHz。
我还将 emif1_32BIG_SDRAM_cpu01示例代码调整为我的自定义应用程序。
我看到的问题是、所有数据似乎都被镜像到外部存储器的所有地址、而不是像示例代码执行的那样在每个存储器位置增加1。
如果我将 CPU1SYSCLK 减少至100MHz、将 EMIF1时钟减少至50MHz、我可以使应用正常运行。
我修改了代码以执行文档中建议的两种初始化方法(SPRUHM8I、25.5.5.5 SDRAM 配置过程)、但这两种方法似乎都具有相同的结果。
是否有人可以检查我的外部 SDRAM 设置是否正常、并帮助使该接口在100MHz 的 EMIF1下正常工作?
请参阅下面的程序 B 使用的代码。此外、我已将内存浏览器行为附加到以50MHz (工作正常)和100MHz (具有镜像数据)运行的 EMIF1代码。
//---------------------------------- //包括 //----------------- #include "F2837xD_DEVICE.h" #include "F2837xD_examples.h" #include "GPIO.h" #include "EMIF1.h" //定义 // #define TEST_PASS 0xABCDABCD #define TEST_FAIL 0xDEADDEEAD #define SDRAM_CS0_START_ADDR 0x8000000 #define SDRAM_CS0_SIZE 0x00800000 // // Globals // UINT16 ErrCount = 0; UINT32 test_status; UINT32 ii; void Emif1Config (void) { char 勘误表_local; TEST_STATUS = TEST_FAIL; EALLOW; // //为 CPU1抓取 EMIF1 // EMIF1ConfigRegs.EMIF1MSEL.ALL = 0x93A5CE71; if (emif1ConfigRegs.EMIF1MSEL.all!= 0x1) { ErrCount++; } // //禁用访问保护(CPU_Fetch、CPU_WR/DMA_WR) // EMIF1ConfigRegs.EMIF1ACCPRT0.ALL = 0x0; if (emif1ConfigRegs.EMIF1ACCPRT0.ALL!= 0x0) { ErrCount++; } // //提交与保护相关的配置。 直到该位保持不变 //设置 EMIF1ACCPROT0寄存器的内容不能更改。 // EMIF1ConfigRegs.EMIF1COMMIT.ALL = 0x1; if (emif1ConfigRegs.EMIF1COMMIT.ALL!= 0x1) { ErrCount++; } // //锁定配置,使 EMIF1COMMIT 寄存器不能更改 //任何更多。 // EMIF1ConfigRegs.EMIF1LOCK.ALL = 0x1; if (emif1ConfigRegs.EMIF1LOCK.ALL!= 1) { ErrCount++; } EDIS; InitEsaTrdEmif1Gpio();
//将内存置于自刷新模式以更改频率 emif1Regs.SDRAM_CR.bit.SR = 0x1; //配置为在半速率上运行 EMIF1 (EMIF1CLK = CPU1SYSCLK/2) // EALLOW; ClkCfgRegs.PERCLKDIVSEL.bit.EMIF1CLKDIV = 0x1; EDIS;
//释放自刷新模式 emif1Regs.SDRAM_CR.bit.SR = 0x0; //配置 SDRAM 控制寄存器 //需要根据 SDRAM 数据表进行编程。 //T_RFC = 60ns = 0x6 //T_RP = 18ns = 0x1 //T_RCD = 18ns = 0x1 //T_WR = 12ns = 0x1 //T_RAS = 42ns = 0x4 //T_RC = 60ns = 0x6 //T_RRD = 12ns = 0x1 emif1Regs.SDRAM_TR.bit.T_RFC = 0x6; emif1Regs.SDRAM_TR.bit.T_RP = 0x1; emif1Regs.SDRAM_TR.bit.T_RCD = 0x1; emif1Regs.SDRAM_TR.bit.T_WR = 0x1; emif1Regs.SDRAM_TR.bit.T_RAS = 0x4; emif1Regs.SDRAM_TR.bit.T_RC = 0x6; emif1Regs.SDRAM_TR.bit.T_RRD = 0x1; //Txsr = 61.5ns = 0x6 EMif1Regs.SDR_EXT_TMNG.bit.T_XS = 0x6; //Tref = 64ms (15.6us*4096)对于4096行、RR = 64m*100M/4096 = 1562.5 (0x61B) //Emif1Regs.SDRAM_RCR.ALL = 0x61B;
//过程2配置 emif1Regs.SDRAM_RCR.bit.refresh_rate = 0x9C5; //pagesize=1 (每行元素数)、IBANK = 2 (4组)、CL = 3、NM = 0 (32位) //Emif1Regs.SDRAM_CR.all = 0x00000720; emif1Regs.SDRAM_CR.bit.SR = 0x0; emif1Regs.SDRAM_CR.bit.nm = 0; emif1Regs.SDRAM_CR.bit.CL = 0x3; EMif1Regs.SDRAM_CR.bit.bit_11_9_LOCK = 0x1; EMif1Regs.SDRAM_CR.bit.IBANK = 0x2; EMIF1Regs.SDRAM_CR.bit.PAGESIGE = 0x3;
//添加延迟以满足 SDRAM 加电限制 DELAY_US (200);
//配置 SDRAM 数据表刷新率 emif1Regs.SDRAM_RCR.bit.refresh_rate = 0x61b; // //添加一些额外的延迟 // for (ii = 0;ii < 123;ii +){} //基本读/写检查。 ErrCount_Local = SDRAM_READ_WRITE (SDRAM_CS0_START_ADDR、SDRAM_CS0_SIZE); ErrCount = ErrCount + ErrCount_LOCAL; //运行不同的地址步行检查 ErrCount_Local = SDRAM_addr_walk (SDRAM_CS0_START_ADDR、15); ErrCount = ErrCount + ErrCount_LOCAL; //运行不同的数据步行检查 ErrCount_Local = SDRAM_DATA_Walk (SDRAM_CS0_START_ADDR、SDRAM_CS0_SIZE); ErrCount = ErrCount + ErrCount_LOCAL; //运行不同的数据大小检查 ErrCount_Local = SDRAM_DATA_SIZE (SDRAM_CS0_START_ADDR、4); ErrCount = ErrCount + ErrCount_LOCAL; 如果(ErrCount = 0x0) { test_status = test_pass; } } // // SDRAM_DATA_Walk -此函数为 SDRAM RD & WR 执行步行0 & 1 // char SDRAM_DATA_walk (uint32 start_addr、uint32 mem_size) { uint32 xm_p、XMEM_p; unsigned long SDRAM_rdl; unsigned long SDRAM_wdl; int i; int k; int m; xm_p = start_addr; 对于(i=0;i < mem_size;i=i+64) { 对于(m=0;m < 2;m++) { XMEM_p = xM_p; // //写入循环 // SDRAM_wdl = 0x0001; 对于(k=0;k < 32;k++) { 如果(m=0) { __addr32_write_uint32 (XMEM_p、SDRAM_wdl); } 其他 { __addr32_write_uint32 (XMEM_p、~SDRAM_wdl); } XMEM_p = XMEM_p+2; SDRAM_wdl = SDRAM_wdl<<1; } // //读取循环 // XMEM_p = xM_p; SDRAM_wdl = 0x0001; 对于(k=0;k < 32;k++) { SDRAM_rdl =__addr32_read_uint32 (XMEM_p); 如果(m==1) { SDRAM_rdl =~SDRAM_rdl; } if (SDRAM_rdl!= SDRAM_wdl) { 返回(1); } XMEM_p = XMEM_p+2; SDRAM_wdl=SDRAM_wdl<<1; } } XM_p = XMEM_p; } return (0); } // SDRAM_addr_walk -此函数对每个地址位执行切换。 // 在这种情况下、假定内存为4MB。 // ma = BA[1:0] row[11:0] COL[7:0] // char SDRAM_addr_walk (uint32 start_addr、uint32 addr_size) { uint32 XMEM_p; unsigned long SDRAM_rdl; unsigned long SDRAM_wdl; int i; 无符号长 x 移位; 无符号长整型 xshift2; // //写入循环 // xshift = 0x00000001; SDRAM_wdl = 0x5678abcd; 对于(i=0;i < addr_size;i++) { xshift 2 =((xshift+1)<1); XMEM_p = start_addr + xshift2; __addr32_write_uint32 (XMEM_p、SDRAM_wdl); SDRAM_wdl = SDRAM_wdl+0x111111; xshift = xshift<<1; } // //读取循环 // xshift = 0x00000001; SDRAM_wdl = 0x5678abcd; for (i=0;i < addr_size;i++) { xshift 2 =((xshift+1)<1); XMEM_p= start_addr + xshift2; SDRAM_rdl =__addr32_read_uint32 (XMEM_p); if (SDRAM_rdl!= SDRAM_wdl) { 返回(1); } xshift = xshift <<1; SDRAM_wdl = SDRAM_wdl + 0x11111111; } return (0); } // SDRAM_DATA_SIZE -此函数执行不同的数据类型 // (HALFWORD/WORD)访问。 // char SDRAM_DATA_SIZE (uint32 start_addr、uint32 mem_size) { 无符号短整型 SDRAM_RDS; unsigned long SDRAM_rdl; 无符号短整型 SDRAM_WDS; unsigned long SDRAM_wdl; int i; uint32 XMEM_p; // //写数据短整型 // XMEM_p = start_addr; SDRAM_WDS = 0x0605; 对于(i=0;i < 2;i++) { __addr32_write_uint16 (XMEM_p、SDRAM_WDS); XMEM_p++; SDRAM_WDS += 0x0202; } // //长写数据 // SDRAM_wdl = 0x0C0B0A09; 对于(i=0;i < 2;i++) { __addr32_write_uint32 (XMEM_p、SDRAM_wdl); XMEM_p = XMEM_p+2; SDRAM_wdl += 0x04040404; } // //读取数据短整型 // XMEM_p = start_addr; SDRAM_WDS=0x0605; 对于(i=0;i < 6;i++) { SDRAM_RDS =__addr32_read_uint16 (XMEM_p); if (SDRAM_RDS!= SDRAM_WDS) { 返回(1); } XMEM_p++; SDRAM_WDS += 0x0202; } // //长读数据 // XMEM_p = start_addr; SDRAM_wdl=0x08070605; 对于(i=0;i<3;i++) { SDRAM_rdl =__addr32_read_uint32 (XMEM_p); if (SDRAM_rdl!= SDRAM_wdl) { 返回(1); } XMEM_p = XMEM_p+2; SDRAM_wdl += 0x04040404; } return (0); } // SDRAM_READ_WRITE -此函数执行简单的读/写访问 // 存储器。 // char SDRAM_READ_WRITE (uint32 start_addr、uint32 mem_size) { unsigned long mem_rdl; unsigned long mem_wdl; uint32 XMEM_p; uint32 i; // //写入数据 // XMEM_p = start_addr; // //填充存储器 // MEM_wdl = 0x01234567; 对于(i=0;i < mem_size;i++) { __addr32_write_uint32 (XMEM_p、mem_wdl); XMEM_p = XMEM_p+2; MEM_wdl += 0x11111111; } // //验证内存 // MEM_wdl = 0x01234567; XMEM_p = start_addr; 对于(i=0;i < mem_size;i++) { MEM_rdl =__addr32_read_uint32 (XMEM_p); if (mem_rdl!= mem_wdl) { 返回(1); } XMEM_p = XMEM_p+2; MEM_wdl += 0x11111111; } 返回(0); }




