исправил ошибку со стиранием
This commit is contained in:
parent
224107e96d
commit
1686089a10
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* GD25Q16ETIGR.c
|
* GD25Q16ETIGR.c
|
||||||
*
|
*
|
||||||
* Created on: 7 ñåíò. 2023 ã.
|
* Created on: 7 сент. 2023 г.
|
||||||
* Author: seklyuts
|
* Author: seklyuts
|
||||||
*/
|
*/
|
||||||
#include "f28x_project.h"
|
#include "f28x_project.h"
|
||||||
@ -30,17 +30,6 @@ uint16_t GD25Q16ETIGR_buffer8bytes[8];
|
|||||||
uint16_t SectorWasErraised[512];
|
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)
|
void GD25Q16ETIGR_clean_SectorWasErraised(void)
|
||||||
{
|
{
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
@ -119,7 +108,7 @@ uint16_t GD25Q16ETIGR_sector_erase(uint32_t Addr)
|
|||||||
return 0;
|
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;
|
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;
|
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;
|
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;
|
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;
|
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)
|
if(quant8 > 8)
|
||||||
{
|
{
|
||||||
for(i = 0; i < (quant8-8); i += 8)
|
for(i = 0; i < (quant8-8); i += 8)
|
||||||
{//â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
|
{//в этом цикле только полные посылки по 8 байт
|
||||||
Err = GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, 8);
|
Err = GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, 8);
|
||||||
if(Err) return Err;
|
if(Err) return Err;
|
||||||
copy8_to_16(addr_read_data, read_data, 4);
|
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)
|
if(i < quant8)
|
||||||
{//òóò ì.á. îò 1 äî 8 áàéò
|
{//тут м.б. от 1 до 8 байт
|
||||||
Err = GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, (quant8 - i));
|
Err = GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, (quant8 - i));
|
||||||
if(Err) return Err;
|
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);
|
copy8_to_16(addr_read_data, read_data, (quant8 - i)/2);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -243,14 +232,14 @@ uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant8, uint16_t * ver
|
|||||||
if(quant8 > 8)
|
if(quant8 > 8)
|
||||||
{
|
{
|
||||||
for(i = 0; i < (quant8-8); i += 8)
|
for(i = 0; i < (quant8-8); i += 8)
|
||||||
{//â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
|
{//в этом цикле только полные посылки по 8 байт
|
||||||
copy16_to_8(verify_data, addr_vfy_data, 4);
|
copy16_to_8(verify_data, addr_vfy_data, 4);
|
||||||
if(GD25Q16ETIGR_verify_8_bytes(Addr+i, addr_vfy_data, 8)) return 1;
|
if(GD25Q16ETIGR_verify_8_bytes(Addr+i, addr_vfy_data, 8)) return 1;
|
||||||
verify_data+=4;
|
verify_data+=4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(i < quant8)
|
if(i < quant8)
|
||||||
{//òóò ì.á. îò 1 äî 8 áàéò
|
{//тут м.б. от 1 до 8 байт
|
||||||
quant16 = quant16bitWords(quant8-i);
|
quant16 = quant16bitWords(quant8-i);
|
||||||
copy16_to_8(verify_data, addr_vfy_data, quant16);
|
copy16_to_8(verify_data, addr_vfy_data, quant16);
|
||||||
if(GD25Q16ETIGR_verify_8_bytes(Addr+i, addr_vfy_data, (quant8 - i))) return 1;
|
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;
|
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;
|
uint32_t i=0;
|
||||||
uint16_t addr_write_data[8];
|
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)
|
if(quant8 > 8)
|
||||||
{
|
{
|
||||||
for(i = 0; i < (quant8-8); i += 8)
|
for(i = 0; i < (quant8-8); i += 8)
|
||||||
{ //â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
|
{ //в этом цикле только полные посылки по 8 байт
|
||||||
copy16_to_8(write_data, addr_write_data, 4);
|
copy16_to_8(write_data, addr_write_data, 4);
|
||||||
Err = GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, 8);
|
Err = GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, 8);
|
||||||
if(Err) return Err;
|
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)
|
if(i < quant8)
|
||||||
{//òóò ì.á. îò 1 äî 8 áàéò
|
{//тут м.б. от 1 до 8 байт
|
||||||
quant16 = quant16bitWords(quant8-i);
|
quant16 = quant16bitWords(quant8-i);
|
||||||
copy16_to_8(write_data, addr_write_data, quant16);
|
copy16_to_8(write_data, addr_write_data, quant16);
|
||||||
Err = GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, (quant8 - i));
|
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 i=0;
|
||||||
uint16_t Err = 0;
|
uint16_t Err = 0;
|
||||||
|
|
||||||
FlashSektorStart = GD25Q16ETIGR_Sektor_Addr(Addr_8bit); //ñåêòîð ñ êîòîðîãî íà÷èíàåòñÿ çàïèñü
|
FlashSektorStart = (Addr_8bit)>>12; //сектор с которого начинается запись
|
||||||
FlashSektorEnd = GD25Q16ETIGR_Sektor_Addr(Addr_8bit + quant_8bit - 1); //ñåêòîð â êîòîðîì êîíåö çàïèñè
|
FlashSektorEnd = (Addr_8bit + quant_8bit - 1)>>12; //сектор в котором конец записи
|
||||||
|
|
||||||
for(i = FlashSektorStart; i <= FlashSektorEnd; i++)
|
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); //âû÷èñëÿåì êîë-âî áàéò äàííûõ äî êîíöà òåêóùåé ñòðàíèöû
|
page_quant_8bit = GD25Q16E_PAGE - (Addr_8bit&0xFF); //вычисляем кол-во байт данных до конца текущей страницы
|
||||||
Err = GD25Q16ETIGR_write_1_page(Addr_8bit, page_quant_8bit, addr_write_data); //çàïèñûâàåì ýòè äàííûå íà òåêóùóþ ñòðàíèöó
|
Err = GD25Q16ETIGR_write_1_page(Addr_8bit, page_quant_8bit, addr_write_data); //записываем эти данные на текущую страницу
|
||||||
if(Err) return Err;
|
if(Err) return Err;
|
||||||
Addr_8bit += page_quant_8bit; //ïåðåëèñòûâàåì ñòðàíèöó âíåøíåé ïàìÿòè
|
Addr_8bit += page_quant_8bit; //перелистываем страницу внешней памяти
|
||||||
addr_write_data += page_quant_8bit/2; //øàãàåì íà ñëåäóþùèå íåçàïèñàííûå äàííûå â áóôåðå (îíè ó íàñ 16-áèòíûìè ñëîâàìè)
|
addr_write_data += page_quant_8bit/2; //шагаем на следующие незаписанные данные в буфере (они у нас 16-битными словами)
|
||||||
quant_8bit -= page_quant_8bit; //óìåíüøàåì êîë-âî äàííûõ íà âåëè÷èíó êîòîðóþ óæå çàïèñàëè
|
quant_8bit -= page_quant_8bit; //уменьшаем кол-во данных на величину которую уже записали
|
||||||
}
|
}
|
||||||
if(quant_8bit > 0)
|
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;
|
if(Err) return Err;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user