отлажен протокол для GD25Q16ETIGR
This commit is contained in:
parent
980c4080ff
commit
d13327347e
@ -21,10 +21,9 @@
|
||||
#define RDLS 0b10000011 //Reads the identification page lock status
|
||||
#define LID 0b10000010 //Locks the identification page in read-only mode
|
||||
|
||||
#define FIFO_SIZE 8
|
||||
|
||||
uint16_t WaitedTimes = 0;
|
||||
uint16_t Stat = 1;
|
||||
|
||||
|
||||
|
||||
void Bl25cm1a_en(void)
|
||||
{
|
||||
@ -51,15 +50,15 @@ uint16_t Bl25cm1a_ReadStatus(void)
|
||||
return empty;
|
||||
}
|
||||
|
||||
void Bl25cm1a_read_8_bytes(uint32_t Addr, char * read_data, uint16_t num_byte)
|
||||
void Bl25cm1a_read_8_bytes(uint32_t Addr, uint16_t * read_data, uint16_t num_byte)
|
||||
{
|
||||
volatile uint16_t empty, i, j;
|
||||
uint16_t Stat = 1;
|
||||
|
||||
Stat = Bl25cm1a_ReadStatus();
|
||||
while((Stat&0x1) != 0 )
|
||||
{
|
||||
Stat = Bl25cm1a_ReadStatus();
|
||||
WaitedTimes++;
|
||||
}
|
||||
|
||||
transmitData(READ);
|
||||
@ -81,16 +80,15 @@ void Bl25cm1a_read_8_bytes(uint32_t Addr, char * read_data, uint16_t num_byte)
|
||||
}
|
||||
}
|
||||
|
||||
void Bl25cm1a_write_8_bytes(uint32_t Addr, char * write_data, uint16_t num_byte)
|
||||
void Bl25cm1a_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t num_byte)
|
||||
{
|
||||
volatile uint16_t empty, i, j;
|
||||
|
||||
uint16_t Stat = 1;
|
||||
|
||||
Stat = Bl25cm1a_ReadStatus();
|
||||
while((Stat&0x1) != 0 )
|
||||
{
|
||||
Stat = Bl25cm1a_ReadStatus();
|
||||
WaitedTimes++;
|
||||
}
|
||||
|
||||
Bl25cm1a_en();
|
||||
@ -114,23 +112,23 @@ void Bl25cm1a_write_8_bytes(uint32_t Addr, char * write_data, uint16_t num_byte)
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t Bl25cm1a_verify_8_bytes(uint32_t Addr, char * verify_data, uint16_t num_byte)
|
||||
uint16_t Bl25cm1a_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint16_t num_byte)
|
||||
{
|
||||
volatile uint16_t empty, i, j;
|
||||
uint16_t Stat = 1;
|
||||
|
||||
Stat = Bl25cm1a_ReadStatus();
|
||||
while((Stat&0x1) != 0 )
|
||||
{
|
||||
Stat = Bl25cm1a_ReadStatus();
|
||||
WaitedTimes++;
|
||||
}
|
||||
|
||||
transmitData(READ);
|
||||
transmitData(Addr>>16);
|
||||
transmitData(Addr>>8);
|
||||
transmitData(Addr);
|
||||
for(i = 0; i<FIFO_SIZE; i++) transmitData(0xFF);
|
||||
while(SpiRegs.SPIFFRX.bit.RXFFST != (FIFO_SIZE+4))
|
||||
for(i = 0; i<num_byte; i++) transmitData(0xFF);
|
||||
while(SpiRegs.SPIFFRX.bit.RXFFST != (num_byte+4))
|
||||
{
|
||||
|
||||
}
|
||||
@ -138,7 +136,7 @@ uint16_t Bl25cm1a_verify_8_bytes(uint32_t Addr, char * verify_data, uint16_t nu
|
||||
empty = SpiRegs.SPIRXBUF;
|
||||
empty = SpiRegs.SPIRXBUF;
|
||||
empty = SpiRegs.SPIRXBUF;
|
||||
for(j = 0; j<FIFO_SIZE; j++)
|
||||
for(j = 0; j<num_byte; j++)
|
||||
{
|
||||
if(verify_data[j] != SpiRegs.SPIRXBUF) return 1;
|
||||
}
|
||||
@ -149,7 +147,7 @@ void Bl25cm1a_read_data(uint32_t Addr, uint16_t quant16, uint16_t * read_data)
|
||||
{
|
||||
uint32_t i=0;
|
||||
uint32_t Addressfull8bit;
|
||||
char addr_read_data[8];
|
||||
uint16_t addr_read_data[8];
|
||||
|
||||
if(quant16 > 4)
|
||||
{
|
||||
@ -171,24 +169,24 @@ void Bl25cm1a_read_data(uint32_t Addr, uint16_t quant16, uint16_t * read_data)
|
||||
|
||||
|
||||
|
||||
uint16_t Bl25cm1a_verify_data(uint32_t Addr, uint16_t quant, uint16_t * verify_data)
|
||||
uint16_t Bl25cm1a_verify_data(uint32_t Addr, uint16_t quant16, uint16_t * verify_data)
|
||||
{
|
||||
uint32_t i=0;
|
||||
char addr_vfy_data[8];
|
||||
uint16_t addr_vfy_data[8];
|
||||
|
||||
if(quant > 4)
|
||||
if(quant16 > 4)
|
||||
{
|
||||
for(i = 0; i < (quant-4); i += 4)
|
||||
for(i = 0; i < (quant16-4); i += 4)
|
||||
{
|
||||
copy16_to_8(verify_data, addr_vfy_data, 4);
|
||||
if(Bl25cm1a_verify_8_bytes(Addr+2*i, addr_vfy_data, 8)) return 1;
|
||||
verify_data+=4;
|
||||
}
|
||||
}
|
||||
if(i < quant)
|
||||
if(i < quant16)
|
||||
{
|
||||
copy16_to_8(verify_data, addr_vfy_data, (quant - i));
|
||||
if(Bl25cm1a_verify_8_bytes(Addr+2*i, addr_vfy_data, 2*(quant - i))) return 1;
|
||||
copy16_to_8(verify_data, addr_vfy_data, (quant16 - i));
|
||||
if(Bl25cm1a_verify_8_bytes(Addr+2*i, addr_vfy_data, 2*(quant16 - i))) return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -196,7 +194,7 @@ uint16_t Bl25cm1a_verify_data(uint32_t Addr, uint16_t quant, uint16_t * verify_d
|
||||
void Bl25cm1a_write_1_page(uint32_t Addr, uint16_t quant, uint16_t * write_data)
|
||||
{
|
||||
uint32_t i=0;
|
||||
char addr_write_data[8];
|
||||
uint16_t addr_write_data[8];
|
||||
uint32_t Addressfull8bit;
|
||||
|
||||
if(quant > 4)
|
||||
@ -222,7 +220,6 @@ void Bl25cm1a_write_data(uint32_t Addr_8bit, uint16_t quant_16bit, uint16_t * wr
|
||||
uint16_t * addr_write_data = write_data;
|
||||
uint16_t page_quant_8bit = 0;
|
||||
|
||||
|
||||
while( (Addr_8bit&0xFF)+(2*quant_16bit) > BL25CM1A0_PAGE) //åñëè äàííûå âûõîäÿò çà ãðàíèöó òåêóùåé ñòðàíèöû
|
||||
{
|
||||
page_quant_8bit = BL25CM1A0_PAGE - (Addr_8bit&0xFF); //âû÷èñëÿåì êîë-âî áàéò äàííûõ äî êîíöà òåêóùåé ñòðàíèöû
|
||||
|
||||
@ -8,6 +8,7 @@
|
||||
#include "spi_init.h"
|
||||
|
||||
#include "GD25Q16ETIGR.h"
|
||||
#include "Arr.h"
|
||||
|
||||
//max adr 0x1FFFFF (2097152 bytes = 2048 Kbytes = 2 Mbyte)
|
||||
#define WriteEnable 0x06
|
||||
@ -24,9 +25,30 @@
|
||||
#define ChipErase 0xC7 //0x60
|
||||
|
||||
uint16_t sdata1 = ReadStatusRegister1; // sent data
|
||||
//uint16_t rdata1[16]; // received data
|
||||
//uint16_t error1 = 0;
|
||||
char GD25Q16ETIGR_buffer8bytes[8];
|
||||
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;
|
||||
for(i=0; i<512; i++)
|
||||
{
|
||||
SectorWasErraised[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void GD25Q16ETIGR_en(void)
|
||||
@ -40,16 +62,33 @@ void GD25Q16ETIGR_en(void)
|
||||
empty = SpiRegs.SPIRXBUF;
|
||||
}
|
||||
|
||||
uint16_t GD25Q16ETIGR_ReadStatus(void)
|
||||
{
|
||||
volatile uint16_t empty;
|
||||
transmitData(ReadStatusRegister1);
|
||||
transmitData(0xFF);
|
||||
while(SpiRegs.SPIFFRX.bit.RXFFST != 2)
|
||||
{
|
||||
|
||||
|
||||
|
||||
#define FIFO_SIZE 8
|
||||
}
|
||||
empty = SpiRegs.SPIRXBUF;
|
||||
empty = SpiRegs.SPIRXBUF;
|
||||
return empty;
|
||||
}
|
||||
|
||||
void GD25Q16ETIGR_sector_erase(uint32_t Addr)
|
||||
{
|
||||
volatile uint16_t empty;
|
||||
uint16_t Stat = 1;
|
||||
|
||||
Stat = GD25Q16ETIGR_ReadStatus();
|
||||
while((Stat&0x1) != 0 )
|
||||
{
|
||||
Stat = GD25Q16ETIGR_ReadStatus();
|
||||
}
|
||||
|
||||
GD25Q16ETIGR_en();
|
||||
transmitData(ReadData);
|
||||
transmitData(SectorErase);
|
||||
transmitData(Addr>>16);
|
||||
transmitData(Addr>>8);
|
||||
transmitData(Addr);
|
||||
@ -63,9 +102,17 @@ void GD25Q16ETIGR_sector_erase(uint32_t Addr)
|
||||
empty = SpiRegs.SPIRXBUF;
|
||||
}
|
||||
|
||||
void GD25Q16ETIGR_read_8_bytes(uint32_t Addr, char * read_data, uint16_t num_byte)//÷òåíèå äî 8 áàéò
|
||||
void GD25Q16ETIGR_read_8_bytes(uint32_t Addr, uint16_t * read_data, uint16_t num_byte)//÷òåíèå äî 8 áàéò
|
||||
{
|
||||
volatile uint16_t empty, i, j;
|
||||
uint16_t Stat = 1;
|
||||
|
||||
Stat = GD25Q16ETIGR_ReadStatus();
|
||||
while((Stat&0x1) != 0 )
|
||||
{
|
||||
Stat = GD25Q16ETIGR_ReadStatus();
|
||||
}
|
||||
|
||||
transmitData(ReadData);
|
||||
transmitData(Addr>>16);
|
||||
transmitData(Addr>>8);
|
||||
@ -85,15 +132,23 @@ void GD25Q16ETIGR_read_8_bytes(uint32_t Addr, char * read_data, uint16_t num_byt
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, char * 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;
|
||||
uint16_t Stat = 1;
|
||||
|
||||
Stat = GD25Q16ETIGR_ReadStatus();
|
||||
while((Stat&0x1) != 0 )
|
||||
{
|
||||
Stat = GD25Q16ETIGR_ReadStatus();
|
||||
}
|
||||
|
||||
transmitData(ReadData);
|
||||
transmitData(Addr>>16);
|
||||
transmitData(Addr>>8);
|
||||
transmitData(Addr);
|
||||
for(i = 0; i<FIFO_SIZE; i++) transmitData(0xFF);
|
||||
while(SpiRegs.SPIFFRX.bit.RXFFST != (FIFO_SIZE+4))
|
||||
for(i = 0; i<num_byte; i++) transmitData(0xFF);
|
||||
while(SpiRegs.SPIFFRX.bit.RXFFST != (num_byte+4))
|
||||
{
|
||||
|
||||
}
|
||||
@ -101,16 +156,24 @@ uint16_t GD25Q16ETIGR_verify_8_bytes(uint32_t Addr, char * verify_data, uint16_t
|
||||
empty = SpiRegs.SPIRXBUF;
|
||||
empty = SpiRegs.SPIRXBUF;
|
||||
empty = SpiRegs.SPIRXBUF;
|
||||
for(j = 0; j<FIFO_SIZE; j++)
|
||||
for(j = 0; j<num_byte; j++)
|
||||
{
|
||||
if(verify_data[j] != SpiRegs.SPIRXBUF) return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void GD25Q16ETIGR_write_8_bytes(uint32_t Addr, char * write_data, uint16_t num_byte)//çàïèñü äî 8 áàéò
|
||||
void GD25Q16ETIGR_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t num_byte)//çàïèñü äî 8 áàéò
|
||||
{
|
||||
volatile uint16_t empty, i, j;
|
||||
uint16_t Stat = 1;
|
||||
|
||||
Stat = GD25Q16ETIGR_ReadStatus();
|
||||
while((Stat&0x1) != 0 )
|
||||
{
|
||||
Stat = GD25Q16ETIGR_ReadStatus();
|
||||
}
|
||||
|
||||
GD25Q16ETIGR_en();
|
||||
transmitData(PageProgram);
|
||||
transmitData(Addr>>16);
|
||||
@ -131,73 +194,110 @@ void GD25Q16ETIGR_write_8_bytes(uint32_t Addr, char * write_data, uint16_t num_b
|
||||
}
|
||||
}
|
||||
|
||||
void GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant, char * read_data)
|
||||
void GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant16, uint16_t * read_data)
|
||||
{
|
||||
uint32_t i=0;
|
||||
char * addr_read_data = read_data;
|
||||
uint32_t Addressfull8bit;
|
||||
uint16_t addr_read_data[8];
|
||||
|
||||
if(quant > 8)
|
||||
if(quant16 > 4)
|
||||
{
|
||||
for(i = 0; i < (quant-8); i += 8)
|
||||
for(i = 0; i < (quant16-4); i += 4)
|
||||
{
|
||||
Addressfull8bit = Addr+2*i;
|
||||
GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, 8);
|
||||
addr_read_data += 8;
|
||||
copy8_to_16(addr_read_data, read_data, 4);
|
||||
read_data+=4;
|
||||
}
|
||||
}
|
||||
if(i < quant) GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, quant - i);
|
||||
if(i < quant16)
|
||||
{
|
||||
Addressfull8bit = Addr+2*i;
|
||||
GD25Q16ETIGR_read_8_bytes(Addressfull8bit, addr_read_data, 2*(quant16 - i));
|
||||
copy8_to_16(addr_read_data, read_data, (quant16 - i));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant, char * write_data) // çàïèñü âíóòðè îäíîé ñòðàíèöû
|
||||
uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant16, uint16_t * verify_data)
|
||||
{
|
||||
|
||||
uint32_t i=0;
|
||||
char * addr_write_data = write_data;
|
||||
uint16_t addr_vfy_data[8];
|
||||
|
||||
if(quant > 8)
|
||||
if(quant16 > 4)
|
||||
{
|
||||
for(i = 0; i < (quant-8); i += 8)
|
||||
for(i = 0; i < (quant16-4); i += 4)
|
||||
{
|
||||
GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, 8);
|
||||
addr_write_data += 8;
|
||||
copy16_to_8(verify_data, addr_vfy_data, 4);
|
||||
if(GD25Q16ETIGR_verify_8_bytes(Addr+2*i, addr_vfy_data, 8)) return 1;
|
||||
verify_data+=4;
|
||||
}
|
||||
}
|
||||
if(i < quant) GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, quant - i);
|
||||
}
|
||||
|
||||
void GD25Q16ETIGR_write_data(uint32_t Addr, uint16_t quant, char * write_data)
|
||||
{
|
||||
char * addr_write_data = write_data;
|
||||
uint16_t page_quant = 0;
|
||||
|
||||
while( (Addr&0xFF)+quant > GD25Q16E_PAGE) //åñëè äàííûå âûõîäÿò çà ãðàíèöó òåêóùåé ñòðàíèöû
|
||||
if(i < quant16)
|
||||
{
|
||||
page_quant = GD25Q16E_PAGE - (Addr&0xFF); //âû÷èñëÿåì êîë-âî äàííûõ äî êîíöà òåêóùåé ñòðàíèöû
|
||||
GD25Q16ETIGR_write_1_page(Addr, page_quant, addr_write_data); //çàïèñûâàåì ýòè äàííûå íà òåêóùóþ ñòðàíèöó
|
||||
Addr += page_quant; //ïåðåëèñòûâàåì ñòðàíèöó âíåøíåé ïàìÿòè
|
||||
addr_write_data += page_quant; //øàãàåì íà ñëåäóþùèå íåçàïèñàííûå äàííûå
|
||||
quant -= page_quant; //óìåíüøàåì êîë-âî äàííûõ íà âåëè÷èíó êîòîðóþ óæå çàïèñàëè
|
||||
copy16_to_8(verify_data, addr_vfy_data, (quant16 - i));
|
||||
if(GD25Q16ETIGR_verify_8_bytes(Addr+2*i, addr_vfy_data, 2*(quant16 - i))) return 1;
|
||||
}
|
||||
if(quant > 0) GD25Q16ETIGR_write_1_page(Addr, quant, addr_write_data); //åñëè äàííûå äëÿ çàïèñè îñòàëèñü, òî çàïèñûâàåì èõ
|
||||
}
|
||||
|
||||
|
||||
uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant, char * verify_data)
|
||||
{
|
||||
uint32_t i=0;
|
||||
char * addr_read_data = verify_data;
|
||||
|
||||
if(quant > 8) //åñëè êîë-âî áàéò áîëüøå 8, òî ÷èòàåì êóñêàìè ïî 8
|
||||
{
|
||||
for(i = 0; i < (quant-8); i += 8) //åñëè îñòàëîñü áîëüøå âîñüìè ÷èòàåì êóñêàìè äàëüøå
|
||||
{
|
||||
if(GD25Q16ETIGR_verify_8_bytes(Addr+i, addr_read_data, 8)) return 1;
|
||||
addr_read_data += 8;
|
||||
}
|
||||
} //òóò îñòàíåòñÿ ìåíüøå 8ìè
|
||||
if(i < quant) if(GD25Q16ETIGR_verify_8_bytes(Addr+i, addr_read_data, quant - i)) return 1; //÷èòàåì ÷òî îñòàëîñü åñëè îíî îñòàëîñü
|
||||
return 0;
|
||||
}
|
||||
|
||||
void GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant, uint16_t * write_data) // çàïèñü âíóòðè îäíîé ñòðàíèöû
|
||||
{
|
||||
uint32_t i=0;
|
||||
uint16_t addr_write_data[8];
|
||||
uint32_t Addressfull8bit;
|
||||
|
||||
if(quant > 4)
|
||||
{
|
||||
for(i = 0; i < (quant-4); i += 4)
|
||||
{
|
||||
copy16_to_8(write_data, addr_write_data, 4);
|
||||
Addressfull8bit = Addr+2*i;
|
||||
GD25Q16ETIGR_write_8_bytes(Addressfull8bit, addr_write_data, 8);
|
||||
write_data += 4;
|
||||
}
|
||||
}
|
||||
if(i < quant)
|
||||
{
|
||||
copy16_to_8(write_data, addr_write_data, (quant - i));
|
||||
Addressfull8bit = Addr+2*i;
|
||||
GD25Q16ETIGR_write_8_bytes(Addressfull8bit, addr_write_data, 2*(quant - i));
|
||||
}
|
||||
}
|
||||
|
||||
void GD25Q16ETIGR_write_data(uint32_t Addr_8bit, uint16_t quant_16bit, uint16_t * write_data)
|
||||
{
|
||||
uint16_t * addr_write_data = write_data;
|
||||
uint16_t page_quant_8bit = 0;
|
||||
uint16_t FlashSektorStart = 0;
|
||||
uint16_t FlashSektorEnd = 0;
|
||||
uint16_t i=0;
|
||||
|
||||
FlashSektorStart = GD25Q16ETIGR_Sektor_Addr(Addr_8bit); //ñåêòîð ñ êîòîðîãî íà÷èíàåòñÿ çàïèñü
|
||||
FlashSektorEnd = GD25Q16ETIGR_Sektor_Addr(Addr_8bit + quant_16bit*2 - 1); //ñåêòîð â êîòîðîì êîíåö çàïèñè
|
||||
|
||||
for(i = FlashSektorStart; i <= FlashSektorEnd; i++)
|
||||
{
|
||||
if(!SectorWasErraised[i]) {SectorWasErraised[i] = 1; GD25Q16ETIGR_sector_erase(i*0x1000);}
|
||||
}
|
||||
|
||||
while( (Addr_8bit&0xFF)+(2*quant_16bit) > GD25Q16E_PAGE) //åñëè äàííûå âûõîäÿò çà ãðàíèöó òåêóùåé ñòðàíèöû
|
||||
{
|
||||
page_quant_8bit = GD25Q16E_PAGE - (Addr_8bit&0xFF); //âû÷èñëÿåì êîë-âî áàéò äàííûõ äî êîíöà òåêóùåé ñòðàíèöû
|
||||
GD25Q16ETIGR_write_1_page(Addr_8bit, page_quant_8bit/2, addr_write_data); //çàïèñûâàåì ýòè äàííûå íà òåêóùóþ ñòðàíèöó
|
||||
Addr_8bit += page_quant_8bit; //ïåðåëèñòûâàåì ñòðàíèöó âíåøíåé ïàìÿòè
|
||||
addr_write_data += page_quant_8bit/2; //øàãàåì íà ñëåäóþùèå íåçàïèñàííûå äàííûå â áóôåðå (îíè ó íàñ 16-áèòíûìè ñëîâàìè)
|
||||
quant_16bit -= page_quant_8bit/2; //óìåíüøàåì êîë-âî äàííûõ íà âåëè÷èíó êîòîðóþ óæå çàïèñàëè
|
||||
}
|
||||
if(quant_16bit > 0)
|
||||
{
|
||||
GD25Q16ETIGR_write_1_page(Addr_8bit, quant_16bit, addr_write_data); //åñëè äàííûå äëÿ çàïèñè îñòàëèñü, òî çàïèñûâàåì èõ
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
uint16_t GD25Q16ETIGR_ReadManufacturerDeviceID(void)
|
||||
{
|
||||
|
||||
@ -13,9 +13,10 @@
|
||||
|
||||
void GD25Q16ETIGR_en(void);
|
||||
void GD25Q16ETIGR_write(void);
|
||||
void GD25Q16ETIGR_write_data(uint32_t Addr, uint16_t quant, char * write_data);
|
||||
void GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant, char * read_data);
|
||||
uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant, char * verify_data);
|
||||
void GD25Q16ETIGR_write_data(uint32_t Addr, uint16_t quant, uint16_t * write_data);
|
||||
void GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant, uint16_t * read_data);
|
||||
uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant, uint16_t * verify_data);
|
||||
uint16_t GD25Q16ETIGR_ReadManufacturerDeviceID(void);
|
||||
void GD25Q16ETIGR_clean_SectorWasErraised(void);
|
||||
|
||||
#endif /* SRC_GD25Q16ETIGR_H_ */
|
||||
|
||||
@ -9,15 +9,15 @@
|
||||
#include "ZD24C02A.h"
|
||||
|
||||
volatile uint16_t SlaveAdr = I2C_SLAVE_ADDRESS;
|
||||
char BufferZD24C02A[17];
|
||||
uint16_t BufferZD24C02A[17];
|
||||
|
||||
uint16_t ZD24C02A_write_16(char Addr, char * Array, uint16_t quant)// ìîæåò ïèñàòü î÷åðåäÿìè ïî 16 áàéò
|
||||
uint16_t ZD24C02A_write_16(uint16_t Addr, uint16_t * Array, uint16_t quant)// ěîćĺň ďčńŕňü î÷ĺđĺä˙ěč ďî 16 áŕéň
|
||||
{
|
||||
if(I2CWrite(SlaveAdr, Addr, quant, true, Array)) return 1;
|
||||
else return 0;
|
||||
}
|
||||
|
||||
uint16_t ZD24C02A_read_16(char Addr, char * Array, uint16_t quant)
|
||||
uint16_t ZD24C02A_read_16(uint16_t Addr, uint16_t * Array, uint16_t quant)
|
||||
{
|
||||
|
||||
if(I2CWrite(SlaveAdr, Addr, 0, false, Array)) return 1;
|
||||
@ -26,7 +26,7 @@ uint16_t ZD24C02A_read_16(char Addr, char * Array, uint16_t quant)
|
||||
}
|
||||
|
||||
|
||||
uint16_t ZD24C02A_verify_16(char Addr, char * Array, uint16_t quant)
|
||||
uint16_t ZD24C02A_verify_16(uint16_t Addr, uint16_t * Array, uint16_t quant)
|
||||
{
|
||||
uint16_t VerifyErr = 0;
|
||||
|
||||
@ -35,18 +35,18 @@ uint16_t ZD24C02A_verify_16(char Addr, char * Array, uint16_t quant)
|
||||
return VerifyErr;
|
||||
}
|
||||
|
||||
uint16_t ZD24C02A_write(uint32_t Addr, uint16_t byteCount, char * Array)
|
||||
uint16_t ZD24C02A_write(uint32_t Addr, uint16_t byteCount, uint16_t * Array)
|
||||
{
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint16_t ZD24C02A_read(uint32_t Addr, uint16_t quant, char * read_data)
|
||||
uint16_t ZD24C02A_read(uint32_t Addr, uint16_t quant, uint16_t * read_data)
|
||||
{
|
||||
uint16_t Err_read = 0;
|
||||
uint32_t i=0;
|
||||
char * addr_read_data = read_data;
|
||||
uint16_t * addr_read_data = read_data;
|
||||
|
||||
if(quant > 16)
|
||||
{
|
||||
@ -62,11 +62,11 @@ uint16_t ZD24C02A_read(uint32_t Addr, uint16_t quant, char * read_data)
|
||||
else return 0;
|
||||
}
|
||||
|
||||
uint16_t ZD24C02A_verify(uint32_t Addr, uint16_t quant, char * verify_data)
|
||||
uint16_t ZD24C02A_verify(uint32_t Addr, uint16_t quant, uint16_t * verify_data)
|
||||
{
|
||||
uint16_t Err_read = 0;
|
||||
uint32_t i=0;
|
||||
char * addr_read_data = verify_data;
|
||||
uint16_t * addr_read_data = verify_data;
|
||||
|
||||
if(quant > 16)
|
||||
{
|
||||
@ -92,7 +92,7 @@ uint16_t ZD24C02A_verify(uint32_t Addr, uint16_t quant, char * verify_data)
|
||||
|
||||
|
||||
|
||||
void ZD24C02A_read_all(uint16_t byteCount, char * Array)
|
||||
void ZD24C02A_read_all(uint16_t byteCount, uint16_t * Array)
|
||||
{
|
||||
I2CRead(SlaveAdr, byteCount, true, Array);
|
||||
// I2CWriteRead(I2C_SLAVE_ADDRESS, byteCount, true, Array);
|
||||
@ -100,7 +100,7 @@ void ZD24C02A_read_all(uint16_t byteCount, char * Array)
|
||||
}
|
||||
|
||||
|
||||
void ZD24C02A_test(char * Array)
|
||||
void ZD24C02A_test(uint16_t * Array)
|
||||
{
|
||||
uint16_t i=0;
|
||||
for(i=0;i<=255;i+=15)
|
||||
|
||||
@ -14,10 +14,10 @@
|
||||
#define ZD24C02A_SIZE 0x80
|
||||
|
||||
|
||||
uint16_t ZD24C02A_write(uint32_t Addr, uint16_t byteCount, char * Array);
|
||||
uint16_t ZD24C02A_read(uint32_t Addr, uint16_t quant, char * read_data);
|
||||
void ZD24C02A_test(char * Array);
|
||||
void ZD24C02A_read_all(uint16_t byteCount, char * Array);
|
||||
uint16_t ZD24C02A_verify(uint32_t Addr, uint16_t quant, char * verify_data);
|
||||
uint16_t ZD24C02A_write(uint32_t Addr, uint16_t byteCount, uint16_t * Array);
|
||||
uint16_t ZD24C02A_read(uint32_t Addr, uint16_t quant, uint16_t * read_data);
|
||||
void ZD24C02A_test(uint16_t * Array);
|
||||
void ZD24C02A_read_all(uint16_t byteCount, uint16_t * Array);
|
||||
uint16_t ZD24C02A_verify(uint32_t Addr, uint16_t quant, uint16_t * verify_data);
|
||||
|
||||
#endif /* SRC_ZD24C02A_H_ */
|
||||
|
||||
@ -121,7 +121,7 @@ uint16_t j = 0;
|
||||
//
|
||||
// Function to send data over I2C.
|
||||
//
|
||||
uint16_t I2CWrite(uint16_t slaveAddr, uint16_t MemAdr, uint16_t byteCount, bool sendStopCondition, char * I2C_TXdata)
|
||||
uint16_t I2CWrite(uint16_t slaveAddr, uint16_t MemAdr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_TXdata)
|
||||
{
|
||||
|
||||
//
|
||||
@ -193,7 +193,7 @@ uint16_t I2CWrite(uint16_t slaveAddr, uint16_t MemAdr, uint16_t byteCount, bool
|
||||
//
|
||||
uint16_t ttest=0;
|
||||
|
||||
uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, char * I2C_RXdata)
|
||||
uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_RXdata)
|
||||
{
|
||||
I2caRegs.I2CMDR.bit.NACKMOD = 0x0;
|
||||
//
|
||||
@ -245,7 +245,7 @@ uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition,
|
||||
|
||||
|
||||
|
||||
uint16_t I2CVerify(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, char * I2C_Vfdata)
|
||||
uint16_t I2CVerify(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_Vfdata)
|
||||
{
|
||||
uint16_t VerErr = 0;
|
||||
I2caRegs.I2CMDR.bit.NACKMOD = 0x0;
|
||||
|
||||
@ -17,10 +17,10 @@
|
||||
|
||||
|
||||
void I2CMasterInit(uint16_t I2CSlave_OwnAddress, uint16_t I2CSlave_Address);
|
||||
uint16_t I2CWrite(uint16_t slaveAddr, uint16_t MemAdr, uint16_t byteCount, bool sendStopCondition, char * I2C_TXdata);
|
||||
uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, char * I2C_RXdata);
|
||||
uint16_t I2CWriteRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, char * I2C_RXdata);
|
||||
uint16_t I2CVerify(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, char * I2C_Vfdata);
|
||||
uint16_t I2CWrite(uint16_t slaveAddr, uint16_t MemAdr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_TXdata);
|
||||
uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_RXdata);
|
||||
uint16_t I2CWriteRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_RXdata);
|
||||
uint16_t I2CVerify(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_Vfdata);
|
||||
void I2CMasterGpioInit(void);
|
||||
void TimerBaseTimeoutInc(void);
|
||||
void I2CWriteReadOnes(uint16_t slaveAddr);
|
||||
|
||||
@ -166,6 +166,7 @@ void getMessage_from_Cm_Flash(void)
|
||||
break;
|
||||
case END:
|
||||
clear_BlockWasErased();
|
||||
IPC_sendCommand(IPC_CPU1_L_CM_R, COMMAND_ACCEPTED, INT_FLASH, 0, 0);
|
||||
break;
|
||||
default:
|
||||
IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_COMMAND, INT_FLASH, 0, 0);
|
||||
@ -215,7 +216,6 @@ void getMessage_from_Cm_BL25CM1A(void)
|
||||
IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, BL25CM1A_1M_bit_SPI, 0, 0);
|
||||
break;
|
||||
case WRITE:
|
||||
//Bl25cm1a_en();
|
||||
Bl25cm1a_write_data(2*InAddr, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE);
|
||||
IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, BL25CM1A_1M_bit_SPI, 0, 0);
|
||||
break;
|
||||
@ -243,15 +243,15 @@ void getMessage_from_Cm_GD25Q16E(void)
|
||||
switch(InCommand >> 16)
|
||||
{
|
||||
case READ:
|
||||
GD25Q16ETIGR_read_data(InAddr*2, InData*2, (char *)CPUXTOCMMSGRAM0_BASE);
|
||||
GD25Q16ETIGR_read_data(InAddr*2, InData, (uint16_t *)CPUXTOCMMSGRAM0_BASE);
|
||||
IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, GD25Q16E_16M_bit_SPI, 0, 0);
|
||||
break;
|
||||
case WRITE:
|
||||
GD25Q16ETIGR_write_data(InAddr*2, InData*2, (char *)CMTOCPUXMSGRAM0_BASE);
|
||||
GD25Q16ETIGR_write_data(InAddr*2, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE);
|
||||
IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, GD25Q16E_16M_bit_SPI, 0, 0);
|
||||
break;
|
||||
case VERIFY:
|
||||
MemOperationError = GD25Q16ETIGR_verify_data(InAddr*2, InData*2, (char *)CMTOCPUXMSGRAM0_BASE);
|
||||
MemOperationError = GD25Q16ETIGR_verify_data(InAddr*2, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE);
|
||||
if(MemOperationError) IPC_sendCommand(IPC_CPU1_L_CM_R, ERROR_VERIFY, GD25Q16E_16M_bit_SPI, 0, 0);
|
||||
else IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, GD25Q16E_16M_bit_SPI, 0, 0);
|
||||
break;
|
||||
@ -260,6 +260,7 @@ void getMessage_from_Cm_GD25Q16E(void)
|
||||
break;
|
||||
default:
|
||||
IPC_sendCommand(IPC_CPU1_L_CM_R, WRONG_COMMAND, GD25Q16E_16M_bit_SPI, 0, 0);
|
||||
GD25Q16ETIGR_clean_SectorWasErraised();
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -275,17 +276,17 @@ void getMessage_from_Cm_ZD24C02A(void)
|
||||
switch(InCommand >> 16)
|
||||
{
|
||||
case READ:
|
||||
I2CErr = ZD24C02A_read(InAddr*2, InData*2, (char *)CPUXTOCMMSGRAM0_BASE);
|
||||
I2CErr = ZD24C02A_read(InAddr*2, InData, (uint16_t *)CPUXTOCMMSGRAM0_BASE);
|
||||
if(I2CErr) IPC_sendCommand(IPC_CPU1_L_CM_R, FLASH_ERR, ZD24C02A_2K_I2C, 0, 0);
|
||||
else IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, ZD24C02A_2K_I2C, 0, 0);
|
||||
break;
|
||||
case WRITE:
|
||||
I2CErr = ZD24C02A_write(InAddr*2, InData*2, (char *)CMTOCPUXMSGRAM0_BASE);
|
||||
I2CErr = ZD24C02A_write(InAddr*2, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE);
|
||||
if(I2CErr) IPC_sendCommand(IPC_CPU1_L_CM_R, ZD24C02A_2K_I2C, FLASH_ERR, 0, 0);
|
||||
else IPC_sendCommand(IPC_CPU1_L_CM_R, ZD24C02A_2K_I2C, DONE_SUCCESS, 0, 0);
|
||||
break;
|
||||
case VERIFY:
|
||||
MemOperationError = ZD24C02A_verify(InData*2, InData*2, (char *)CMTOCPUXMSGRAM0_BASE);
|
||||
MemOperationError = ZD24C02A_verify(InAddr*2, InData, (uint16_t *)CMTOCPUXMSGRAM0_BASE);
|
||||
if(MemOperationError == 2) IPC_sendCommand(IPC_CPU1_L_CM_R, ERROR_VERIFY, ZD24C02A_2K_I2C, 0, 0);
|
||||
else if(MemOperationError == 1) IPC_sendCommand(IPC_CPU1_L_CM_R, FLASH_ERR, ZD24C02A_2K_I2C, 0, 0);
|
||||
else IPC_sendCommand(IPC_CPU1_L_CM_R, DONE_SUCCESS, ZD24C02A_2K_I2C, 0, 0);
|
||||
@ -378,6 +379,9 @@ void ipc_init(void)
|
||||
IPC_initMessageQueue(IPC_CPU1_L_CM_R, &messageQueue, IPC_INT1, IPC_INT1);
|
||||
IPC_initMessageQueue(IPC_CPU1_L_CM_R, &messageQueue, IPC_INT0, IPC_INT0);
|
||||
|
||||
GD25Q16ETIGR_clean_SectorWasErraised();
|
||||
clear_BlockWasErased();
|
||||
|
||||
}
|
||||
|
||||
void ipc_run(void)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user