STM32之KSZ8851的FMC配置问题

7 篇文章 0 订阅

感谢支持,说实话很久没写博客了,毕竟靠爱发电真的很无奈,不过有人支持了,就再更新一篇。

刚好问到关于KSZ8851的FMC配置问题,主要这个片子网上资料较少,可能用的人比较少吧,这是一款网络芯片,其实STM32本身就有网络功能,而使用FMC驱动KSZ8851的时候,是把它当成是NOR FLASH类型来用的。

之前写的关于KSZ8851的驱动100%能用,而且我最近刚把它从M4的单片机移植到H7的单片机上,亲测可用。今天以STM32F37II为例说一下关于FMC的驱动。

首先第一步要配置IO引脚,然后第二步再配置FMC功能,H7的单片机型号为STM32H743IITx,比起M4来,多了一步MPU的配置。先说M4的单片机,程序如下:


/*    
*********************************************************************************************************
*
* 模块名称 : ksz8851并口驱动
* 文件名称 : 
* 版    本 : 
* 说    明 : 
*
*
*********************************************************************************************************
*/

#include "bsp.h"

  /*     KSZ8851 的 GPIO :
    PD0/FSMC_D2
    PD1/FSMC_D3
    PD4/FSMC_NOE
    PD5/FSMC_NWE
    PD8/FSMC_D13
    PD9/FSMC_D14
    PD10/FSMC_D15
    PD14/FSMC_D0
    PD15/FSMC_D1

    PE7/FSMC_D4
    PE8/FSMC_D5
    PE9/FSMC_D6
    PE10/FSMC_D7
    PE11/FSMC_D8
    PE12/FSMC_D9
    PE13/FSMC_D10
    PE14/FSMC_D11
    PE15/FSMC_D12

    PF0/FSMC_A0
    PD7/FSMC_NE1 --- ksz8851_1片选主信号
    PG9/FSMC_NE2 --- ksz8851_2片选主信号
  */

/*    
*********************************************************************************************************
* 函 数 名: bsp_InitKSZ8851
* 功能说明: 配置连接KSZ8851的GPIO和FSMC
* 形    参:  无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_Initfmc_ksz8851(void)
{
  FMC_NORSRAMInitTypeDef  FMC_NORSRAMInitStructure;
  FMC_NORSRAMTimingInitTypeDef  p;
  GPIO_InitTypeDef GPIO_InitStructure;

  /*     使能GPIO时钟 */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | 
                          RCC_AHB1Periph_GPIOG, ENABLE);

  /*     使能 FSMC 时钟 */
  RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE);

  /*     GPIOD configuration */
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FMC);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 |
                      GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD, &GPIO_InitStructure);  /*     GPIOD */

  /*     GPIOE configuration */
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FMC);

  GPIO_InitStructure.GPIO_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;
  GPIO_Init(GPIOE, &GPIO_InitStructure);  /*     GPIOE */

  /*     GPIOF configuration */
  GPIO_PinAFConfig(GPIOF, GPIO_PinSource0 , GPIO_AF_FMC);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_Init(GPIOF, &GPIO_InitStructure);  /*     GPIOF */

  /*     GPIOG configuration */
  GPIO_PinAFConfig(GPIOG, GPIO_PinSource9 , GPIO_AF_FMC);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_Init(GPIOG, &GPIO_InitStructure);  /*     GPIOG */
  
  /*    -- FSMC Configuration ------------------------------------------------------*/
  p.FMC_AddressSetupTime = 4U;    /*      */
  p.FMC_AddressHoldTime = 3U;
  p.FMC_DataSetupTime = 21U;     /*     168/12=14 */
  p.FMC_BusTurnAroundDuration = 0U;
  p.FMC_CLKDivision = 0U;
  p.FMC_DataLatency = 0U;
  p.FMC_AccessMode = FMC_AccessMode_A;

  FMC_NORSRAMInitStructure.FMC_Bank = FMC_Bank1_NORSRAM1;
  FMC_NORSRAMInitStructure.FMC_DataAddressMux = FMC_DataAddressMux_Disable;
  FMC_NORSRAMInitStructure.FMC_MemoryType = FMC_MemoryType_SRAM;
  FMC_NORSRAMInitStructure.FMC_MemoryDataWidth = FMC_NORSRAM_MemoryDataWidth_16b;
  FMC_NORSRAMInitStructure.FMC_BurstAccessMode = FMC_BurstAccessMode_Disable;
  FMC_NORSRAMInitStructure.FMC_AsynchronousWait = FMC_AsynchronousWait_Disable;
  FMC_NORSRAMInitStructure.FMC_WaitSignalPolarity = FMC_WaitSignalPolarity_Low;
  FMC_NORSRAMInitStructure.FMC_WrapMode = FMC_WrapMode_Disable;
  FMC_NORSRAMInitStructure.FMC_WaitSignalActive = FMC_WaitSignalActive_BeforeWaitState;
  FMC_NORSRAMInitStructure.FMC_WriteOperation = FMC_WriteOperation_Enable;
  FMC_NORSRAMInitStructure.FMC_WaitSignal = FMC_WaitSignal_Disable;
  FMC_NORSRAMInitStructure.FMC_ExtendedMode = FMC_ExtendedMode_Disable;
  FMC_NORSRAMInitStructure.FMC_WriteBurst = FMC_WriteBurst_Disable;
  FMC_NORSRAMInitStructure.FMC_ContinousClock = FMC_CClock_SyncOnly;
  FMC_NORSRAMInitStructure.pFMC_ReadWriteTimingStruct = &p;
  FMC_NORSRAMInitStructure.pFMC_WriteTimingStruct = &p;

  FMC_NORSRAMInit(&FMC_NORSRAMInitStructure);
  FMC_NORSRAMCmd(FMC_Bank1_NORSRAM1, ENABLE);  /*    !< Enable FSMC Bank1_SRAM1 Bank */

  FMC_NORSRAMInitStructure.FMC_Bank = FMC_Bank1_NORSRAM2;
  FMC_NORSRAMInit(&FMC_NORSRAMInitStructure);
  FMC_NORSRAMCmd(FMC_Bank1_NORSRAM2, ENABLE);  /*    !< Enable FSMC Bank1_SRAM2 Bank */
}

/*    ************************************************* (END OF FILE) *********************************/

应用场景是用FMC驱动两块KSZ8851芯片。头文件里面是其他工程用的文件,使用这个C文件记得添加对应的HAL库头文件即可。

推荐使用CUBE神器来配置工程,参考代码选择,或者如果单片机型号类似,可以照搬。

驱动8851的程序在文章《STM32之KSZ8851》已经给出,不再复述。

关于应用程序写上初始化的吧:

bsp_Initfmc_ksz8851();            /* 初始化KSZ8851并口*/
ksz8851_init(); 

另外8851的芯片片选是由FMC自己控制的,但是8851外部有硬件复位信号和电源管理信号,如果用不到的话,就给高电平就可以了。下一篇贴出H7的驱动程序,H7比M4多了一步MPU,不配置的话FMC不好用。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值