142 lines
3.6 KiB
C
142 lines
3.6 KiB
C
//
|
|
// Created by ilya on 01.02.23.
|
|
//
|
|
|
|
|
|
|
|
#include "Flash_MX25L12833FM2I.h"
|
|
#include "SystemDelayInterface.h"
|
|
|
|
|
|
uint8_t flashMX25_read_status(tSpiPortIO *flashIO, uint32_t timeout) {
|
|
uint16_t operation = 0x05;
|
|
uint16_t dummy = 0x00;
|
|
uint16_t back;
|
|
|
|
SpiPortChipSelect(flashIO, timeout);
|
|
|
|
SpiPortTransmit(flashIO, &operation, timeout);
|
|
|
|
uint32_t endMs = SystemGetMs() + timeout;
|
|
uint16_t status = 1;
|
|
|
|
// Ожидание готовности
|
|
while ((status) && (endMs > SystemGetMs())) {
|
|
SpiPortTransmit(flashIO, &dummy, timeout);
|
|
SpiPortReceive(flashIO, &status, timeout);
|
|
}
|
|
|
|
SpiPortChipRelease(flashIO, timeout);
|
|
|
|
if (endMs < SystemGetMs())
|
|
return 0xFF;
|
|
|
|
return status;
|
|
}
|
|
|
|
uint16_t flashMX25_read_id(tSpiPortIO *flashIO, uint32_t timeout, uint8_t *buf) {
|
|
uint16_t operation = 0x9F;
|
|
uint16_t dummy = 0x00;
|
|
uint16_t back=0;
|
|
uint8_t id1=0;
|
|
uint16_t id2=0;
|
|
|
|
SpiPortChipSelect(flashIO, timeout);
|
|
|
|
SpiPortTransmit(flashIO, &operation, timeout);
|
|
|
|
for (uint32_t i=0; i<3; ++i) {
|
|
SpiPortReceive(flashIO, &back, timeout);
|
|
buf[i] = back;
|
|
}
|
|
|
|
SpiPortChipRelease(flashIO, timeout);
|
|
return (id2 << 8) | id1;
|
|
}
|
|
|
|
uint8_t flashMX25_SectorErase(tSpiPortIO *flashIO, uint32_t addr, uint32_t timeout) {
|
|
uint16_t reg;
|
|
uint16_t address=0;
|
|
|
|
// Команда разрешения записи
|
|
SpiPortChipSelect(flashIO, timeout);
|
|
reg = 0x06;
|
|
SpiPortTransmit(flashIO, ®, timeout);
|
|
SpiPortChipRelease(flashIO, timeout);
|
|
|
|
// Команда стирания сектора
|
|
SpiPortChipSelect(flashIO, timeout);
|
|
reg = 0x20;
|
|
SpiPortTransmit(flashIO, ®, timeout);
|
|
// Запись адреса
|
|
for (int i=2; i>=0; --i) {
|
|
address = ((uint8_t*)&addr)[i];
|
|
SpiPortTransmit(flashIO, &address, timeout);
|
|
}
|
|
SpiPortChipRelease(flashIO, timeout);
|
|
|
|
uint8_t status = flashMX25_read_status(flashIO, timeout);
|
|
if (status != 0)
|
|
return status;
|
|
return status;
|
|
}
|
|
|
|
uint8_t flashMX25_read(tSpiPortIO *flashIO, uint32_t addr, uint8_t* bufRead, uint32_t total_len, uint32_t timeout) {
|
|
uint16_t reg=0;
|
|
uint16_t address=0;
|
|
uint16_t back=0;
|
|
|
|
SpiPortChipSelect(flashIO, timeout);
|
|
// Команда чтения
|
|
reg = 0x03;
|
|
SpiPortTransmit(flashIO, ®, timeout);
|
|
// Запись адреса
|
|
for (int i=2; i>=0; --i) {
|
|
address = ((uint8_t*)&addr)[i];
|
|
SpiPortTransmit(flashIO, &address, timeout);
|
|
}
|
|
// Чтение данных
|
|
for (uint32_t i=0; i<total_len; ++i) {
|
|
SpiPortReceive(flashIO, &back, timeout);
|
|
bufRead[i] = back;
|
|
}
|
|
SpiPortChipRelease(flashIO, timeout);
|
|
|
|
return back;
|
|
}
|
|
|
|
uint8_t flashMX25_write(tSpiPortIO *flashIO, uint32_t addr, uint8_t *bufWrite, uint32_t total_len, uint32_t timeout) {
|
|
|
|
uint16_t reg=0;
|
|
uint16_t address=0;
|
|
uint16_t back=0;
|
|
uint8_t status=0;
|
|
|
|
// Команда разрешения записи
|
|
SpiPortChipSelect(flashIO, timeout);
|
|
reg = 0x06;
|
|
SpiPortTransmit(flashIO, ®, timeout);
|
|
SpiPortChipRelease(flashIO, timeout);
|
|
|
|
|
|
// Команда записи
|
|
SpiPortChipSelect(flashIO, timeout);
|
|
reg = 0x02;
|
|
SpiPortTransmit(flashIO, ®, timeout);
|
|
// Запись адреса
|
|
for (int i=2; i>=0; --i) {
|
|
address = ((uint8_t*)&addr)[i];
|
|
SpiPortTransmit(flashIO, &address, timeout);
|
|
}
|
|
// Запись данных
|
|
for (uint32_t i=0; i<total_len; ++i) {
|
|
reg = bufWrite[i];
|
|
SpiPortTransmit(flashIO, ®, timeout);
|
|
}
|
|
SpiPortChipRelease(flashIO, timeout);
|
|
|
|
return status;
|
|
}
|
|
|
|
|