<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]);
测试结果:
作者:freeelectron
链接:bbs.21ic.com/icview-3301…
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新