63 lines
2.3 KiB
C
63 lines
2.3 KiB
C
//
|
|
// Created by ilya on 09.02.23.
|
|
//
|
|
|
|
#include "Flash_MX25L12833FM2I_Cycle.h"
|
|
#include "Flash_MX25L12833FM2I.h"
|
|
#include "cmsis_os.h"
|
|
void Init_flash(Flash_workspace *env, uint32_t begin,uint32_t end,tSpiPortIO *spi)
|
|
{
|
|
env->env=env;
|
|
env->begin=begin;
|
|
env->currentRead=begin;
|
|
env->currentWrite=begin;
|
|
env->end=end;
|
|
env->spi=spi;
|
|
}
|
|
uint8_t flashMX25_readbyte (Flash_workspace *workspace,uint32_t timeout)
|
|
{
|
|
uint8_t buf=flashMX25_read( workspace->spi,workspace->currentRead,&buf,1, timeout);
|
|
return buf;
|
|
}
|
|
uint8_t flashMX25_writebyte (Flash_workspace *workspace,uint8_t buf,uint32_t timeout) {
|
|
flashMX25_write( workspace->spi,workspace->currentWrite,&buf,1, timeout);
|
|
return 0;
|
|
}
|
|
uint8_t flashMX25_receive (Flash_workspace *workspace,uint8_t *buf, int count,uint32_t timeout)
|
|
{
|
|
for (int i=0;i<count;i++)
|
|
{if ((workspace->currentRead!=workspace->currentWrite)&&(workspace->currentRead!=workspace->end))
|
|
{buf[i]= flashMX25_readbyte(workspace,timeout);workspace->currentRead++;}
|
|
else
|
|
{if (workspace->currentRead==workspace->currentWrite)
|
|
{return i;}
|
|
else
|
|
{if (workspace->currentRead<workspace->end)
|
|
{buf[i]= flashMX25_readbyte(workspace,timeout);workspace->currentRead++;}
|
|
else
|
|
{workspace->end+=0x001000;
|
|
flashMX25_SectorErase(workspace->spi,workspace->begin-0x001000,timeout);
|
|
workspace->currentRead=workspace->begin;i--;}}}
|
|
}
|
|
return count;}
|
|
uint8_t flashMX25_transmit (Flash_workspace *workspace,uint8_t *bufWrite, int count,uint32_t timeout)
|
|
{
|
|
for (int i = 0; i < count; i++) {
|
|
osDelay(100);
|
|
if (workspace->currentWrite >= workspace->currentRead) {
|
|
if (workspace->currentWrite != workspace->end) {
|
|
flashMX25_writebyte(workspace, bufWrite[i], timeout);
|
|
workspace->currentWrite++;
|
|
}
|
|
else {
|
|
workspace->begin += 0x001000;
|
|
workspace->currentWrite = workspace->begin;
|
|
i--;
|
|
}
|
|
} else {
|
|
flashMX25_writebyte(workspace, bufWrite[i], timeout);
|
|
workspace->currentWrite++;
|
|
if (workspace->currentWrite == (workspace->currentRead + 0x001000)) return 0;
|
|
}
|
|
}
|
|
return 0;} |