Init
This commit is contained in:
commit
96b1064f8e
|
|
@ -0,0 +1,18 @@
|
|||
//
|
||||
// Created by cfif on 28.09.22.
|
||||
//
|
||||
|
||||
#ifndef Flash_MT29F2G01ABAGDWB_H
|
||||
#define Flash_MT29F2G01ABAGDWB_H
|
||||
|
||||
#include "inttypes.h"
|
||||
#include "cmsis_os.h"
|
||||
#include "SpiPort.h"
|
||||
|
||||
extern void spi_flash_unblock(tSpiPortIO *flashIO, uint32_t timeout);
|
||||
extern uint8_t spi_flash_page_read(tSpiPortIO *flashIO, uint32_t addr, uint8_t* bufRead, uint32_t total_len, uint32_t timeout);
|
||||
extern uint8_t spi_flash_page_write(tSpiPortIO *flashIO, uint32_t addr, uint8_t* bufWrite, uint32_t total_len, uint32_t timeout);
|
||||
extern uint8_t spi_flash_erase(tSpiPortIO *flashIO, uint16_t address, uint32_t timeout);
|
||||
|
||||
|
||||
#endif //Flash_MT29F2G01ABAGDWB_H
|
||||
|
|
@ -0,0 +1,286 @@
|
|||
//
|
||||
// Created by cfif on 16.09.22.
|
||||
//
|
||||
#include "Flash_MT29F2G01ABAGDWB.h"
|
||||
#include "SystemDelayInterface.h"
|
||||
|
||||
// Чтение регистров
|
||||
uint8_t spi_flash_read_reg(tSpiPortIO *flashIO, uint16_t address, uint32_t timeout) {
|
||||
uint16_t operation = 0x0F;
|
||||
uint16_t back;
|
||||
|
||||
SpiPortChipSelect(flashIO, timeout);
|
||||
|
||||
SpiPortTransmit(flashIO, &operation, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
|
||||
SpiPortTransmit(flashIO, &address, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
|
||||
SpiPortTransmit(flashIO, &address, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
|
||||
SpiPortChipRelease(flashIO, timeout);
|
||||
|
||||
return back;
|
||||
}
|
||||
|
||||
uint8_t spi_flash_read_status(tSpiPortIO *flashIO, uint32_t timeout) {
|
||||
uint16_t operation = 0x0F;
|
||||
uint16_t address = 0xC0;
|
||||
uint16_t back;
|
||||
|
||||
SpiPortChipSelect(flashIO, timeout);
|
||||
|
||||
SpiPortTransmit(flashIO, &operation, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
|
||||
SpiPortTransmit(flashIO, &address, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
|
||||
uint32_t endMs = SystemGetMs() + timeout;
|
||||
uint16_t status = 1;
|
||||
|
||||
// Ожидание готовности
|
||||
while ((status) && (endMs > SystemGetMs())) {
|
||||
SpiPortTransmit(flashIO, &address, timeout);
|
||||
SpiPortReceive(flashIO, &status, timeout);
|
||||
}
|
||||
|
||||
SpiPortChipRelease(flashIO, timeout);
|
||||
|
||||
if (endMs < SystemGetMs())
|
||||
return 0xFF;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
uint16_t spi_flash_read_id(tSpiPortIO *flashIO, uint32_t timeout) {
|
||||
uint16_t operation = 0x9F;
|
||||
uint16_t dummy = 0x00;
|
||||
uint16_t back;
|
||||
uint8_t id1;
|
||||
uint8_t id2;
|
||||
|
||||
SpiPortChipSelect(flashIO, timeout);
|
||||
|
||||
SpiPortTransmit(flashIO, &operation, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
|
||||
SpiPortTransmit(flashIO, &dummy, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
|
||||
|
||||
SpiPortTransmit(flashIO, &dummy, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
id1 = back;
|
||||
|
||||
SpiPortTransmit(flashIO, &dummy, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
id2 = back;
|
||||
|
||||
SpiPortChipRelease(flashIO, timeout);
|
||||
|
||||
return (id2 << 8) | id1;
|
||||
}
|
||||
|
||||
|
||||
// Запись регистров
|
||||
void spi_flash_write_reg(tSpiPortIO *flashIO, uint16_t address, uint16_t reg, uint32_t timeout) {
|
||||
uint16_t operation = 0x1F;
|
||||
uint16_t back;
|
||||
|
||||
SpiPortChipSelect(flashIO, timeout);
|
||||
|
||||
SpiPortTransmit(flashIO, &operation, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
|
||||
SpiPortTransmit(flashIO, &address, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
|
||||
SpiPortTransmit(flashIO, ®, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
|
||||
SpiPortChipRelease(flashIO, timeout);
|
||||
}
|
||||
|
||||
// Стирание
|
||||
uint8_t spi_flash_erase(tSpiPortIO *flashIO, uint16_t addr, uint32_t timeout) {
|
||||
uint16_t reg;
|
||||
uint16_t back;
|
||||
uint16_t address;
|
||||
|
||||
// Команда разрешения записи
|
||||
SpiPortChipSelect(flashIO, timeout);
|
||||
reg = 0x06;
|
||||
SpiPortTransmit(flashIO, ®, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
SpiPortChipRelease(flashIO, timeout);
|
||||
|
||||
// Команда стирания блока 64
|
||||
SpiPortChipSelect(flashIO, timeout);
|
||||
reg = 0xD8;
|
||||
SpiPortTransmit(flashIO, ®, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
// Запись адреса (флеш)
|
||||
for (int i=2; i>=0; --i) {
|
||||
address = ((uint8_t*)&addr)[i];
|
||||
SpiPortTransmit(flashIO, &address, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
}
|
||||
SpiPortChipRelease(flashIO, timeout);
|
||||
|
||||
uint8_t status = spi_flash_read_status(flashIO, timeout);
|
||||
if (status != 0)
|
||||
return status;
|
||||
|
||||
// Команда запрещения записи
|
||||
// SpiPortChipSelect(flashIO, timeout);
|
||||
// reg = 0x04;
|
||||
// SpiPortTransmit(flashIO, ®, timeout);
|
||||
// SpiPortReceive(flashIO, &back, timeout);
|
||||
// SpiPortChipRelease(flashIO, timeout);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
void spi_flash_unblock(tSpiPortIO *flashIO, uint32_t timeout) {
|
||||
|
||||
uint16_t id1 = spi_flash_read_id(flashIO, timeout);
|
||||
uint16_t B0_1 = spi_flash_read_reg(flashIO, 0xB0, timeout);
|
||||
uint16_t A0_1 = spi_flash_read_reg(flashIO, 0xA0, timeout);
|
||||
|
||||
spi_flash_write_reg(flashIO, 0xB0, 0, timeout);
|
||||
spi_flash_write_reg(flashIO, 0xA0, 0, timeout);
|
||||
|
||||
uint16_t id2 = spi_flash_read_id(flashIO, timeout);
|
||||
uint16_t B0_2 = spi_flash_read_reg(flashIO, 0xB0, timeout);
|
||||
uint16_t A0_2 = spi_flash_read_reg(flashIO, 0xA0, timeout);
|
||||
|
||||
uint16_t a = 0;
|
||||
|
||||
}
|
||||
|
||||
// Максиальная длина равна 2176
|
||||
uint8_t spi_flash_page_read(tSpiPortIO *flashIO, uint32_t addr, uint8_t* bufRead, uint32_t total_len, uint32_t timeout) {
|
||||
uint16_t reg;
|
||||
uint16_t address;
|
||||
uint16_t addressCache;
|
||||
uint16_t back;
|
||||
|
||||
SpiPortChipSelect(flashIO, timeout);
|
||||
// Команда чтения в кэш
|
||||
reg = 0x13;
|
||||
SpiPortTransmit(flashIO, ®, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
// Запись адреса (флеш)
|
||||
for (int i=2; i>=0; --i) {
|
||||
address = ((uint8_t*)&addr)[i];
|
||||
SpiPortTransmit(flashIO, &address, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
}
|
||||
SpiPortChipRelease(flashIO, timeout);
|
||||
|
||||
uint8_t status = spi_flash_read_status(flashIO, timeout);
|
||||
if (status != 0)
|
||||
return status;
|
||||
|
||||
SpiPortChipSelect(flashIO, timeout);
|
||||
// Команда чтения из кэш
|
||||
reg = 0x03;
|
||||
SpiPortTransmit(flashIO, ®, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
// Запись адреса (кэш)
|
||||
addressCache = (((addr >> 6) & 1) << 12);
|
||||
for (int i=1; i>=0; --i) {
|
||||
address = ((uint8_t*)&addressCache)[i];
|
||||
SpiPortTransmit(flashIO, &address, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
}
|
||||
// Запись байта ожидания
|
||||
SpiPortTransmit(flashIO, &address, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
// Чтение данных
|
||||
for (uint32_t i=0; i<total_len; ++i) {
|
||||
SpiPortTransmit(flashIO, &address, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
bufRead[i] = back;
|
||||
}
|
||||
SpiPortChipRelease(flashIO, timeout);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
uint8_t spi_flash_page_write(tSpiPortIO *flashIO, uint32_t addr, uint8_t *bufWrite, uint32_t total_len, uint32_t timeout) {
|
||||
|
||||
uint16_t reg;
|
||||
uint16_t address;
|
||||
uint16_t addressCache;
|
||||
uint16_t back;
|
||||
uint8_t status;
|
||||
|
||||
// Стирание
|
||||
status = spi_flash_erase(flashIO, addr, timeout);
|
||||
if (status != 0)
|
||||
return status;
|
||||
|
||||
// Команда разрешения записи
|
||||
SpiPortChipSelect(flashIO, timeout);
|
||||
reg = 0x06;
|
||||
SpiPortTransmit(flashIO, ®, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
SpiPortChipRelease(flashIO, timeout);
|
||||
|
||||
|
||||
// Команда записи в кэш
|
||||
SpiPortChipSelect(flashIO, timeout);
|
||||
reg = 0x02;
|
||||
SpiPortTransmit(flashIO, ®, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
// Запись адреса (кэш)
|
||||
addressCache = (((addr >> 6) & 1) << 12);
|
||||
for (int i=1; i>=0; --i) {
|
||||
address = ((uint8_t*)&addressCache)[i];
|
||||
SpiPortTransmit(flashIO, &address, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
}
|
||||
// Запись данных
|
||||
for (uint32_t i=0; i<total_len; ++i) {
|
||||
reg = bufWrite[i];
|
||||
SpiPortTransmit(flashIO, ®, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
}
|
||||
SpiPortChipRelease(flashIO, timeout);
|
||||
|
||||
|
||||
SpiPortChipSelect(flashIO, timeout);
|
||||
// Команда записи из кэш
|
||||
reg = 0x10;
|
||||
SpiPortTransmit(flashIO, ®, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
// Запись адреса (флеш)
|
||||
for (int i=2; i>=0; --i) {
|
||||
address = ((uint8_t*)&addr)[i];
|
||||
SpiPortTransmit(flashIO, &address, timeout);
|
||||
SpiPortReceive(flashIO, &back, timeout);
|
||||
}
|
||||
SpiPortChipRelease(flashIO, timeout);
|
||||
|
||||
status = spi_flash_read_status(flashIO, timeout);
|
||||
if (status != 0)
|
||||
return status;
|
||||
|
||||
//SystemDelayMs(100);
|
||||
|
||||
// Команда запрещения записи
|
||||
// SpiPortChipSelect(flashIO, timeout);
|
||||
// reg = 0x04;
|
||||
// SpiPortTransmit(flashIO, ®, timeout);
|
||||
// SpiPortReceive(flashIO, &back, timeout);
|
||||
// SpiPortChipRelease(flashIO, timeout);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"dep": [
|
||||
{
|
||||
"type": "git",
|
||||
"provider": "GONEC_NEW",
|
||||
"repo": "SpiPort"
|
||||
}
|
||||
],
|
||||
"cmake": {
|
||||
"inc_dirs": [
|
||||
"Inc"
|
||||
],
|
||||
"srcs": [
|
||||
"Src/**.c"
|
||||
]
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue