硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4963|回复: 17
收起左侧

[FMC] 菜鸟求助大神-H743VITx FMC问题

[复制链接]

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2020-3-16 17:42:48 | 显示全部楼层 |阅读模式
小弟的片子是H743VITx,并口设备是Microchip的LAN9252,使用数据地址复用16bit模式,其它还有NL(NADV)-ALELO、NOE-RD、NWE-WR、NE1-CS。迄今为止仍无法读到某测试寄存器的正确数值,做了这么些调试了:
1、TYPE_PSRAM、TYPE_NOR,MODE_A、MODE_B、MODE_D都试过了
2、一开始的程序用CUBEMX生成的,无CPU_CACHE_ENABLE()和MPU_Config(),读不到东西
3、在论坛上搜FMC有很多帖子说要关掉CACHE,就把V7的例程拿过来试,0x60000000为strongly-order,也不行
4、如附件图片所示,访问地址为0x60000000+0x64时逻辑分析仪的结果,可见NADV(ALELO)期间的AD7-0上的地址信息是对的,但是就是没有正确返回预期的数据
5、手头有朋友一块F40x+LAN9252的片子的好用的板子,我用CUBEMX生成的F4 FSMC例程去测试,也没得到正确结果

因为之前都用的TI的DSP,STM32的ARM基本上没用过不熟悉,所以只能来求教一下大神们了,是不是还有什么关键的地方没设置到?
看手册,FMC的寄存器就那么几个,也没有太多花头啊……使能GPIO、FMC时钟,配置IO AF上下拉等,使能FMC,读地址指针,还有啥



FMC并口通讯问题.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-3-16 18:07:39 | 显示全部楼层
方便的话,稍微贴点原理图和你的FMC,MPU,CACHE配置发下。
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2020-3-17 09:38:59 | 显示全部楼层
eric2013 发表于 2020-3-16 18:07
方便的话,稍微贴点原理图和你的FMC,MPU,CACHE配置发下。

硬汉哥真是爱心大使啊,原理图如下:

