исправил ошибку со стиранием

This commit is contained in:
seklyuts 2024-04-18 13:59:22 +03:00
parent 224107e96d
commit 1686089a10
3 changed files with 22 additions and 33 deletions

View File

@ -1,7 +1,7 @@
/*
* GD25Q16ETIGR.c
*
* Created on: 7 ñåíò. 2023 ã.
* Created on: 7 сент. 2023 г.
* Author: seklyuts
*/
#include "f28x_project.h"
@ -30,17 +30,6 @@ uint16_t GD25Q16ETIGR_buffer8bytes[8];
uint16_t SectorWasErraised[512];
uint16_t GD25Q16ETIGR_Sektor_Addr(uint32_t Addr)
{
uint16_t sektor;
for (sektor=1; sektor <= 512; sektor++ )
{
if(Addr < (0x1000*sektor)) return sektor-1;
}
return 511;
}
void GD25Q16ETIGR_clean_SectorWasErraised(void)
{
uint16_t i;
@ -119,7 +108,7 @@ uint16_t GD25Q16ETIGR_sector_erase(uint32_t Addr)
return 0;
}
uint16_t GD25Q16ETIGR_read_8_bytes(uint32_t Addr, uint16_t * read_data, uint16_t num_byte)//÷òåíèå äî 8 áàéò
uint16_t GD25Q16ETIGR_read_8_bytes(uint32_t Addr, uint16_t * read_data, uint16_t num_byte)//чтение до 8 байт
{
volatile uint16_t empty, i, j;
@ -148,7 +137,7 @@ uint16_t GD25Q16ETIGR_read_8_bytes(uint32_t Addr, uint16_t * read_data, uint16_t
return 0;
}
uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint16_t num_byte)//÷òåíèå è ïðîâåðêà äî 8 áàéò
uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint16_t num_byte)//чтение и проверка до 8 байт
{
volatile uint16_t empty, i, j;
@ -177,7 +166,7 @@ uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint
return 0;
}
uint16_t GD25Q16ETIGR_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t num_byte)//çàïèñü äî 8 áàéò
uint16_t GD25Q16ETIGR_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t num_byte)//запись до 8 байт
{
volatile uint16_t empty, i, j;
@ -216,7 +205,7 @@ uint16_t GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant8, uint16_t * read_
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 8)
{//â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
{//в этом цикле только полные посылки по 8 байт
Err = GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, 8);
if(Err) return Err;
copy8_to_16(addr_read_data, read_data, 4);
@ -224,10 +213,10 @@ uint16_t GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant8, uint16_t * read_
}
}
if(i < quant8)
{//òóò ì.á. îò 1 äî 8 áàéò
{//тут м.б. от 1 до 8 байт
Err = GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, (quant8 - i));
if(Err) return Err;
if((quant8 - i) & 1) {addr_read_data[quant8] = 0; quant8++; }//åñëè áàéò íå÷¸òíîå ÷èñëî, òî äîïîëíÿåì äî ÷¸òíîãî íóë¸ì
if((quant8 - i) & 1) {addr_read_data[quant8] = 0; quant8++; }//если байт нечётное число, то дополняем до чётного нулём
copy8_to_16(addr_read_data, read_data, (quant8 - i)/2);
}
return 0;
@ -243,14 +232,14 @@ uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant8, uint16_t * ver
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 8)
{//â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
{//в этом цикле только полные посылки по 8 байт
copy16_to_8(verify_data, addr_vfy_data, 4);
if(GD25Q16ETIGR_verify_8_bytes(Addr+i, addr_vfy_data, 8)) return 1;
verify_data+=4;
}
}
if(i < quant8)
{//òóò ì.á. îò 1 äî 8 áàéò
{//тут м.б. от 1 до 8 байт
quant16 = quant16bitWords(quant8-i);
copy16_to_8(verify_data, addr_vfy_data, quant16);
if(GD25Q16ETIGR_verify_8_bytes(Addr+i, addr_vfy_data, (quant8 - i))) return 1;
@ -258,7 +247,7 @@ uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant8, uint16_t * ver
return 0;
}
uint16_t GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant8, uint16_t * write_data) // çàïèñü âíóòðè îäíîé ñòðàíèöû
uint16_t GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant8, uint16_t * write_data) // запись внутри одной страницы
{
uint32_t i=0;
uint16_t addr_write_data[8];
@ -268,7 +257,7 @@ uint16_t GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant8, uint16_t * wr
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 8)
{ //â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
{ //в этом цикле только полные посылки по 8 байт
copy16_to_8(write_data, addr_write_data, 4);
Err = GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, 8);
if(Err) return Err;
@ -276,7 +265,7 @@ uint16_t GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant8, uint16_t * wr
}
}
if(i < quant8)
{//òóò ì.á. îò 1 äî 8 áàéò
{//тут м.б. от 1 до 8 байт
quant16 = quant16bitWords(quant8-i);
copy16_to_8(write_data, addr_write_data, quant16);
Err = GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, (quant8 - i));
@ -294,26 +283,26 @@ uint16_t GD25Q16ETIGR_write_data(uint32_t Addr_8bit, uint16_t quant_8bit, uint16
uint16_t i=0;
uint16_t Err = 0;
FlashSektorStart = GD25Q16ETIGR_Sektor_Addr(Addr_8bit); //ñåêòîð ñ êîòîðîãî íà÷èíàåòñÿ çàïèñü
FlashSektorEnd = GD25Q16ETIGR_Sektor_Addr(Addr_8bit + quant_8bit - 1); //ñåêòîð â êîòîðîì êîíåö çàïèñè
FlashSektorStart = (Addr_8bit)>>12; //сектор с которого начинается запись
FlashSektorEnd = (Addr_8bit + quant_8bit - 1)>>12; //сектор в котором конец записи
for(i = FlashSektorStart; i <= FlashSektorEnd; i++)
{
if(!SectorWasErraised[i]) {SectorWasErraised[i] = 1; Err = GD25Q16ETIGR_sector_erase(i*0x1000); if(Err) return Err;}
if(!SectorWasErraised[i]) {SectorWasErraised[i] = 1; Err = GD25Q16ETIGR_sector_erase((uint32_t)i*0x1000); if(Err) return Err;}
}
while( (Addr_8bit&0xFF)+(quant_8bit) > GD25Q16E_PAGE) //åñëè äàííûå âûõîäÿò çà ãðàíèöó òåêóùåé ñòðàíèöû
while( (Addr_8bit&0xFF)+(quant_8bit) > GD25Q16E_PAGE) //если данные выходят за границу текущей страницы
{
page_quant_8bit = GD25Q16E_PAGE - (Addr_8bit&0xFF); //âû÷èñëÿåì êîë-âî áàéò äàííûõ äî êîíöà òåêóùåé ñòðàíèöû
Err = GD25Q16ETIGR_write_1_page(Addr_8bit, page_quant_8bit, addr_write_data); //çàïèñûâàåì ýòè äàííûå íà òåêóùóþ ñòðàíèöó
page_quant_8bit = GD25Q16E_PAGE - (Addr_8bit&0xFF); //вычисляем кол-во байт данных до конца текущей страницы
Err = GD25Q16ETIGR_write_1_page(Addr_8bit, page_quant_8bit, addr_write_data); //записываем эти данные на текущую страницу
if(Err) return Err;
Addr_8bit += page_quant_8bit; //ïåðåëèñòûâàåì ñòðàíèöó âíåøíåé ïàìÿòè
addr_write_data += page_quant_8bit/2; //øàãàåì íà ñëåäóþùèå íåçàïèñàííûå äàííûå â áóôåðå (îíè ó íàñ 16-áèòíûìè ñëîâàìè)
quant_8bit -= page_quant_8bit; //óìåíüøàåì êîë-âî äàííûõ íà âåëè÷èíó êîòîðóþ óæå çàïèñàëè
Addr_8bit += page_quant_8bit; //перелистываем страницу внешней памяти
addr_write_data += page_quant_8bit/2; //шагаем на следующие незаписанные данные в буфере (они у нас 16-битными словами)
quant_8bit -= page_quant_8bit; //уменьшаем кол-во данных на величину которую уже записали
}
if(quant_8bit > 0)
{
Err = GD25Q16ETIGR_write_1_page(Addr_8bit, quant_8bit, addr_write_data); //åñëè äàííûå äëÿ çàïèñè îñòàëèñü, òî çàïèñûâàåì èõ
Err = GD25Q16ETIGR_write_1_page(Addr_8bit, quant_8bit, addr_write_data); //если данные для записи остались, то записываем их
if(Err) return Err;
}
return 0;