打印
[技术相关]

【SWDM-QFP100-34SVEA3测评】+SFC外设学习

[复制链接]
1133|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1、什么是SFC?
SFC是 Serial Flash Controller的缩写,即就是串行flash控制器。SWM341 系列集成一个SFC接口。


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


3、硬件接口

用到的6个IO口依次是PD3~PD8;


SFC与外部SPI FLASH连接方式如下:



板载的SPI Flash为W25Q128JVSIQ。


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



Cmd_Read、Cmd_PageProgram主要是与连接的SPI FLASH有关,要从相关的手册中找到读命令页编程命令:


可以看出Cmd_Read是0xEB,Cmd_PageProgram是0x32。


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

                SFC_initStruct.ClkDiv = SFC_CLKDIV_4;
                SFC_initStruct.Cmd_Read = 0xEB;
                SFC_initStruct.Width_Read = SFC_RDWIDTH_4;
                SFC_initStruct.Cmd_PageProgram = 0x32;
                SFC_initStruct.Width_PageProgram = SFC_PPWIDTH_4;

        SFC_Init(&SFC_initStruct);
}
读写测试代码:
id = SFC_ReadJEDEC();
       
        printf("\r\nFlash JEDEC: %06X\r\n", id);
       
        printf("\r\nAfter Erase: \r\n");
       
        SFC_Erase(SPI_FLASH_ADDR, 1);
       
        SFC_Read(SPI_FLASH_ADDR, RdBuff, 20);
        for(i = 0; i < 20; i++) printf("0x%X, ", RdBuff[i]);
       
        printf("\r\nAfter Write: \r\n");
          
        SFC_Write(SPI_FLASH_ADDR, WrBuff, 20);
       
        SFC_Read(SPI_FLASH_ADDR, RdBuff, 20);
        for(i = 0; i < 20; i++) printf("0x%X, ", RdBuff[i]);
测试结果:




使用特权

评论回复

相关帖子

沙发
guijial511| | 2023-5-13 15:28 | 只看该作者
改了个名而已

使用特权

评论回复
板凳
freeelectron|  楼主 | 2023-5-14 13:21 | 只看该作者

可能是吧

使用特权

评论回复
地板
tpgf| | 2023-6-6 11:51 | 只看该作者
它主要实现两类功能,一是与Flash设备进行数据交互,二是对Flash设备进行管理和查询

使用特权

评论回复
5
nawu| | 2023-6-6 12:17 | 只看该作者
  数据交互主要通过直接访问(DAC)和间接访问(INDAC)两种方式实现,管理查询主要通过软件触发命令生成(STIG)方式实现。

使用特权

评论回复
6
aoyi| | 2023-6-6 13:16 | 只看该作者
  QSPI主要由AHB接口单元、APB接口单元、直接访问控制单元(以下简称“DAC”)、间接访问控制单元(以下简称“INDAC”)、Flash命令生成单元、SPI传输单元和SPI/Dual SPI/Qual SPI接口单元几部分组成

使用特权

评论回复
7
zljiu| | 2023-6-6 14:09 | 只看该作者
虽然大部分Flash设备不支持从POR进入到XIP模式,但均支持XIP模式

使用特权

评论回复
8
gwsan| | 2023-6-6 14:22 | 只看该作者
间接写操作可以最高效执行从处理器或DMA到Flash 设备的批量数据传输,Flash设备将使用最少的写周期完成此传输,从而有效提高设备寿命

使用特权

评论回复
9
tfqi| | 2023-6-6 14:42 | 只看该作者
由DAC、INDAC或STIG发送的请求均通过SPI Flash命令生成器转换为一串字节序列发送到底层SPI传输单元,再进行并串转换发送到外部Flash设备中

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

65

主题

785

帖子

11

粉丝