SFUD는 오픈 소스 직렬 SPI 플래시 범용 드라이버 라이브러리입니다. 시장에는 많은 유형의 직렬 플래시가 있으므로 각 플래시의 사양과 명령은 다릅니다. SFUD는 이러한 플래시의 현재 차이를 해결하도록 설계되어 제품이 다양한 브랜드 및 사양의 플래시를 지원하고 플래시 기능과 관련된 소프트웨어의 재사용 성과 확장 성을 향상시킬 수 있으며 동시에 스톡 외부 또는 플래시 중단으로 제품에 가져올 위험을 피할 수 있습니다.
/sfud/inc/sfud_flash_def.h )에 제공된 플래시 매개 변수 정보 테이블 에서이 유형의 플래시가 지원되는지 여부를 쿼리합니다. 지원되지 않으면 구성 파일 에이 플래시의 매개 변수 정보를 추가 할 수 있습니다 (자세한 내용은 2.5 추가 라이브러리에서 지원되지 않는 플래시 참조). 플래시 사양을 얻은 후 플래시의 모든 작업을 달성 할 수 있습니다. 다음 표는 데모 플랫폼에서 실시간으로 테스트 된 모든 플래시를 보여줍니다. SFDP 표준을 지원하지 않는 플래시는 플래시 매개 변수 정보 테이블에 정의되었습니다. SFDP 표준을 지원하지 않는 더 많은 플래시는 향후 향상되고 유지되어야 합니다 (Github | Oschina | Coding) .
이 오픈 소스 프로젝트가 훌륭하다고 생각되면 프로젝트 홈페이지의 오른쪽 상단에 있는 별을 클릭하여 도움이 필요한 친구에게 추천 할 수 있습니다.
| 모델 | 제조업체 | 용량 | 최대 속도 | SFDP 표준 | QSPI 모드 | 주목 |
|---|---|---|---|---|---|---|
| W25Q40BV | 윈 본드 | 4MB | 50MHz | 지원되지 않습니다 | 더블 라인 | 생산이 중단되었습니다 |
| W25Q80DV | 윈 본드 | 8MB | 104MHz | 지원하다 | 더블 라인 | |
| W25Q16BV | 윈 본드 | 16MB | 104MHz | 지원되지 않습니다 | 더블 라인 | Slipperstree에 의해 |
| W25Q16CV | 윈 본드 | 16MB | 104MHz | 지원하다 | 테스트되지 않았습니다 | |
| W25Q16DV | 윈 본드 | 16MB | 104MHz | 지원하다 | 테스트되지 않았습니다 | Slipperstree에 의해 |
| W25Q32BV | 윈 본드 | 32MB | 104MHz | 지원하다 | 더블 라인 | |
| W25Q64CV | 윈 본드 | 64MB | 80MHz | 지원하다 | 4 라인 | |
| W25Q128BV | 윈 본드 | 128MB | 104MHz | 지원하다 | 4 라인 | |
| W25Q256FV | 윈 본드 | 256MB | 104MHz | 지원하다 | 4 라인 | |
| MX25L3206E | 마크로 닉스 | 32MB | 86MHz | 지원하다 | 더블 라인 | |
| MX25L3233F | 마크로 닉스 | 32MB | 133MHz | 지원하다 | 테스트되지 않았습니다 | Jiapengli에 의해 |
| KH25L4006E | 마크로 닉스 | 4MB | 86MHz | 지원하다 | 테스트되지 않았습니다 | Jiapengli에 의해 |
| KH25L3206E | 마크로 닉스 | 32MB | 86MHz | 지원하다 | 더블 라인 | |
| SST25VF016B | 마이크로 칩 | 16MB | 50MHz | 지원되지 않습니다 | 지원되지 않습니다 | SST는 Microchip에 의해 인수되었습니다 |
| M25P40 | 미크론 | 4MB | 75MHz | 지원되지 않습니다 | 테스트되지 않았습니다 | Redoccheng에 의해 |
| M25P80 | 미크론 | 8MB | 75MHz | 지원되지 않습니다 | 테스트되지 않았습니다 | Redoccheng에 의해 |
| M25P32 | 미크론 | 32MB | 75MHz | 지원되지 않습니다 | 지원되지 않습니다 | |
| EN25Q32B | 영겁 | 32MB | 104MHz | 지원되지 않습니다 | 테스트되지 않았습니다 | |
| GD25Q16B | 기가 데비 | 16MB | 120MHz | 지원되지 않습니다 | 테스트되지 않았습니다 | Tanekliang에 의해 |
| GD25Q32C | 기가 데비 | 32MB | 120MHz | 지원되지 않습니다 | 테스트되지 않았습니다 | Gaupen1186에 의해 |
| GD25Q64B | 기가 데비 | 64MB | 120MHz | 지원되지 않습니다 | 더블 라인 | |
| S25FL216K | 사이프러스 | 16MB | 65MHz | 지원되지 않습니다 | 더블 라인 | |
| S25FL032P | 사이프러스 | 32MB | 104MHz | 지원되지 않습니다 | 테스트되지 않았습니다 | yc_911에 의해 |
| S25FL164K | 사이프러스 | 64MB | 108MHz | 지원하다 | 테스트되지 않았습니다 | |
| A25L080 | 아미 | 8MB | 100MHz | 지원되지 않습니다 | 더블 라인 | |
| A25LQ64 | 아미 | 64MB | 104MHz | 지원하다 | 지원하다 | |
| F25L004 | ESMT | 4MB | 100MHz | 지원되지 않습니다 | 지원되지 않습니다 | |
| PCT25VF016B | PCT | 16MB | 80MHz | 지원되지 않습니다 | 지원되지 않습니다 | SST 라이센스는 SST25VF016B로 식별됩니다 |
| AT45DB161E | Adesto | 16MB | 85MHz | 지원되지 않습니다 | 지원되지 않습니다 | Adesto는 Atmel 직렬 플래시 제품 라인을 인수합니다 |
| NM25Q128EV | NOR_MEM | 128MB | 테스트되지 않았습니다 | 지원되지 않습니다 | 테스트되지 않았습니다 | SFDP는 정보를 읽고 32GB 이상으로 식별 할 수 있습니다. |
| P25D40H | 푸야 | 4MB | 테스트되지 않았습니다 | 지원하다 | 테스트되지 않았습니다 | Shan |
| P25Q80H | 푸야 | 8MB | 테스트되지 않았습니다 | 지원하다 | 테스트되지 않았습니다 | Shan |
참고 : QSPI 모드에서 더블 와이어는 더블 와이어 빠른 판독을 지원하며 4 와이어는 4 와이어 빠른 판독을 지원한다는 의미입니다.
일반적으로 4 라인의 빠른 독서를 지원하는 Flash는 2 라인 빠른 독서를 지원합니다.
먼저이 라이브러리 sfud_flash 에 주로 사용되는 구조를 설명해 봅시다. 그 정의는 /sfud/inc/sfud_def.h 에 있습니다. 각 SPI 플래시는 구조에 해당하며 구조 포인터는 종합적으로 플래시 장치 객체라고합니다. 초기화가 성공하면 일반적인 SPI 플래시 매개 변수가 sfud_flash->chip 구조에 저장됩니다. SPI Flash가 SFDP를 지원하는 경우 sfud_flash->sfdp 통해보다 포괄적 인 매개 변수 정보를 볼 수도 있습니다. 다음 함수 중 다수는 Flash Device 객체를 지정된 SPI 플래시에서 작업을 구현하기위한 첫 번째 항목 매개 변수로 사용합니다.
sfud_device_init 플래시 장치 테이블의 모든 장치를 초기화하기 위해 호출됩니다. 플래시가 하나만 있으면 단일 초기화에만 sfud_device_init 사용할 수 있습니다.
참고 : 초기화 된 SPI 플래시는 기본적으로 rite 보호되지 않았습니다 . Write-Protect를 활성화 해야하는 경우 SFUD_WRITE_STATUS 기능을 사용하여 SPI 플래시 상태를 수정하십시오.
sfud_err sfud_init ( void ) sfud_err sfud_device_init ( sfud_flash * flash )| 매개 변수 | 설명하다 |
|---|---|
| 플래시 | 초기화 할 플래시 장치 |
SFUD가 QSPI 모드를 켜면 SFUD의 플래시 드라이버는 QSPI 버스를 사용한 통신을 지원합니다. 기존 SPI 모드와 비교하여 QSPI를 사용하면 플래시 데이터의 판독을 가속화 할 수 있습니다. 그러나 데이터를 작성해야 할 때 플래시 자체의 데이터 작성 속도는 SPI 전송 속도보다 느리므로 QSPI 모드의 데이터 작성 속도가 크게 향상되지 않습니다.
따라서 SFUD의 QSPI 모드 지원은 빠른 읽기 명령으로 제한됩니다. 이 기능을 사용하면 Flash에서 사용하는 QSPI 버스의 실제 지원되는 최대 데이터 라인 너비를 다음과 같이 구성 할 수 있습니다. 1 라인 (기본값, 기존 SPI 모드), 2 줄 및 4 줄.
설정 후 SFUD는 현재 설정된 QSPI 버스 데이터 라인 너비를 QSPI 플래시 확장 정보 테이블에서 가장 적합하고 빠른 빠른 읽기 명령과 일치시킵니다. 그런 다음 사용자가 sfud_read ()를 호출하면 QSPI 모드 전송 함수를 사용하여 명령을 보냅니다.
sfud_err sfud_qspi_fast_read_enable ( sfud_flash * flash , uint8_t data_line_width )| 매개 변수 | 설명하다 |
|---|---|
| 플래시 | 플래시 장치 |
| data_line_width | QSPI 버스에서 지원하는 최대 데이터 라인 너비는 다음과 같습니다. 1, 2, 4 |
플래시 장치 테이블은 사용할 모든 플래시 장치 객체를 저장 해야하는 SFUD 구성 파일에 정의되므로 SFUD는 여러 플래시 장치를 동시에 구동 할 수 있도록 지원합니다. 장치 테이블의 구성은 /sfud/inc/sfud_cfg.h 의 SFUD_FLASH_DEVICE_TABLE 매크로에 정의되어 있습니다. 자세한 구성 방법은 2.3 구성 메소드 플래시를 참조하십시오). 이 메소드는 장치 테이블에서 플래시 장치를 인덱싱하여 플래시 장치 객체를 반환하고 장치 테이블 범위를 넘어 NULL 반환합니다.
sfud_flash * sfud_get_device ( size_t index )| 매개 변수 | 설명하다 |
|---|---|
| 색인 | 플래시 장치 테이블에있는 플래시 장치의 인덱스 값 |
sfud_err sfud_read ( const sfud_flash * flash , uint32_t addr , size_t size , uint8_t * data )| 매개 변수 | 설명하다 |
|---|---|
| 플래시 | 플래시 장치 객체 |
| addr | 시작 주소 |
| 크기 | 시작 주소에서 읽은 데이터의 총 크기 |
| 데이터 | 데이터를 읽습니다 |
참고 : Flash Chip의 지우기 세분성에 따라 지우기 작업이 정렬됩니다 (자세한 내용은 플래시 데이터 시트 참조, 일반적으로 블록 크기. 초기화가 완료된 후
sfud_flash->chip.erase_gran통해 볼 수 있습니다). 플래시 칩의 지우기 입자에 따라 시작 주소와 지우기 데이터 크기가 정렬되도록주의하십시오. 그렇지 않으면 지우기 작업을 수행 한 후 다른 데이터가 손실됩니다.
sfud_err sfud_erase ( const sfud_flash * flash , uint32_t addr , size_t size )| 매개 변수 | 설명하다 |
|---|---|
| 플래시 | 플래시 장치 객체 |
| addr | 시작 주소 |
| 크기 | 시작 주소에서 데이터 지우기의 총 크기 |
sfud_err sfud_chip_erase ( const sfud_flash * flash )| 매개 변수 | 설명하다 |
|---|---|
| 플래시 | 플래시 장치 객체 |
sfud_err sfud_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| 매개 변수 | 설명하다 |
|---|---|
| 플래시 | 플래시 장치 객체 |
| addr | 시작 주소 |
| 크기 | 시작 주소에서 작성된 데이터의 총 크기 |
| 데이터 | 작성해야 할 데이터 |
참고 : Flash Chip의 지우기 세분성에 따라 지우기 작업이 정렬됩니다 (자세한 내용은 플래시 데이터 시트 참조, 일반적으로 블록 크기. 초기화가 완료된 후
sfud_flash->chip.erase_gran통해 볼 수 있습니다). 플래시 칩의 지우기 입자에 따라 시작 주소와 지우기 데이터 크기가 정렬되도록주의하십시오. 그렇지 않으면 지우기 작업을 수행 한 후 다른 데이터가 손실됩니다.
sfud_err sfud_erase_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| 매개 변수 | 설명하다 |
|---|---|
| 플래시 | 플래시 장치 객체 |
| addr | 시작 주소 |
| 크기 | 시작 주소에서 작성된 데이터의 총 크기 |
| 데이터 | 작성해야 할 데이터 |
sfud_err sfud_read_status ( const sfud_flash * flash , uint8_t * status )| 매개 변수 | 설명하다 |
|---|---|
| 플래시 | 플래시 장치 객체 |
| 상태 | 현재 상태 레지스터 값 |
sfud_err sfud_write_status ( const sfud_flash * flash , bool is_volatile , uint8_t status )| 매개 변수 | 설명하다 |
|---|---|
| 플래시 | 플래시 장치 객체 |
| IS_VOLATILE | 놓치기 쉬운가요? 사실 : 놓치기 쉬우 며 정전 후 손실됩니다. |
| 상태 | 현재 상태 레지스터 값 |
모든 구성은 /sfud/inc/sfud_cfg.h 에 있습니다. 프로젝트에 적합한 구성을 선택하려면 아래 구성 소개를 참조하십시오.
SFUD_DEBUG_MODE 매크로 정의를 켜거나 끕니다
SFUD_USING_SFDP 매크로 정의를 켜거나 끄십시오
참고 : 닫으면
/sfud/inc/sfud_flash_def.h의 라이브러리가 제공 한 플래시 정보 테이블 만 쿼리됩니다. 이로 인해 소프트웨어의 적응성이 줄어들지 만 코드의 양이 줄어 듭니다.
SFUD_USING_FAST_READ 매크로 정의를 켜거나 끕니다. 많은 플래시 읽기 모드가 더 높은 SPI 주파수를 충족하지 못할 수 있습니다 (자세한 내용은 각 플래시의 데이터 시트 교환 특성을 참조하십시오). 빠른 읽기 모드를 활성화해야합니다.
참고 : 빠른 읽기 모드는 읽을 때 기본 널 바이트를 삽입하기 때문에 SPI 속도가 느려질 때 읽기 모드보다 느리게 느릴 수 있습니다.
SFUD_USING_FLASH_INFO_TABLE 매크로 정의 켜기/끄기
참고 : 닫으면이 라이브러리는 SFDP 사양을 지원하는 플래시만을 구동하며 코드 양을 적절하게 줄입니다. 또한 2.3.2와 2.3.3의 두 매크로 정의는 그중 하나 이상을 정의하며 두 가지 방법으로 선택할 수도 있습니다.
코드의 양을 추가로 줄이기 위해 SFUD_USING_SFDP 및 SFUD_USING_FLASH_INFO_TABLE 도 정의되지 않을 수 있습니다.
현재 플래시 장치를 정의 할 때 플래시 매개 변수를 지정한 다음 sfud_device_init 호출하여 장치를 초기화하십시오. 다음 코드를 참조하십시오.
sfud_flash sfud_norflash0 = {
. name = "norflash0" ,
. spi . name = "SPI1" ,
. chip = { "W25Q64FV" , SFUD_MF_ID_WINBOND , 0x40 , 0x17 , 8L * 1024L * 1024L , SFUD_WM_PAGE_256B , 4096 , 0x20 } };
......
sfud_device_init ( & sfud_norflash0 );
...... 제품에 여러 번의 플래시가있는 경우 플래시 장치 테이블을 추가 할 수 있습니다. SFUD_FLASH_DEVICE_TABLE 의 거시 정의를 수정하십시오. 예제는 다음과 같습니다.
enum {
SFUD_W25Q64CV_DEVICE_INDEX = 0 ,
SFUD_GD25Q64B_DEVICE_INDEX = 1 ,
};
#define SFUD_FLASH_DEVICE_TABLE
{
[SFUD_W25Q64CV_DEVICE_INDEX] = {.name = "W25Q64CV", .spi.name = "SPI1"},
[SFUD_GD25Q64B_DEVICE_INDEX] = {.name = "GD25Q64B", .spi.name = "SPI3"},
} 위의 두 가지 플래시 장치를 정의합니다 (대부분의 제품 중 하나는 충분합니다). 두 장치의 이름은 "W25Q64CV" 및 "GD25Q64B" 이며, 각각 두 개의 SPI 장치 이름 "SPI1" 및 "SPI3" 에 해당합니다 ( /sfud/port/sfud_port.c 에 위치한 SPI 인터페이스를 마이그레이션 할 때 사용됩니다). SFUD_W25Q16CV_DEVICE_INDEX 및 SFUD_GD25Q64B_DEVICE_INDEX 의 두 열거는 장치 테이블에서 두 장치의 인덱스를 정의합니다. sfud_get_device_table() 메소드를 통해 장치 테이블을 얻은 다음이 인덱스 값으로 지정된 장치에 액세스 할 수 있습니다.
SFUD_USING_QSPI 매크로 정의를 켜거나 끄십시오
활성화되면 SFUD는 QSPI 버스를 사용하여 연결된 플래시를 지원합니다.
포트 파일은 /sfud/port/sfud_port.c 에 있습니다. 파일의 sfud_err sfud_spi_port_init(sfud_flash *flash) 메소드는 라이브러리에서 제공하는 포트 메소드입니다. SPI 읽기 및 쓰기 드라이버 (필수), 레트리 타임 (필수), 레트리 인터페이스 (선택 사항) 및 SPI 잠금 (선택 사항)의 구성을 완료합니다. 자세한 포팅 컨텐츠는 데모의 각 플랫폼의 포팅 파일을 참조 할 수 있습니다.
여기에서 /sfud/inc/sfdu_flash_def.h 수정해야합니다. 지원되는 모든 플래시에 대해서는 SFUD_FLASH_CHIP_TABLE 매크로 정의를 참조하십시오. 미리 준비 해야하는 플래시 매개 변수는 다음과 같습니다. | 이름 | 제조업체 ID | ID 유형 | 용량 ID | 용량 | 쓰기 모드 | 지우기 세분성 (지우기의 최소 단위) | 세분성 해당 명령을 지우십시오 | . 여기서 우리는 Gigadevice를 사용하여 GD25Q64B 플래시를 예로 들어 보겠습니다.
이 플래시는 초기 생산 된 Gioyi Innovation 모델이므로 SFDP 표준을 지원하지 않습니다. 먼저 데이터 시트를 다운로드하고 0x9F 명령에 의해 반환 된 3 개의 ID를 찾아야합니다. 여기에는 마지막 두 바이트 ID, 즉 type id 및 capacity id 필요합니다. GD25Q64B 각각 0x40 및 0x17 에 해당합니다. 위에서 필요한 다른 플래시 매개 변수는 데이터 시트에서 찾을 수 있습니다. 여기서 우리는 작문 모드 에 중점을 둘 것입니다. 이 매개 변수는 라이브러리 자체에서 제공됩니다. 쓰기 모드에는 4 가지 유형이 있습니다. 자세한 내용은 파일 상단의 sfud_write_mode 열거 형식을 참조하십시오. 동일한 플래시는 상황에 따라 여러 쓰기 모드를 동시에 지원할 수 있습니다. GD25Q64B 의 경우 지원되는 쓰기 모드는 SFUD_WM_PAGE_256B , 즉 페이지 당 1-256 바이트를 작성해야합니다. 위의 GD25Q64B 와 결합하여 플래시 매개 변수는 다음과 같습니다.
{"GD25Q64B", SFUD_MF_ID_GIGADEVICE, 0x40, 0x17, 8*1024*1024, SFUD_WM_PAGE_256B, 4096, 0x20},
SFUD_FLASH_CHIP_TABLE 매크로 정의의 끝에 추가하여 GD25Q64B 에 대한 라이브러리의 지원을 완료하십시오.
현재 다음 플랫폼에서 데모를 지원했습니다
| 길 | 플랫폼 설명 |
|---|---|
| /demo/stm32f10x_non_os | STM32F10X 베어 메탈 플랫폼 |
| /데모/STM32F2XX_RTT | STM32F2XX + RT- 스레드 운영 체제 플랫폼 |
| /demo/stm32l475_non_os_qspi | STM32L475 + QSPI 모드 베어 메탈 플랫폼 |
| /demo/esp32_ext_spi_flash | ESP32C3 + SPI 외부 플래시 ESP-IDF 프레임 워크 |
MIT 오픈 소스 프로토콜을 사용하십시오. 자세한 내용은 프로젝트에서 라이센스 파일의 내용을 읽으십시오.