EEPROM 처럼 비휘발성 메모리를 사용하는 방법이 각각 달랐습니다.
(아.. 제가 사용한 방식이 각각 다 달랐다고 말씀드려야겠습니다.)
1. PSOC5는 EEPROM 과 emulate EEPROM 2가지를 사용할 수 있고,
2. PSOC4 4200 시리즈는 emulate EEPROM을 사용할 수 있었고,
3. PSOC4 4100M 시리즈는 Flash Memory 를 EEPROM 처럼 사용할 수 있었습니다.
PSOC4 4200 시리즈까지는 콤포넌트가 있으니까, 예제 불러다가 바로 이식해서 쓰는데 어려움이 없었는데,
PSOC4 4100M 시리즈는 콤포넌트 자체가 없어서 알아 보는데 시간이 좀 걸렸습니다.
SFlash 라는 메모리 영역이 있는데 바로 이 영역에 데이터를 쓰고 읽는 방법이 있었습니다.
PSoC 4 implements a User Supervisory Flash (SFlash), which can be used to store application-specific information.
These rows are not part of the hex file; their programming is optional.
나중에 예제를 검색해 보니 SFlash Write/Read 예제도 있었습니다.
PSOC 이 너무 쉬웠는데, 갑자기 콤포넌트에 없는 예외의 내용이 나오니까 잠시 허둥대 버렸네요. ^^
예제 내용을 보니까, 간단했습니다.
1. PSOC4 에는 User SFLSH 영역이 있고, 그 Address 는 0x0FFFF200 번지이다.
2. User SFLASH 의 영역를 구분하는 단위는 row 라고 부르고, 4개의 Row를 User SFLASH로 사용할 수 있다.
3. 1개의 Row는 128 Byte 이므로, 128 x 4 = 512 Byte 의 User SFLASH 를 EEPROM 처럼 사용할 수 있다.
4. 예제를 보니, 데이터는 1 Row 단위로 쓰는데.. 일반 Serial Flash 메모리 처럼 128 Byte 를 1 block 으로 생각하고
1 block 를 Erase 한 뒤에 다시 쓰는 방식으로 생각된다. 윈본드 serial Flash를 쓸 때를 예를 들자면, 지우지 않고 쓰면(Write) 값이 변하지 않는다. 그리고 쓸 때는 block(또는 sector) 단위로 쓴다.
SFLASH는 컴포넌트가 필요 없고, SFLASH를 사용하려면 다음과 같은 코드를 실행합니다.
SPIFLASH_SCBCLK_Start();
SPIFLASH_Start();
아, 위의 코드 이전에 어드레스 정의와 임시 데이터 저장 공간을 위해 SRAM 메모리 변수를 확보해야 겠습니다.
// Defines last ROW of SFlash
#define CY_DOOR_SFLASH_ROW (CY_SFLASH_NUMBER_USERROWS - 1u)
// Defines absolute address of ROW
#define CY_DOOR_SFLASH_ADDR (CY_SFLASH_USERBASE + CY_DOOR_SFLASH_ROW * CY_SFLASH_SIZEOF_USERROW)
// SRAM 메모리 130개 (130-Byte),, > 1 block(128-byte)
uint8_t card_key_data[13][10];
(의의 코드 설명)
디게 복잡하게 보이네요. CY_SFLASH_NUMBER_USERROWS 는 PSOC 에서 이미 만들어진 h 파일에 4라고 되어 있으니,
CY_DOOR_SFLASH_ROW 은 4-1 로 3이네요.
PSOC4 의 User SFLASH 로 사용할 수 있는 Row 값은 0~3 으로 4개이고, 그 중에 3번 Row(CY_DOOR_SFLASH_ROW)를 사용한다는 말이지요.
(예제를 그냥 베껴 썼더니, 복잡해져 버렸다. ^^ 죄송)
CY_SFLASH_USERBASE 는 PSOC 에서 이미 만들어진 h 파일에 0x0FFFF200u 로 User SFLASH 메모리의 시작 Address 입니다. CY_SFLASH_SIZEOF_USERROW 는 128 Byte(1 Row의 구성 단위)이므로 3번 Row의 시작 어드레스는 CY_DOOR_SFLASH_ADDR 으로 정의된 내용입니다.
[SFLASH 읽기/쓰기]
SFLASH에 데이터를 쓰는 과정은 다음과 같습니다.
1. 쓸(Write) 데이터를 1-row 단위(128-Byte)로 임시 저장 변수에 넣는다.
2. returnValue = CySysSFlashWriteUserRow(CY_DOOR_SFLASH_ROW, &card_key_data[0][0]); 의 예제 코드처럼, CySysSFlashWriteUserRow 함수에 입력으로 Row 번호 와 임시저장 변수의 시작 어드레스를 넣으면 출력으로 CY_SYS_SFLASH_SUCCESS 가 return되면 쓰기(Write)성공, 다른 값이 리턴되면 실패로 처리하면 됩니다.
SFLASH에서 데이터를 읽는 과정은 다음과 같습니다.
그냥 해당 어드레스의 값을 읽으면 됩니다. 아무 제약이 없습니다. 일반적으로 어드레스에서 데이터 읽기와 똑같습니다.
다들 아시죠?
이렇게 읽으면 p_mem_data 에 SFLASH의 해당 address의 값이 들어가게 되겠죠? ^^
uint8_t p_mem_data;
uint32_t cnt_sf=0;
p_mem_data = (*((uint8 *) (CY_DOOR_SFLASH_ADDR + cnt_sf)));
프로젝트 예제는 생략합니다. 프로젝트를 만들 때, 예제를 선택해서 SFLASH로 검색하면 예제 프로젝트 나옵니다.
저도 예제 프로젝트 변경해서 썼습니다. ^^
댓글 없음:
댓글 쓰기