Flash_MX25L12833FM2I/Flash_MX25L12833FM2I.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, &reg, timeout);
SpiPortChipRelease(flashIO, timeout);
// Команда стирания сектора
SpiPortChipSelect(flashIO, timeout);
reg = 0x20;
SpiPortTransmit(flashIO, &reg, 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, &reg, 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, &reg, timeout);
SpiPortChipRelease(flashIO, timeout);
// Команда записи
SpiPortChipSelect(flashIO, timeout);
reg = 0x02;
SpiPortTransmit(flashIO, &reg, 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, &reg, timeout);
}
SpiPortChipRelease(flashIO, timeout);
return status;
}