代码如下:基于“V7-022_FMC总线扩展32路高速IO”的工程进行修改而来,所以大部分内容跟原工程一致
附注:所访问地址,不管是否左移1位,均得不到正确结果。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define LAN9252_READ(offset)        (*(__IO uint32_t *)(LAM9252_REG_BASE + (offset<<1)))
int main(void)
{
    uint8_t ucKeyCode;                /* 按键代码 */
    uint32_t *u32Ptr;

    bsp_Init();                /* 硬件初始化 */
       
  /* 进入主程序循环体 */
  while (1)
  {
     bsp_Idle();                /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
    /* FMC device read test */
     g_u32Temp = LAN9252_READ(0x64);//*u32Ptr;
  }

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void bsp_Init(void)
{
  /* 配置MPU */
  MPU_Config();
       
  /* 使能L1 Cache */
  CPU_CACHE_Enable();

  /*
     STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:
    - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。
    - 设置NVIV优先级分组为4。
  */
  HAL_Init();

  /*
    配置系统时钟到400MHz
    - 切换使用HSE。
    - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。
    */
  SystemClock_Config();


  /*
  Event Recorder:
  - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。
  - 默认不开启,如果要使能此选项,务必看V7开发板用户手册第8章
  */       
#if Enable_EventRecorder == 1  
  /* 初始化EventRecorder并开启 */
  EventRecorderInitialize(EventRecordAll, 1U);
  EventRecorderStart();
#endif
       
//        bsp_InitKey();            /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */
        bsp_InitTimer();          /* 初始化滴答定时器 */
//        bsp_InitUart();                /* 初始化串口 */
        bsp_InitExtIO();                /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */       
//        bsp_InitLed();            /* 初始化LED */       
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*
*********************************************************************************************************
*        函 数 名: MPU_Config
*        功能说明: 配置MPU
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static void MPU_Config( void )
{
        MPU_Region_InitTypeDef MPU_InitStruct;


        /* 禁止 MPU */
        HAL_MPU_Disable();


        /* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */
        MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = D1_AXISRAM_BASE;//0x24000000;//change @20200120
        MPU_InitStruct.Size             = MPU_REGION_SIZE_512KB;
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable     = MPU_ACCESS_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number           = MPU_REGION_NUMBER0;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL1;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

        HAL_MPU_ConfigRegion(&MPU_InitStruct);       
       
        /* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */
        MPU_InitStruct.Enable              = MPU_REGION_ENABLE;
        MPU_InitStruct.BaseAddress      = 0x60000000;/* FMC_BANK1_BASE */
        MPU_InitStruct.Size                  = ARM_MPU_REGION_SIZE_64KB;       
        MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
        MPU_InitStruct.IsBufferable      = MPU_ACCESS_BUFFERABLE;
        MPU_InitStruct.IsCacheable      = MPU_ACCESS_NOT_CACHEABLE;        /* 不能用MPU_ACCESS_CACHEABLE,会出现2次CS、WE信号 */
        MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
        MPU_InitStruct.Number            = MPU_REGION_NUMBER1;
        MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
        MPU_InitStruct.SubRegionDisable = 0x00;
        MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;
       
        HAL_MPU_ConfigRegion(&MPU_InitStruct);

        /*使能 MPU */
        HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

/********************************************************************************************************
*        函 数 名: bsp_InitExtIO
*        功能说明: 配置扩展IO相关的GPIO. 上电只能执行一次。
*        形    参: 无
*        返 回 值: 无
********************************************************************************************************/
void bsp_InitExtIO(void)
{
/* commment @ 20200120 */
//        HC574_ConfigGPIO();
//        HC574_ConfigFMC();
/* add @ 20200120 */
  lan9252_ConfigGPIO();
  lan9252_ConfigFMC();
       
/* commment @ 20200120 */
//        /* 将开发板一些片选,LED口设置为高 */
//        g_HC574 = (NRF24L01_CE | VS1053_XDCS | LED1 | LED2 | LED3 | LED4);
//        HC574_PORT = g_HC574;        /* 写硬件端口,更改IO状态 */
}
/*********************************************************************************************************
*        函 数 名: lan9252_ConfigGPIO
*        功能说明: 配置GPIO,FMC管脚设置为复用功能
*        形    参:  无
*        返 回 值: 无
*********************************************************************************************************/
static void lan9252_ConfigGPIO(void)
{
/*
        demo board v1:
        PD14/FMC_DA0
        PD15/FMC_DA1
        PD0/FMC_DA2
        PD1/FMC_DA3
       
        PE7/FMC_DA4
        PE8/FMC_DA5
        PE9/FMC_DA6
        PE10/FMC_DA7
        PE11/FMC_DA8
        PE12/FMC_DA9
        PE13/FMC_DA10
        PE14/FMC_DA11
        PE15/FMC_DA12
       
        PD8/FMC_DA13
        PD9/FMC_DA14
        PD10/FMC_DA15
       
        PD4/FMC_NOE                ---- 读控制信号,OE = Output Enable , N 表示低有效
        PD5/FMC_NWE                -XX- 写控制信号,


        PC7/FMC_NE1                --- 主片选(Bank1)       
        PB7/FMC_NL                --- 地址有效信号,区分地址与数据 ALELO
        +-------------------+------------------+
        +   16-bits Multiplex Mode: AD0-AD15   +
        +-------------------+------------------+
*/       

        GPIO_InitTypeDef gpio_init_structure;

        /* 使能 GPIO时钟 */
        __HAL_RCC_GPIOB_CLK_ENABLE();
        __HAL_RCC_GPIOC_CLK_ENABLE();
        __HAL_RCC_GPIOD_CLK_ENABLE();
        __HAL_RCC_GPIOE_CLK_ENABLE();

        /* 使能FMC时钟 */
        __HAL_RCC_FMC_CLK_ENABLE();


        /* 设置 GPIOD 相关的IO为复用推挽输出 */
        gpio_init_structure.Mode = GPIO_MODE_AF_PP;
        gpio_init_structure.Pull = GPIO_PULLUP;
        gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        gpio_init_structure.Alternate = GPIO_AF12_FMC;
       
        /* 配置GPIOB */
        gpio_init_structure.Pin = GPIO_PIN_7;
        HAL_GPIO_Init(GPIOB, &gpio_init_structure);
       
        /* 配置GPIOD */
        gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4  | GPIO_PIN_5  |
                                  GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_14 |
                                  GPIO_PIN_15;
        HAL_GPIO_Init(GPIOD, &gpio_init_structure);

        /* 配置GPIOE */
        gpio_init_structure.Pin = GPIO_PIN_7  | GPIO_PIN_8  | GPIO_PIN_9  | GPIO_PIN_10 |
                                  GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |
                                  GPIO_PIN_15;
        HAL_GPIO_Init(GPIOE, &gpio_init_structure);

        /* 配置GPIOC ECAT_CS */
        gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
        gpio_init_structure.Pull = GPIO_PULLUP;
        gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        gpio_init_structure.Pin = GPIO_PIN_7;
        gpio_init_structure.Alternate = GPIO_AF9_FMC;
        HAL_GPIO_Init(GPIOC, &gpio_init_structure);
}
/*
*********************************************************************************************************
*        函 数 名: lan9252_ConfigFMC
*        功能说明: 配置FMC并口访问时序
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static void lan9252_ConfigFMC(void)
{
        SRAM_HandleTypeDef hsram = {0};
        FMC_NORSRAM_TimingTypeDef SRAM_Timing = {0};
               
        hsram.Instance  = FMC_NORSRAM_DEVICE;
        hsram.Extended  = FMC_NORSRAM_EXTENDED_DEVICE;

        /* FMC使用的HCLK3,主频240MHz,1个FMC时钟周期就是4.1667ns */
        /* SRAM 总线时序配置 4-1-2-1-2-2 不稳定,5-2-2-1-2-2 稳定 */  
        SRAM_Timing.AddressSetupTime       = 3;  /* 地址建立时间,min(LAN9252)=10ns=>3*4.16667=12.4ns,3个FMC时钟周期 */
        SRAM_Timing.AddressHoldTime        = 2;  /* 地址保持时间,min(LAN9252)=5ns=>2*4.16667=8.333ns,模式A时用不到此参数 */
        SRAM_Timing.DataSetupTime          = 2;  /* 数据保持时间,min(LAN9252)=5ns=>2*4.16667=8.333ns,2个FMC时钟周期 */
        SRAM_Timing.BusTurnAroundDuration  = 1;  /* 此配置用不到这个参数 */
        SRAM_Timing.CLKDivision            = 11;  /* 此配置用不到这个参数 -- 安富莱的这个注释不对,这个参数有用的,设置FMC时钟周期*/
        SRAM_Timing.DataLatency            = 2;  /* 此配置用不到这个参数 */
        SRAM_Timing.AccessMode             = FMC_ACCESS_MODE_A; /* 配置为模式A 扩展模式禁止时实为模式1-SRAM/PSRAM */

        hsram.Init.NSBank             = FMC_NORSRAM_BANK1;             /* 使用的BANK1,即使用的片选FMC_NE1 */
        hsram.Init.DataAddressMux     = FMC_DATA_ADDRESS_MUX_ENABLE;    /* 使能地址数据复用 */
        hsram.Init.MemoryType         = FMC_MEMORY_TYPE_NOR;//PSRAM;           /* 存储器类型SRAM *///FMC_MEMORY_TYPE_PSRAM
        hsram.Init.MemoryDataWidth    = FMC_NORSRAM_MEM_BUS_WIDTH_16;        /* 16位总线宽度 */
        hsram.Init.BurstAccessMode    = FMC_BURST_ACCESS_MODE_DISABLE;  /* 关闭突发模式 */
        hsram.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;   /* 用于设置等待信号的极性,关闭突发模式,此参数无效 */
        hsram.Init.WaitSignalActive   = FMC_WAIT_TIMING_BEFORE_WS;      /* 关闭突发模式,此参数无效 */
        hsram.Init.WriteOperation     = FMC_WRITE_OPERATION_ENABLE;     /* 用于使能或者禁止写操作 - 该位只是FMC是否使能/禁止在存储区域内写入 */
        hsram.Init.WaitSignal         = FMC_WAIT_SIGNAL_DISABLE;        /* 关闭突发模式,此参数无效 */
        hsram.Init.ExtendedMode       = FMC_EXTENDED_MODE_DISABLE;      /* 禁止扩展模式 */
        hsram.Init.AsynchronousWait   = FMC_ASYNCHRONOUS_WAIT_DISABLE;  /* 用于异步传输期间,使能或者禁止等待信号,这里选择关闭 */
        hsram.Init.WriteBurst         = FMC_WRITE_BURST_DISABLE;        /* 禁止写突发 */
        hsram.Init.ContinuousClock    = FMC_CONTINUOUS_CLOCK_SYNC_ONLY; /* 仅同步模式才做时钟输出 - 即异步模式时不输出时钟 */
        hsram.Init.WriteFifo          = FMC_WRITE_FIFO_ENABLE;          /* 使能写FIFO(复位后的默认值) */

        /* 初始化SRAM控制器 */
        if (HAL_SRAM_Init(&hsram, &SRAM_Timing, &SRAM_Timing) != HAL_OK)
        {
                /* 初始化错误 */
                Error_Handler(__FILE__, __LINE__);
        }
}



FMC4.png
FMC3.png
FMC2.png
FMC1.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-3-17 10:31:38 | 显示全部楼层
ragen 发表于 2020-3-17 09:38
硬汉哥真是爱心大使啊,原理图如下:

代码如下:基于“V7-022_FMC总线扩展32路高速IO”的工程进 ...

你的器件片选用的那个,也是NE1

你的原理图注释不太好找。
另外你程序里面的那个注释,FMC分频部分,这个确实是不起作用的。异步模式用不到,同步模式才起作用。

QQ截图20200317103519.png
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2020-3-17 13:42:51 | 显示全部楼层
eric2013 发表于 2020-3-17 10:31
你的器件片选用的那个,也是NE1

你的原理图注释不太好找。

H7的NE1(PC7)连至LAN9252的pin28: CS/DIGIO13/GPI13/GPO13/MII_RXD1

CLKDIV[3:0]手册里举例说时在异步模式时不用管,所以不影响。

可就是怎么都读不到正确结果
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-3-17 14:23:39 | 显示全部楼层
ragen 发表于 2020-3-17 13:42
H7的NE1(PC7)连至LAN9252的pin28: CS/DIGIO13/GPI13/GPO13/MII_RXD1

CLKDIV[3:0]手册里举例说时在异步 ...

地址线用那些。
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2020-3-17 15:29:57 | 显示全部楼层

       demo board v1:
        PD14/FMC_DA0
        PD15/FMC_DA1
        PD0/FMC_DA2
        PD1/FMC_DA3
        
        PE7/FMC_DA4
        PE8/FMC_DA5
        PE9/FMC_DA6
        PE10/FMC_DA7
        PE11/FMC_DA8
        PE12/FMC_DA9
        PE13/FMC_DA10
        PE14/FMC_DA11
        PE15/FMC_DA12
        
        PD8/FMC_DA13
        PD9/FMC_DA14
        PD10/FMC_DA15
        
        PD4/FMC_NOE                ---- 读控制信号,OE = Output Enable , N 表示低有效
        PD5/FMC_NWE                -XX- 写控制信号,

        PC7/FMC_NE1                --- 主片选(Bank1)        
        PB7/FMC_NL                --- 地址有效信号,区分地址与数据 ALELO
把pdf传了上来,pdf应该可以用搜索功能~ H743VIT-LAN9252.pdf (735.77 KB, 下载次数: 11)



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2020-3-17 18:54:34 | 显示全部楼层
ragen 发表于 2020-3-17 15:29
demo board v1:
        PD14/FMC_DA0
        PD15/FMC_DA1

你的这个
PB7/FMC_NL                --- 地址有效信

怎么没有用个地址线去控制,我们的DM9000就是地址线控制的。你这个是否合适。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2020-5-18 01:17:25 | 显示全部楼层
你的电路图画的,是QSPI和FMC两种模式都想试一试吗
LAN9252要把EEPROM前6个word配对了,才算选定了I/O端口的配置。HBI/SPI/GPIO各有各的配置参数,IO针脚是复用的。
EEPROM可以用TwinCAT写,也可以用SOEM的eepromtool写。内容有个叫sii tool的开源软件,可以从xml编译成bin文件。
建议你先把Microchip网站上Lan9252相关的资料全看一遍。我打印了1909A的前12章,厚厚两本,都翻旧了,才搞明白。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2022-6-27 09:16:11 | 显示全部楼层
请教下,有没有遇到过LAN9252出现偶尔无法启动的问题。
我用STM32F407和LAN9252通过FSMC实现通信,批量做做了几百套,有些会出现上电无法初始化的问题。只要初始化过了,就能够一直正常运行。
会卡死在这段初始化代码上
do
    {
        intMask = 0x0093;
        HW_EscWriteDWord(intMask, ESC_AL_EVENTMASK_OFFSET);
        intMask = 0;
    HW_EscReadDWord(intMask, ESC_AL_EVENTMASK_OFFSET);
   inittimer++;
   if(inittimer>1000000)
   {
    g_sm.g_flags.bit.EthercatInitErr=1;
    break;
   }
    } while (intMask!= 0x0093);

请教下有没有大侠碰到过这个问题,有没有解决思路望指教。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2023-11-19 23:33:41 | 显示全部楼层
我的H7 FMC 与9252 之间也遇到了相同的问题,想请问一下,你这个问题现在解决了?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-11-20 00:16:29 | 显示全部楼层
Qing 发表于 2023-11-19 23:33
我的H7 FMC 与9252 之间也遇到了相同的问题,想请问一下,你这个问题现在解决了?

注意FMC的MPU/Cache属性必须配置为Device或者Strongly order模式。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2023-11-20 12:09:57 | 显示全部楼层
eric2013 发表于 2023-11-20 00:16
注意FMC的MPU/Cache属性必须配置为Device或者Strongly order模式。

感谢您的回复。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2023-11-20 12:14:29 | 显示全部楼层
eric2013 发表于 2023-11-20 00:16
注意FMC的MPU/Cache属性必须配置为Device或者Strongly order模式。

感谢您的回复。

我的配置如下:


下载.png

下载 (1).png


我之前使用的是 F407,FSMC使用的是相同的配置,现在换成了H7,时钟频率也调整到了跟F407同样的,F(S)MC 部分的电路连接也是一样的,但是H7上就是工作不正常。读不到数据。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-11-22 08:18:42 | 显示全部楼层
Qing 发表于 2023-11-20 12:14
感谢您的回复。

我的配置如下:

这个FMC的MPU/Cache属性配置不是Device或者Strongly order模式。

另外这个地址0x6400 0000是你的FMC地址吧
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-3-27 15:13:25 | 显示全部楼层
学习学习
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-3-30 18:59:12 | 显示全部楼层
您好,我目前也遇到了同样的问题,您解决了吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2024-4-1 08:23:29 | 显示全部楼层
hanyudong 发表于 2024-3-30 18:59
您好,我目前也遇到了同样的问题,您解决了吗?

注意FMC驱动这个外设的地址空间MPU/Cache属性必须配置为Device或者Strongly order模式
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 16:17 , Processed in 0.245172 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表