commit 34e3c899bad1b4ecfa8e0c42c978c7089bbed23b Author: cfif Date: Wed Dec 4 13:10:49 2024 +0300 Init diff --git a/Flash_MX25L12833FM2I.c b/Flash_MX25L12833FM2I.c new file mode 100644 index 0000000..eeeafe3 --- /dev/null +++ b/Flash_MX25L12833FM2I.c @@ -0,0 +1,141 @@ +// +// 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