본문 바로가기
임베디드 개발/TMS320F2838x (C28x)

W25Q64JV, SPI Interface NOR 플래시 메모리 데이터시트 분석

by eteo 2023. 7. 24.

 

 

TMS320F28388D DSP 사용 기준으로 작성되었다.

 

 

W25Q64JV 스펙

 

64Mbit(=8MB) 용량을 가진 Winbond사의 Serial Flash Memory이다.

 

 

 

 

 

 

 

 

 

 

Pin Configuration

 

 

다음과 같이 핀을 연결한다. 데이터시트를 보면 모든 instruction 직전에 /CS핀의 falling edge가 필요하므로 /CS핀을 GND에 묶어두거나 하는 건 안된다.

 

MCU SPI MOSI → Flash DI

MCU SPI MISO ← Flash DO

MCU SPI CLK Flash CLK

MCU CS용 GPIO  Flash /CS

 

작동전압은 2.7V to 3.6V이다.

 

 

 

 

 

 

 

 

 

SPI Baud Rate

 

TMS320F2838x 매뉴얼을 확인하면 설정 가능한 최대 SPI Baud Rate는 LSPCLK/4 이다. LSPCLK는 디폴트값이 SYSCLK/4 이므로 50MHz이기 때문에 SPI Baud Rate는 12.5Mbps까지 설정가능하다.

 

단, LSPCLK = SYSCLK / 1 으로 설정해 Low Speed Clock Frequency를 200MHz로 변경하면 SPI High speed mode를 enable하면 최대 50Mbps로 동작시킬 수 있다.

// device.c
SysCtl_setLowSpeedClock(SYSCTL_LSPCLK_PRESCALE_1);
// device.h
#define DEVICE_LSPCLK_FREQ          (DEVICE_SYSCLK_FREQ / 1)

 

 

 

 

 

Mode (CPOL, CPHA) 설정

 

플래시 메모리 데이터시트를 확인하면 Mode 0 (CPOL 0, CPHA 0)과 Mode 3 (CPOL 1, CPHA1)을 지원한다고 한다.

이 중 CLK 신호가 IDLE일 때 HIGH이고 Second Edge에서 Sampling 하는 Mode 3을 사용했다.

 

 

 

 

 

Mode 0과 Mode 3은 아래와 같은 차이가 있다.

 

 

 

 

TMS320F2838x SPI Operation 블락도

 

 

 

 

 

가장 먼저 할일은 SPI 송수신 함수를 만들고 Flash 인터페이스 용 드라이버 함수를 만든다. 데이터 시트의 커맨드셋 구조를 보면 전부 Command - Address - Data (IN or OUT) 으로 되어있으니 이를 참고해 파라미터로 커맨드, 주소, 송수신 버퍼, 데이터 길이를 받아 범용적으로 사용하게끔 만든다.

TMS320F2838x 칩의 경우 8bit 자료형이 존재하지 않는 특성때문에 일반 커맨드용 SPI transfer 함수랑 메모리/읽기 쓰기용 SPI transfer 함수를 따로 만들었다.

일부 커맨드는 Address랑 Data 사이에 Dummy Cycle이 들어가는 경우도 있는데 쓰지 않았다.

 

그 다음엔 가장 중요한 Read Status Registers 기능을 구현하고 Write Enable과 Read Identification 함수 등 기본 기능을 먼저 구현해서 ID를 읽고 데이터 시트에 나온 ID와 일치하면 플래시 메모리가 잘 붙은 것으로 판단할 수 있다.

 

보통 참고할만한 라이브러리를 찾아보니 erase, program 동작 전에는 Write Enable 커맨드로 WEL bit를 set하고, 동작 후에는 WIP bit가 clear될 때까지 polling으로 체크하고 빠져나오더라.

 

논블로킹으로 하려면 메모리 접근 전에 항상 BUSY bit이 클리어되어 있는지 먼저 체크한 뒤 read 작업은 바로 진행하면되고 erase, program 작업 전에는  Write Enable 커맨드로 WEL bit를 set해주는 방법이 있다. 나는 이런 방식으로 만들었다.

 

 

 

 

그 다음은 erase, program, read 등 필요한 드라이버 함수를 작성하면 된다. erase는 섹터 단위, program은 페이지 단위로 가능하고, read는 어떤 주소든 될 수 있다.

 

추가로 플래시 메모리를 circular buffer로 관리하기 위한 드라이버도 작성할 계획이다. 보통은 write, read pointer를 고정주소에 두고 관리하면 되지만 플래시의 경우 특정 섹터의 마모가 심해지는 것을 방지하기 위해 다른 방안으로 구현하여야 한다.