[技术问答] 大神请进!NUC472 EBI读写fram遇到的问题

[复制链接]
1798|1
 楼主| waiky85 发表于 2015-11-27 11:21 | 显示全部楼层 |阅读模式
本帖最后由 waiky85 于 2015-12-3 10:32 编辑

使用了NUC472芯片,通过配置EBI读写铁电FM22L16,数据位8位。发现读不到数据也写不了数据,读出来的却是地址的低八位(如:读取地址0x00000010数据,读取结果就是第八位0x10)。第一次使用EBI接口,不知道哪里出了问题,麻烦各位大神帮帮忙。以下是主要程序:

  1. 配置EBI接口:

  1.     CLK_EnableModuleClock(EBI_MODULE);
  2. /* Configure EBI multi-function pins */
  3.     SYS->GPA_MFPH |= SYS_GPA_MFPH_PA8MFP_EBI_A18;
  4.     SYS->GPA_MFPL |= SYS_GPA_MFPL_PA7MFP_EBI_A17 | SYS_GPA_MFPL_PA6MFP_EBI_A16 |
  5.                                      SYS_GPA_MFPL_PA5MFP_EBI_A15 | SYS_GPA_MFPL_PA4MFP_EBI_A14 |
  6.                                      SYS_GPA_MFPL_PA3MFP_EBI_A13 | SYS_GPA_MFPL_PA2MFP_EBI_A12;
  7.     SYS->GPD_MFPL |= SYS_GPD_MFPL_PD7MFP_EBI_A11 | SYS_GPD_MFPL_PD6MFP_EBI_A10 |
  8.                                      SYS_GPD_MFPL_PD5MFP_EBI_A9  | SYS_GPD_MFPL_PD4MFP_EBI_A8;
  9.     SYS->GPB_MFPL |= SYS_GPB_MFPL_PB5MFP_EBI_AD7 | SYS_GPB_MFPL_PB4MFP_EBI_AD6 |
  10.                                      SYS_GPB_MFPL_PB3MFP_EBI_AD5 | SYS_GPB_MFPL_PB2MFP_EBI_AD4;
  11.     SYS->GPA_MFPH |= SYS_GPA_MFPH_PA14MFP_EBI_AD3| SYS_GPA_MFPH_PA13MFP_EBI_AD2|
  12.                                      SYS_GPA_MFPH_PA12MFP_EBI_AD1| SYS_GPA_MFPH_PA11MFP_EBI_AD0;
  13.     SYS->GPE_MFPL |= SYS_GPE_MFPL_PE6MFP_EBI_nWR | SYS_GPE_MFPL_PE7MFP_EBI_nRD;
  14.     SYS->GPE_MFPH |= SYS_GPE_MFPH_PE8MFP_EBI_ALE;
  15.     SYS->GPE_MFPH |= SYS_GPE_MFPH_PE11MFP_EBI_nCS0 | SYS_GPE_MFPH_PE12MFP_EBI_nCS1;

  16. void EBI_Init(void)
  17. {
  18.     const uint32_t u32Timing = 0x73F;

  19.     /* Open EBI interface */
  20.     EBI_Open(EBI_BANK0, EBI_BUSWIDTH_8BIT, EBI_TIMING_FAST, EBI_SEPARATEMODE_DISABLE, EBI_CS_ACTIVE_LOW);
  21.     EBI_Open(EBI_BANK1, EBI_BUSWIDTH_8BIT, EBI_TIMING_FAST, EBI_SEPARATEMODE_DISABLE, EBI_CS_ACTIVE_LOW);

  22.     /* Configure EBI timing */
  23. //    EBI_SetBusTiming(EBI_BANK0, 0x21C, EBI_MCLKDIV_2);
  24. //    EBI_SetBusTiming(EBI_BANK1, 0x21C, EBI_MCLKDIV_2);
  25. }

  26. //程序调用该函数来测试读写Fram
  27. void Test_Fram(void)
  28. {
  29.     uint16_t i ;
  30.    
  31.     uint32_t u32idx;
  32.     uint32_t u32Size;
  33.     uint32_t *pu32ptr, *pu32tmp;
  34.     LongUnon r32data;
  35.    
  36.     u32Size = 256;
  37.     pu32ptr = (uint32_t *)EBI0_BASE_ADDR;
  38.     pu32tmp = (uint32_t *)EBI0_BASE_ADDR+u32Size+4;

  39.     for(u32idx = 0; u32idx < u32Size; u32idx+=4)
  40.     {
  41. //        *pu32tmp = 0;
  42. //        *pu32ptr++ = (uint32_t)(0xFFFF+0x5678);
  43.         EBI0_WRITE_DATA32(u32idx, (uint32_t)(u32idx*0xFFFF+0x5678));
  44.     }
  45. }
  1.     for(u32idx = 0; u32idx < u32Size; u32idx+=4)
  2.     {
  3.         
  4.         r32data.i = EBI0_READ_DATA32(u32idx);

  5.         RS485_SendDataByte(r32data.longbuf[0]);
  6.         RS485_SendDataByte(r32data.longbuf[1]);
  7.         RS485_SendDataByte(r32data.longbuf[2]);
  8.         RS485_SendDataByte(r32data.longbuf[3]);
  9.     }


   
zhuotuzi 发表于 2015-11-28 14:40 | 显示全部楼层
https://bbs.21ic.com/icview-1141042-1-2.html

主要使用SCATTAR FILE,指定HEAP的区块。
LR_IROM1 0x0000000 0x00080000  
{   
  ER_IROM1 0x0000000 0x00080000  
        {  
    *.o (RESET, +First)
    *(InRoot$$Sections)
    .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x0005000   
  {  
    .ANY (+RW +ZI)
  }

  RW_IRAM2 0x60000000 UNINIT 0x00020000  
  {  
  startup_nuc472_442.o(HEAP)
  }
  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部