1.簡(jiǎn)介
SFUD是一款開(kāi)源的串行 SPI Flash 通用驅(qū)動(dòng)庫(kù)。由于現(xiàn)有市面的串行 Flash 種類(lèi)居多,各個(gè) Flash 的規(guī)格及命令存在差異, SFUD 就是為了解決這些 Flash 的差異現(xiàn)狀而設(shè)計(jì),讓我們的產(chǎn)品能夠支持不同品牌及規(guī)格的 Flash,提高了涉及到 Flash 功能的軟件的可重用性及可擴(kuò)展性,同時(shí)也可以規(guī)避 Flash 缺貨或停產(chǎn)給產(chǎn)品所帶來(lái)的風(fēng)險(xiǎn)。 主要特點(diǎn):支持 SPI/QSPI 接口、面向?qū)ο螅ㄍ瑫r(shí)支持多個(gè) Flash 對(duì)象)、可靈活裁剪、擴(kuò)展性強(qiáng)、支持 4 字節(jié)地址。
2.SFUD移植
2.1硬件接口
這里使用的是STM32F407的單片機(jī),使用SPI1接口與Flash連接,F(xiàn)lash型號(hào)為W25Q16JV。電路圖如下:

2.2 添加源碼到工程中
首先下載SFUD的源碼,下載后可以看到,sfud文件夾中有三個(gè)子文件夾: Inc—頭文件 Port—接口文件 Src—源碼文件 然后用STM32CubeMx生成一個(gè)工程,初始化時(shí)鐘、SPI1和一個(gè)串口(用于打印信息)。SPI通訊格式如下:

生成工程后,將sfud文件夾復(fù)制到工程目錄,添加.c文件到工程中:

添加頭文件的包含路徑:

2.3編寫(xiě)底層函數(shù)
這里使用的是SPI接口,需要自己編寫(xiě)的只有兩個(gè)函數(shù),讀寫(xiě)和初始化:
static sfud_err spi_write_read(const sfud_spi *spi, const uint8_t *write_buf, size_t write_size, uint8_t *read_buf, size_t read_size)
sfud_err sfud_spi_port_init(sfud_flash *flash)如果使用的是QSPI,則需要編寫(xiě)下面這個(gè)函數(shù):
static sfud_err qspi_read(const struct __sfud_spi *spi, uint32_t addr, sfud_qspi_read_cmd_format *qspi_read_cmd_format,
uint8_t *read_buf, size_t read_size)
下載的源碼中有個(gè)STM32F1xx的工程例程,使用的是標(biāo)準(zhǔn)庫(kù),這里改為HAL庫(kù),具體代碼就不貼了,可在文章開(kāi)始下載完整工程。 需要注意的是,這里添加了幾個(gè)函數(shù):
static void spi_lock(const sfud_spi *spi)
{
// __disable_irq();
}
static void spi_unlock(const sfud_spi *spi)
{
// __enable_irq();
}
static void retry_delay(void)
{
HAL_Delay(1);
}
如果retry_delay使用了HAL_Delay做延時(shí),那spi_lock就不能關(guān)閉中斷,否則systick無(wú)法中斷,HAL_Delay函數(shù)會(huì)卡死。如果使用純軟件延時(shí)就不存在這個(gè)問(wèn)題。 接口文件修改好后,在sfud_cfg.h文件中添加FLASH型號(hào)的列表,列表中可以有多個(gè)器件型號(hào),也就是說(shuō)該驅(qū)動(dòng)庫(kù)支持同時(shí)讀寫(xiě)多個(gè)器件。這里只有一個(gè)W25Q16,列表如下:
enum {
SFUD_W25Q16_DEVICE_INDEX = 0,
};
#define SFUD_FLASH_DEVICE_TABLE
{
[SFUD_W25Q16_DEVICE_INDEX] = {.name = "W25Q16", .spi.name = "SPI1"},
}
最后將測(cè)試demo函數(shù)復(fù)制過(guò)來(lái),在main函數(shù)中初始化芯片,并調(diào)用demo函數(shù):
if (sfud_init() == SFUD_SUCCESS)
{
sfud_demo(0,sizeof(sfud_demo_test_buf),sfud_demo_test_buf);
}
在串口調(diào)試助手可以看到初始化以及讀寫(xiě)的一些打印信息:

審核編輯:郭婷
-
FlaSh
+關(guān)注
關(guān)注
10文章
1702瀏覽量
154235 -
接口
+關(guān)注
關(guān)注
33文章
9307瀏覽量
155708 -
SPI
+關(guān)注
關(guān)注
17文章
1840瀏覽量
99064 -
開(kāi)源
+關(guān)注
關(guān)注
3文章
3892瀏覽量
45352 -
SFUD
+關(guān)注
關(guān)注
0文章
7瀏覽量
1228
原文標(biāo)題:【開(kāi)源項(xiàng)目】SFUD--通用串口Flash驅(qū)動(dòng)庫(kù)的移植和使用
文章出處:【微信號(hào):嵌入式技術(shù)開(kāi)發(fā),微信公眾號(hào):嵌入式技術(shù)開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
通用bootloader選“支持spi flash”,無(wú)論設(shè)定download為片內(nèi)還是片外flash啟動(dòng)都找不到at45db161,為什么?
RT-Thread 5.1.0版本中調(diào)用rt_sfud_flash_probe()函數(shù)報(bào)錯(cuò)的原因?
通用bootloader無(wú)法使用45db161flash怎么解決?
使用SFUD配置QSPI和調(diào)試串口
SPI FLASH驅(qū)動(dòng)
RT-Thread Studio配置QSPI和SFUD的相關(guān)資料推薦
怎樣使用SPI模式去連接外部NorFlash呢
SPI Flash掛載FatFs異常是何原因?如何解決?
請(qǐng)教大神SFUD bench測(cè)試失敗的原因是什么?
【S32K146 RT-Thread】之 使用SFUD組件驅(qū)動(dòng)spi flash
SFUD驅(qū)動(dòng)庫(kù)實(shí)戰(zhàn)手冊(cè):串行SPI Flash開(kāi)發(fā)全流程解析

開(kāi)源的串行SPI Flash通用驅(qū)動(dòng)庫(kù)SFUD的應(yīng)用
評(píng)論