[技术相关] 【SWDM-QFP100-34SVEA3测评】+SFC外设学习

[复制链接]
 楼主| freeelectron 发表于 2023-5-12 10:51 | 显示全部楼层 |阅读模式
<
1、什么是SFC?
SFC是 Serial Flash Controller的缩写,即就是串行flash控制器。SWM341 系列集成一个SFC接口。
sfc-1.png

2、SFC特性
⚫ 支持 4 线快速读操作
⚫ Dummy clock 个数可配置
⚫ 读命令可配置
⚫ 读写操作仅支持 WORD
⚫ FLASH 读
◼ 标准模式
◼ 双线 IO 模式
◼ 四线 IO 模式
⚫ FLASH 写
◼ 标准模式
◼ 四线模式


3、硬件接口
sfc-3.png
用到的6个IO口依次是PD3~PD8;


SFC与外部SPI FLASH连接方式如下:
sfc-2.png
sfc-5.png
sfc-4.png
板载的SPI Flash为W25Q128JVSIQ。


4、程序配置
  1. <font size="2">typedef struct {
  2.         uint8_t ClkDiv;                                //SPI_SCLK是系统时钟的几分频,取值:SFC_CLKDIV_1、SFC_CLKDIV_2、SFC_CLKDIV_4、SFC_CLKDIV_8
  3.         uint8_t Cmd_Read;                        //读取SPI Flash用的指令码
  4.         uint8_t Width_Read;                        //读取SPI Flash时数据线位数,取值SFC_RDWIDTH_1、SFC_RDWIDTH_2、SFC_RDWIDTH_4
  5.         uint8_t Cmd_PageProgram;        //页编程SPI Flash用的指令码
  6.         uint8_t Width_PageProgram;        //页编程SPI Flash时数据线位数,取值SFC_PPWIDTH_1、SFC_PPWIDTH_4
  7. } SFC_InitStructure;</font>
主要是上面这个结构体,用于初始化SFC外设,Width_Read、Width_PageProgram主要配置使用几线接口的,这里我们都使用四线,
sfc-6.png


Cmd_Read、Cmd_PageProgram主要是与连接的SPI FLASH有关,要从相关的手册中找到读命令页编程命令:
sfc-7.png
sfc-8.png
可以看出Cmd_Read是0xEB,Cmd_PageProgram是0x32。


完整配置代码如下:
  1. void SFC_Config(void)
  2. {
  3.         SFC_InitStructure SFC_initStruct;
  4.        
  5.         /* SFC使用专用的FSPI(Flash SPI)接口连接SPI Flash */
  6.         PORT_Init(PORTD, PIN5, PORTD_PIN5_FSPI_SCLK,  0);
  7.         PORT_Init(PORTD, PIN6, PORTD_PIN6_FSPI_SSEL,  0);
  8.         PORT_Init(PORTD, PIN8, PORTD_PIN8_FSPI_MOSI,  1);
  9.         PORT_Init(PORTD, PIN7, PORTD_PIN7_FSPI_MISO,  1);
  10.         PORT_Init(PORTD, PIN3, PORTD_PIN3_FSPI_DATA2, 1);
  11.         PORT_Init(PORTD, PIN4, PORTD_PIN4_FSPI_DATA3, 1);

  12.                 SFC_initStruct.ClkDiv = SFC_CLKDIV_4;
  13.                 SFC_initStruct.Cmd_Read = 0xEB;
  14.                 SFC_initStruct.Width_Read = SFC_RDWIDTH_4;
  15.                 SFC_initStruct.Cmd_PageProgram = 0x32;
  16.                 SFC_initStruct.Width_PageProgram = SFC_PPWIDTH_4;

  17.         SFC_Init(&SFC_initStruct);
  18. }
读写测试代码:
  1. id = SFC_ReadJEDEC();
  2.        
  3.         printf("\r\nFlash JEDEC: %06X\r\n", id);
  4.        
  5.         printf("\r\nAfter Erase: \r\n");
  6.        
  7.         SFC_Erase(SPI_FLASH_ADDR, 1);
  8.        
  9.         SFC_Read(SPI_FLASH_ADDR, RdBuff, 20);
  10.         for(i = 0; i < 20; i++) printf("0x%X, ", RdBuff[i]);
  11.        
  12.         printf("\r\nAfter Write: \r\n");
  13.           
  14.         SFC_Write(SPI_FLASH_ADDR, WrBuff, 20);
  15.        
  16.         SFC_Read(SPI_FLASH_ADDR, RdBuff, 20);
  17.         for(i = 0; i < 20; i++) printf("0x%X, ", RdBuff[i]);
测试结果:
sfc-9.png



guijial511 发表于 2023-5-13 15:28 来自手机 | 显示全部楼层
改了个名而已
 楼主| freeelectron 发表于 2023-5-14 13:21 | 显示全部楼层

可能是吧
tpgf 发表于 2023-6-6 11:51 | 显示全部楼层
它主要实现两类功能,一是与Flash设备进行数据交互,二是对Flash设备进行管理和查询
nawu 发表于 2023-6-6 12:17 | 显示全部楼层
  数据交互主要通过直接访问(DAC)和间接访问(INDAC)两种方式实现,管理查询主要通过软件触发命令生成(STIG)方式实现。
aoyi 发表于 2023-6-6 13:16 | 显示全部楼层
  QSPI主要由AHB接口单元、APB接口单元、直接访问控制单元(以下简称“DAC”)、间接访问控制单元(以下简称“INDAC”)、Flash命令生成单元、SPI传输单元和SPI/Dual SPI/Qual SPI接口单元几部分组成
zljiu 发表于 2023-6-6 14:09 | 显示全部楼层
虽然大部分Flash设备不支持从POR进入到XIP模式,但均支持XIP模式
gwsan 发表于 2023-6-6 14:22 | 显示全部楼层
间接写操作可以最高效执行从处理器或DMA到Flash 设备的批量数据传输,Flash设备将使用最少的写周期完成此传输,从而有效提高设备寿命
tfqi 发表于 2023-6-6 14:42 | 显示全部楼层
由DAC、INDAC或STIG发送的请求均通过SPI Flash命令生成器转换为一串字节序列发送到底层SPI传输单元,再进行并串转换发送到外部Flash设备中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:stm32/LoRa物联网:304350312

65

主题

785

帖子

11

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