FLASH или FRAM? FRAM вот
#define FM25V02_WREN 6
#define FM25V02_READ 3
#define FM25V02_WRITE 2
void FM25V02_Select(void);
void FM25V02_Unselect(void);
void FM25V02_SelectForRd(FM25V02_addr_t Addr){
FM25V02_Select();
FM25V02_SPI_Wr8(FM25V02_READ);
FM25V02_SPI_Wr8(Hi(Addr));
FM25V02_SPI_Wr8(Lo(Addr));
}
void FM25V02_SelectForWr(FM25V02_addr_t Addr){
FM25V02_Select();
FM25V02_SPI_Wr8(FM25V02_WREN);
FM25V02_Unselect();
FM25V02_Select();
FM25V02_SPI_Wr8(FM25V02_WRITE);
FM25V02_SPI_Wr8(Hi(Addr));
FM25V02_SPI_Wr8(Lo(Addr));
}
FM25V02_addr_t FM25V02_Wr(FM25V02_addr_t Dst, void* Src, FM25V02_addr_t Length){
unsigned int cnt= Length;
unsigned char* src = Src;
FM25V02_SelectForWr(Dst);
while(cnt--) FM25V02_SPI_Wr8( *src++);
FM25V02_Unselect();
return(Length);
}
FM25V02_addr_t FM25V02_Rd(FM25V02_addr_t Addr, void*Dst, FM25V02_addr_t Length){
char* dst = Dst;
int length = Length;
FM25V02_SelectForRd(Addr);
while(length--)*dst++= FM25V02_SPI_Rd8();
FM25V02_Unselect();
return(Length);
}
Для FLASH стянуто из линукса - mtd/devices/m25p80.c
только брал в варианте с DMA, кажись от embeddedARM TS-7200 - там основные по сути write_then_read и write_then_write, ну и побил ненужное