// // 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=0; --i) { address = ((uint8_t*)&addr)[i]; SpiPortTransmit(flashIO, &address, timeout); } // Запись данных for (uint32_t i=0; i