菜鸟求助大神-H743VITx FMC问题
小弟的片子是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,读地址指针,还有啥
{:22:}{:22:}{:22:}
方便的话,稍微贴点原理图和你的FMC,MPU,CACHE配置发下。 eric2013 发表于 2020-3-16 18:07
方便的话,稍微贴点原理图和你的FMC,MPU,CACHE配置发下。
硬汉哥真是爱心大使啊,{:8:}原理图如下:
代码如下:基于“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__);
}
}
ragen 发表于 2020-3-17 09:38
硬汉哥真是爱心大使啊,原理图如下:
代码如下:基于“V7-022_FMC总线扩展32路高速IO”的工程进 ...
你的器件片选用的那个,也是NE1
你的原理图注释不太好找。
另外你程序里面的那个注释,FMC分频部分,这个确实是不起作用的。异步模式用不到,同步模式才起作用。
eric2013 发表于 2020-3-17 10:31
你的器件片选用的那个,也是NE1
你的原理图注释不太好找。
H7的NE1(PC7)连至LAN9252的pin28: CS/DIGIO13/GPI13/GPO13/MII_RXD1
CLKDIV手册里举例说时在异步模式时不用管,所以不影响。
可就是怎么都读不到正确结果{:20:} ragen 发表于 2020-3-17 13:42
H7的NE1(PC7)连至LAN9252的pin28: CS/DIGIO13/GPI13/GPO13/MII_RXD1
CLKDIV手册里举例说时在异步 ...
地址线用那些。 eric2013 发表于 2020-3-17 14:23
地址线用那些。
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应该可以用搜索功能~
ragen 发表于 2020-3-17 15:29
demo board v1:
PD14/FMC_DA0
PD15/FMC_DA1
你的这个
PB7/FMC_NL --- 地址有效信
怎么没有用个地址线去控制,我们的DM9000就是地址线控制的。你这个是否合适。 你的电路图画的,是QSPI和FMC两种模式都想试一试吗;P
LAN9252要把EEPROM前6个word配对了,才算选定了I/O端口的配置。HBI/SPI/GPIO各有各的配置参数,IO针脚是复用的。
EEPROM可以用TwinCAT写,也可以用SOEM的eepromtool写。内容有个叫sii tool的开源软件,可以从xml编译成bin文件。
建议你先把Microchip网站上Lan9252相关的资料全看一遍。我打印了1909A的前12章,厚厚两本,都翻旧了,才搞明白。 请教下,有没有遇到过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);
请教下有没有大侠碰到过这个问题,有没有解决思路望指教。 我的H7 FMC 与9252 之间也遇到了相同的问题,想请问一下,你这个问题现在解决了? Qing 发表于 2023-11-19 23:33
我的H7 FMC 与9252 之间也遇到了相同的问题,想请问一下,你这个问题现在解决了?
注意FMC的MPU/Cache属性必须配置为Device或者Strongly order模式。 eric2013 发表于 2023-11-20 00:16
注意FMC的MPU/Cache属性必须配置为Device或者Strongly order模式。
感谢您的回复。 eric2013 发表于 2023-11-20 00:16
注意FMC的MPU/Cache属性必须配置为Device或者Strongly order模式。
感谢您的回复。
我的配置如下:
我之前使用的是 F407,FSMC使用的是相同的配置,现在换成了H7,时钟频率也调整到了跟F407同样的,F(S)MC 部分的电路连接也是一样的,但是H7上就是工作不正常。读不到数据。:'(
Qing 发表于 2023-11-20 12:14
感谢您的回复。
我的配置如下:
这个FMC的MPU/Cache属性配置不是Device或者Strongly order模式。
另外这个地址0x6400 0000是你的FMC地址吧 {:8:}学习学习 您好,我目前也遇到了同样的问题,您解决了吗? hanyudong 发表于 2024-3-30 18:59
您好,我目前也遇到了同样的问题,您解决了吗?
注意FMC驱动这个外设的地址空间MPU/Cache属性必须配置为Device或者Strongly order模式
页:
[1]