ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
23 апреля
1029035 Топик полностью
Vit (20.08.2020 05:09, просмотров: 298) ответил POV_ на Рабочий код не покинешь? ))
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, ну и побил ненужное