проверка памяти

This commit is contained in:
seklyuts 2023-12-19 10:49:45 +03:00
parent f2e133ebb1
commit f9a72e9ac6
12 changed files with 740 additions and 520 deletions

Binary file not shown.

View File

@ -7,6 +7,9 @@
#include "f28x_project.h"
#include "spi_init.h"
#include "BL25CM1A.h"
#include "Arr.h"
#define WREN 0b00000110 //Enable Write Operations
#define WRDI 0b00000100 //Disable Write Operations
#define RDSR 0b00000101 //Read Status Register
@ -19,76 +22,221 @@
#define LID 0b10000010 //Locks the identification page in read-only mode
uint16_t sdata2 = RDSR; // sent data
uint16_t rdata2[16] ; // received data
//uint16_t error2 = 0;
void Bl25cm1a_en(void)
{
volatile uint16_t empty;
Gpio15outSPI_CS_BL25CM1A(0);
transmitData(WREN);
while(SpiRegs.SPIFFRX.bit.RXFFST != 1)
{
}
Gpio15outSPI_CS_BL25CM1A(1);
empty = SpiRegs.SPIRXBUF;
}
void Bl25cm1a_write(void)
uint16_t Bl25cm1a_ReadStatus(void)
{
transmitData(sdata2);
transmitData(0xFF);
while(SpiRegs.SPIFFRX.bit.RXFFST != 2)
{
volatile uint16_t empty;
Gpio15outSPI_CS_BL25CM1A(0);
transmitData(RDSR);
transmitData(0xFF);
while(SpiRegs.SPIFFRX.bit.RXFFST != 2)
{
}
rdata2[0] = SpiRegs.SPIRXBUF;
rdata2[1] = SpiRegs.SPIRXBUF;
}
Gpio15outSPI_CS_BL25CM1A(1);
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
return empty;
}
#define quant 8
void Bl25cm1a_read_data(uint32_t Addr)
void Bl25cm1a_read_8_bytes(uint32_t Addr, uint16_t * read_data, uint16_t num_byte)//num_byte <=8
{
volatile uint16_t empty, i, j;
uint16_t Stat = 1;
Stat = Bl25cm1a_ReadStatus();
while((Stat&0x1) != 0 )
{
Stat = Bl25cm1a_ReadStatus();
}
Gpio15outSPI_CS_BL25CM1A(0);
transmitData(READ);
transmitData(Addr>>16);
transmitData(Addr>>8);
transmitData(Addr);
for(i = 0; i<quant; i++) transmitData(0xFF);
while(SpiRegs.SPIFFRX.bit.RXFFST != (quant+4))
for(i = 0; i<num_byte; i++) transmitData(0xFF);
while(SpiRegs.SPIFFRX.bit.RXFFST != (num_byte+4))
{
}
Gpio15outSPI_CS_BL25CM1A(1);
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
for(j = 0; j<quant; j++)
for(j = 0; j<num_byte; j++)
{
rdata2[j] = SpiRegs.SPIRXBUF;
read_data[j] = SpiRegs.SPIRXBUF;
}
}
void Bl25cm1a_write_data(uint32_t Addr)
void Bl25cm1a_write_8_bytes(uint32_t Addr, uint16_t * write_data, uint16_t num_byte)//num_byte <=8
{
volatile uint16_t empty, i, j;
uint16_t Stat = 1;
Stat = Bl25cm1a_ReadStatus();
while((Stat&0x1) != 0 )
{
Stat = Bl25cm1a_ReadStatus();
}
Bl25cm1a_en();
Gpio15outSPI_CS_BL25CM1A(0);
transmitData(WRITE);
transmitData(Addr>>16);
transmitData(Addr>>8);
transmitData(Addr);
for(i = 0; i<quant; i++) transmitData(rdata2[i]);
while(SpiRegs.SPIFFRX.bit.RXFFST != (quant+4))
for(i = 0; i<num_byte; i++) transmitData(write_data[i]);
while(SpiRegs.SPIFFRX.bit.RXFFST != (num_byte+4))
{
}
Gpio15outSPI_CS_BL25CM1A(1);
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
for(j = 0; j<quant; j++)
for(j = 0; j<num_byte; j++)
{
empty = SpiRegs.SPIRXBUF;
}
}
uint16_t Bl25cm1a_verify_8_bytes(uint32_t Addr, uint16_t * verify_data, uint16_t num_byte)//num_byte <=8
{
volatile uint16_t empty, i, j;
uint16_t Stat = 1;
uint16_t Err = 0;
Stat = Bl25cm1a_ReadStatus();
while((Stat&0x1) != 0 )
{
Stat = Bl25cm1a_ReadStatus();
}
Gpio15outSPI_CS_BL25CM1A(0);
transmitData(READ);
transmitData(Addr>>16);
transmitData(Addr>>8);
transmitData(Addr);
for(i = 0; i<num_byte; i++) transmitData(0xFF);
while(SpiRegs.SPIFFRX.bit.RXFFST != (num_byte+4))
{
}
Gpio15outSPI_CS_BL25CM1A(1);
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
for(j = 0; j<num_byte; j++)
{
if(verify_data[j] != SpiRegs.SPIRXBUF) Err++;
}
return Err;
}
void Bl25cm1a_read_data(uint32_t Addr, uint16_t quant8, uint16_t * read_data)
{
uint32_t i=0;
uint16_t addr_read_data[8];
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 8)
{ //â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
Bl25cm1a_read_8_bytes(Addr+i, addr_read_data, 8);
copy8_to_16(addr_read_data, read_data, 4);
read_data+=4;
}
}
if(i < quant8)
{ //òóò ì.á. îò 1 äî 8 áàéò
Bl25cm1a_read_8_bytes(Addr+i, addr_read_data, (quant8 - i)); //÷èòàåì îñòàâøèåñÿ áàéòû
if((quant8 - i) & 1) {addr_read_data[quant8] = 0; quant8++; } //åñëè áàéò íå÷¸òíîå ÷èñëî, òî äîïîëíÿåì äî ÷¸òíîãî íóë¸ì ÷òîáû çàïèñàòü 16-áèòíûìè ñëîâàìè â áóôåð
copy8_to_16(addr_read_data, read_data, (quant8 - i)/2);
}
}
uint16_t Bl25cm1a_verify_data(uint32_t Addr, uint16_t quant8, uint16_t * verify_data)
{
uint32_t i=0;
uint16_t addr_vfy_data[8];
uint16_t quant16;
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 8)
{ //â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
copy16_to_8(verify_data, addr_vfy_data, 4);
if(Bl25cm1a_verify_8_bytes(Addr+i, addr_vfy_data, 8)) return 1;
verify_data+=4;
}
}
if(i < quant8)
{ //òóò ì.á. îò 1 äî 8 áàéò
quant16 = quant16bitWords(quant8-i);
copy16_to_8(verify_data, addr_vfy_data, quant16);
if(Bl25cm1a_verify_8_bytes(Addr+i, addr_vfy_data, (quant8 - i))) return 1;
}
return 0;
}
void Bl25cm1a_write_1_page(uint32_t Addr, uint16_t quant8, uint16_t * write_data)
{
uint32_t i=0;
uint16_t addr_write_data[8];
uint16_t quant16;
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 8)
{ //â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
copy16_to_8(write_data, addr_write_data, 4);
Bl25cm1a_write_8_bytes(Addr+i, addr_write_data, 8);
write_data += 4;
}
}
if(i < quant8)
{ //òóò ì.á. îò 1 äî 8 áàéò
quant16 = quant16bitWords(quant8-i);
copy16_to_8(write_data, addr_write_data, quant16);
Bl25cm1a_write_8_bytes(Addr+i, addr_write_data, (quant8 - i));
}
}
void Bl25cm1a_write_data(uint32_t Addr_8bit, uint16_t quant_8bit, uint16_t * write_data)
{
uint16_t * addr_write_data = write_data;
uint16_t page_quant_8bit = 0;
while( (Addr_8bit&0xFF)+(quant_8bit) > BL25CM1A0_PAGE) //åñëè äàííûå âûõîäÿò çà ãðàíèöó òåêóùåé ñòðàíèöû
{
page_quant_8bit = BL25CM1A0_PAGE - (Addr_8bit&0xFF); //âû÷èñëÿåì êîë-âî áàéò äàííûõ äî êîíöà òåêóùåé ñòðàíèöû
Bl25cm1a_write_1_page(Addr_8bit, page_quant_8bit/2, addr_write_data); //çàïèñûâàåì ýòè äàííûå íà òåêóùóþ ñòðàíèöó
Addr_8bit += page_quant_8bit; //ïåðåëèñòûâàåì ñòðàíèöó âíåøíåé ïàìÿòè
addr_write_data += page_quant_8bit/2; //øàãàåì íà ñëåäóþùèå íåçàïèñàííûå äàííûå â áóôåðå
quant_8bit -= page_quant_8bit; //óìåíüøàåì êîë-âî äàííûõ íà âåëè÷èíó êîòîðóþ óæå çàïèñàëè
}
if(quant_8bit > 0)
{
Bl25cm1a_write_1_page(Addr_8bit, quant_8bit, addr_write_data); //åñëè äàííûå äëÿ çàïèñè îñòàëèñü, òî çàïèñûâàåì èõ
}
}

View File

@ -8,9 +8,12 @@
#ifndef SRC_BL25CM1A_H_
#define SRC_BL25CM1A_H_
void Bl25cm1a_en(void);
void Bl25cm1a_write(void);
void Bl25cm1a_write_data(uint32_t Addr);
void Bl25cm1a_read_data(uint32_t Addr);
#define BL25CM1A0_SIZE 0x10000 //16 bit lenght
#define BL25CM1A0_PAGE 0x100
void Bl25cm1a_en(void);
void Bl25cm1a_write_data(uint32_t Addr, uint16_t quant, uint16_t * write_data);
void Bl25cm1a_read_data(uint32_t Addr, uint16_t quant, uint16_t * read_data);
uint16_t Bl25cm1a_verify_data(uint32_t Addr, uint16_t quant, uint16_t * verify_data);
#endif /* SRC_BL25CM1A_H_ */

View File

@ -29,13 +29,11 @@ void ExtEEPROM_run(void)
{
if(WriteI2C)
{
ArrayForTests[0] = Adr;
ZD24C02A_write(NByte, ArrayForTests);
ZD24C02A_write(Adr, NByte, ArrayForTests);
}
else
{
ArrayMax[0] = Adr;
ZD24C02A_read(NByte, ArrayMax);
ZD24C02A_read(Adr, NByte, ArrayMax);
}
sendNowI2C = 0;
}
@ -48,23 +46,14 @@ void ExtEEPROM_run(void)
switch(sendNowSPIGD25)
{
case 1:
GD25Q16ETIGR_en();
GD25Q16ETIGR_write_data(Adr, NByte, ArrayForTests);
sendNowSPIGD25 = 0;
break;
case 2:
GD25Q16ETIGR_write();
GD25Q16ETIGR_read_data(Adr, NByte, ArrayMax);
sendNowSPIGD25 = 0;
break;
case 3:
GD25Q16ETIGR_en();
GD25Q16ETIGR_write_data(SpiAdr);
sendNowSPIGD25 = 0;
break;
case 4:
GD25Q16ETIGR_read_data(SpiAdr);
sendNowSPIGD25 = 0;
break;
case 5:
GD25Q16ETIGR_ReadManufacturerDeviceID();
sendNowSPIGD25 = 0;
break;
@ -74,26 +63,14 @@ void ExtEEPROM_run(void)
switch(sendNowSPIBL25)
{
case 1:
Bl25cm1a_en();
ZD24C02A_write(Adr, NByte, ArrayForTests);
sendNowSPIBL25 = 0;
break;
case 2:
Bl25cm1a_write();
sendNowSPIBL25 = 0;
break;
case 3:
Bl25cm1a_en();
Bl25cm1a_write_data(SpiAdr);
sendNowSPIBL25 = 0;
break;
case 4:
Bl25cm1a_read_data(SpiAdr);
sendNowSPIBL25 = 0;
break;
case 5:
Bl25cm1a_en();
ZD24C02A_read(Adr, NByte, ArrayMax);
sendNowSPIBL25 = 0;
break;
}

View File

@ -7,6 +7,9 @@
#include "f28x_project.h"
#include "spi_init.h"
#include "GD25Q16ETIGR.h"
#include "Arr.h"
//max adr 0x1FFFFF (2097152 bytes = 2048 Kbytes = 2 Mbyte)
#define WriteEnable 0x06
#define WriteDisable 0x04
@ -19,11 +22,33 @@
#define ReadManufacturerDeviceID 0x90
#define PageProgram 0x02 //A23-A16 A15-A8 A7-A0 D7-D0
#define SectorErase 0x20 //A23-A16 A15-A8 A7-A0
#define Chip Erase 0xC7 //0x60
#define ChipErase 0xC7 //0x60
uint16_t sdata1 = ReadStatusRegister1; // sent data
uint16_t rdata1[16]; // received data
//uint16_t error1 = 0;
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)
@ -37,68 +62,242 @@ void GD25Q16ETIGR_en(void)
empty = SpiRegs.SPIRXBUF;
}
void GD25Q16ETIGR_write(void)
uint16_t GD25Q16ETIGR_ReadStatus(void)
{
transmitData(sdata1);
transmitData(0xFF);
while(SpiRegs.SPIFFRX.bit.RXFFST != 2)
{
volatile uint16_t empty;
transmitData(ReadStatusRegister1);
transmitData(0xFF);
while(SpiRegs.SPIFFRX.bit.RXFFST != 2)
{
}
rdata1[0] = SpiRegs.SPIRXBUF;
rdata1[1] = SpiRegs.SPIRXBUF;
}
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
return empty;
}
#define quant 8
void GD25Q16ETIGR_read_data(uint32_t Addr)
void GD25Q16ETIGR_sector_erase(uint32_t Addr)
{
volatile uint16_t empty, i, j;
transmitData(ReadData);
transmitData(Addr>>16);
transmitData(Addr>>8);
transmitData(Addr);
for(i = 0; i<quant; i++) transmitData(0xFF);
while(SpiRegs.SPIFFRX.bit.RXFFST != (quant+4))
{
volatile uint16_t empty;
uint16_t Stat = 1;
}
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
for(j = 0; j<quant; j++)
{
rdata1[j] = SpiRegs.SPIRXBUF;
}
Stat = GD25Q16ETIGR_ReadStatus();
while((Stat&0x1) != 0 )
{
Stat = GD25Q16ETIGR_ReadStatus();
}
GD25Q16ETIGR_en();
transmitData(SectorErase);
transmitData(Addr>>16);
transmitData(Addr>>8);
transmitData(Addr);
while(SpiRegs.SPIFFRX.bit.RXFFST != 4)
{
}
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
}
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);
transmitData(Addr);
for(i = 0; i<num_byte; i++) transmitData(0xFF);
while(SpiRegs.SPIFFRX.bit.RXFFST != (num_byte+4))
{
}
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
for(j = 0; j<num_byte; j++)
{
read_data[j] = SpiRegs.SPIRXBUF;
}
}
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<num_byte; i++) transmitData(0xFF);
while(SpiRegs.SPIFFRX.bit.RXFFST != (num_byte+4))
{
}
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
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, 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);
transmitData(Addr>>8);
transmitData(Addr);
for(i = 0; i<num_byte; i++) transmitData(write_data[i]);
while(SpiRegs.SPIFFRX.bit.RXFFST != (num_byte+4))
{
}
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
for(j = 0; j<num_byte; j++)
{
empty = SpiRegs.SPIRXBUF;
}
}
void GD25Q16ETIGR_read_data(uint32_t Addr, uint16_t quant8, uint16_t * read_data)
{
uint32_t i=0;
uint16_t addr_read_data[8];
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 8)
{//â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, 8);
copy8_to_16(addr_read_data, read_data, 4);
read_data+=4;
}
}
if(i < quant8)
{//òóò ì.á. îò 1 äî 8 áàéò
GD25Q16ETIGR_read_8_bytes(Addr+i, addr_read_data, (quant8 - i));
if((quant8 - i) & 1) {addr_read_data[quant8] = 0; quant8++; }//åñëè áàéò íå÷¸òíîå ÷èñëî, òî äîïîëíÿåì äî ÷¸òíîãî íóë¸ì
copy8_to_16(addr_read_data, read_data, (quant8 - i)/2);
}
}
void GD25Q16ETIGR_write_data(uint32_t Addr)
uint16_t GD25Q16ETIGR_verify_data(uint32_t Addr, uint16_t quant8, uint16_t * verify_data)
{
volatile uint16_t empty, i, j;
transmitData(PageProgram);
transmitData(Addr>>16);
transmitData(Addr>>8);
transmitData(Addr);
for(i = 0; i<quant; i++) transmitData(rdata1[i]);
while(SpiRegs.SPIFFRX.bit.RXFFST != (quant+4))
{
uint32_t i=0;
uint16_t addr_vfy_data[8];
uint16_t quant16;
}
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
for(j = 0; j<quant; j++)
{
empty = SpiRegs.SPIRXBUF;
}
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 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 áàéò
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;
}
return 0;
}
void GD25Q16ETIGR_write_1_page(uint32_t Addr, uint16_t quant8, uint16_t * write_data) // çàïèñü âíóòðè îäíîé ñòðàíèöû
{
uint32_t i=0;
uint16_t addr_write_data[8];
uint16_t quant16;
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 8)
{ //â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
copy16_to_8(write_data, addr_write_data, 4);
GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, 8);
write_data += 4;
}
}
if(i < quant8)
{//òóò ì.á. îò 1 äî 8 áàéò
quant16 = quant16bitWords(quant8-i);
copy16_to_8(write_data, addr_write_data, quant16);
GD25Q16ETIGR_write_8_bytes(Addr+i, addr_write_data, (quant8 - i));
}
}
void GD25Q16ETIGR_write_data(uint32_t Addr_8bit, uint16_t quant_8bit, 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_8bit - 1); //ñåêòîð â êîòîðîì êîíåö çàïèñè
for(i = FlashSektorStart; i <= FlashSektorEnd; i++)
{
if(!SectorWasErraised[i]) {SectorWasErraised[i] = 1; GD25Q16ETIGR_sector_erase(i*0x1000);}
}
while( (Addr_8bit&0xFF)+(quant_8bit) > 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_8bit -= page_quant_8bit; //óìåíüøàåì êîë-âî äàííûõ íà âåëè÷èíó êîòîðóþ óæå çàïèñàëè
}
if(quant_8bit > 0)
{
GD25Q16ETIGR_write_1_page(Addr_8bit, quant_8bit, addr_write_data); //åñëè äàííûå äëÿ çàïèñè îñòàëèñü, òî çàïèñûâàåì èõ
}
}
void GD25Q16ETIGR_ReadManufacturerDeviceID(void)
uint16_t GD25Q16ETIGR_ReadManufacturerDeviceID(void)
{
volatile uint16_t empty, i, j;
transmitData(ReadManufacturerDeviceID);
@ -110,6 +309,7 @@ void GD25Q16ETIGR_ReadManufacturerDeviceID(void)
}
for(j = 0; j<6; j++)
{
rdata1[j] = SpiRegs.SPIRXBUF;
empty = SpiRegs.SPIRXBUF;
}
return empty;
}

View File

@ -8,10 +8,15 @@
#ifndef SRC_GD25Q16ETIGR_H_
#define SRC_GD25Q16ETIGR_H_
#define GD25Q16E_SIZE 0x100000 // 16 bit lenght
#define GD25Q16E_PAGE 0x100
void GD25Q16ETIGR_en(void);
void GD25Q16ETIGR_write(void);
void GD25Q16ETIGR_write_data(uint32_t Addr);
void GD25Q16ETIGR_read_data(uint32_t Addr);
void GD25Q16ETIGR_ReadManufacturerDeviceID(void);
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_ */

View File

@ -7,22 +7,118 @@
#include "f28x_project.h"
#include "i2c_init.h"
#include "ZD24C02A.h"
#include "Arr.h"
//Íóæäàåòñÿ â ïðîâåðêå è îòëàäêå, òàê êàê ñ ýòîé ìèêðîñõåìîé íå óäàëîñü äîáèòüñÿ ñòàáèëüíîé ðàáîòû, îíà òî ðàáîòàåò, òî íåò
volatile uint16_t SlaveAdr = I2C_SLAVE_ADDRESS;
uint16_t BufferZD24C02A[17];
void ZD24C02A_write(uint16_t byteCount, uint16_t * Array)
uint16_t ZD24C02A_write_8(uint16_t Addr, uint16_t * Array, uint16_t quant)// ìîæåò ïèñàòü î÷åðåäÿìè ïî 16 áàéò
{
I2CWrite(SlaveAdr, (byteCount + 1), true, Array);
if(I2CWrite(SlaveAdr, Addr, quant, true, Array)) return 1;
else return 0;
}
void ZD24C02A_read(uint16_t byteCount, uint16_t * Array)
uint16_t ZD24C02A_read_8(uint16_t Addr, uint16_t * Array, uint16_t quant)
{
I2CWrite(SlaveAdr, 1, false, Array);
I2CRead(SlaveAdr, byteCount, true, Array);
// I2CWriteRead(I2C_SLAVE_ADDRESS, byteCount, true, Array);
// I2CWriteReadOnes(I2C_SLAVE_ADDRESS);
if(I2CWrite(SlaveAdr, Addr, 0, false, Array)) return 1;
if(I2CRead(SlaveAdr, quant, true, Array)) return 1;
else return 0;
}
uint16_t ZD24C02A_verify_16(uint16_t Addr, uint16_t * Array, uint16_t quant)
{
uint16_t VerifyErr = 0;
if(I2CWrite(SlaveAdr, Addr, 0, false, BufferZD24C02A)) return 1;
VerifyErr = I2CVerify(SlaveAdr, quant, true, Array);
return VerifyErr;
}
uint16_t ZD24C02A_write(uint32_t Addr, uint16_t quant8, uint16_t * write_data)
{
uint32_t i=0;
uint16_t addr_write_data[8];
uint16_t quant16;
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 8)
{//â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
copy16_to_8(write_data, addr_write_data, 4);
if( ZD24C02A_write_8(Addr+i, addr_write_data, 8)) return 1;
write_data += 4;
}
}
if(i < quant8)
{//òóò ì.á. îò 1 äî 8 áàéò
quant16 = quant16bitWords(quant8-i);
copy16_to_8(write_data, addr_write_data, quant16);
if( ZD24C02A_write_8(Addr+i, addr_write_data, (quant8 - i))) return 1;
}
return 0;
}
uint16_t ZD24C02A_read(uint32_t Addr, uint16_t quant8, uint16_t * read_data)
{
uint32_t i=0;
uint16_t addr_read_data[8];
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 8)
{//â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
if( ZD24C02A_read_8(Addr+i, addr_read_data, 8)) return 1;
copy8_to_16(addr_read_data, read_data, 4);
read_data+=4;
}
}
if(i < quant8)
{//òóò ì.á. îò 1 äî 8 áàéò
if( ZD24C02A_read_8(Addr+i, addr_read_data, (quant8 - i))) return 1;
if((quant8 - i) & 1) {addr_read_data[quant8] = 0; quant8++; }//åñëè áàéò íå÷¸òíîå ÷èñëî, òî äîïîëíÿåì äî ÷¸òíîãî íóë¸ì
copy8_to_16(addr_read_data, read_data, (quant8 - i)/2);
}
return 0;
}
uint16_t ZD24C02A_verify(uint32_t Addr, uint16_t quant8, uint16_t * verify_data)
{
uint32_t i=0;
uint16_t addr_vfy_data[8];
uint16_t Err_read = 0;
uint16_t quant16;
if(quant8 > 8)
{
for(i = 0; i < (quant8-8); i += 8)
{//â ýòîì öèêëå òîëüêî ïîëíûå ïîñûëêè ïî 8 áàéò
copy16_to_8(verify_data, addr_vfy_data, 4);
Err_read = ZD24C02A_verify_16(Addr+i, addr_vfy_data, 8);
if(Err_read) return Err_read;
verify_data+=4;
}
}
if(i < quant8)
{//òóò ì.á. îò 1 äî 8 áàéò
quant16 = quant16bitWords(quant8-i);
copy16_to_8(verify_data, addr_vfy_data, quant16);
Err_read = ZD24C02A_verify_16(Addr+i, addr_vfy_data, (quant8 - i));
if(Err_read) return Err_read;
}
return 0;
}
void ZD24C02A_read_all(uint16_t byteCount, uint16_t * Array)
{
I2CRead(SlaveAdr, byteCount, true, Array);
@ -36,6 +132,6 @@ void ZD24C02A_test(uint16_t * Array)
uint16_t i=0;
for(i=0;i<=255;i+=15)
{
I2CWrite(SlaveAdr, 1, true, Array);
// I2CWrite(SlaveAdr, 1, true, Array);
}
}

View File

@ -11,10 +11,13 @@
#define I2C_SLAVE_ADDRESS 0x51U
#define I2C_OWN_ADDRESS 0x30U
#define ZD24C02A_SIZE 0x80
void ZD24C02A_write(uint16_t byteCount, uint16_t * Array);
void ZD24C02A_read(uint16_t byteCount, uint16_t * Array);
uint16_t ZD24C02A_write(uint32_t Addr, uint16_t quant, uint16_t * write_data);
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_ */

View File

@ -10,24 +10,20 @@
// Function to configure I2CA as Master Transmitter.
//
//
// I2C GPIO pins
//
#define GPIO_PIN_SDAA 0U // GPIO number for I2C SDAA
#define GPIO_PIN_SCLA 1U // GPIO number for I2C SCLA
#define TIME_OVER 1000
#define TIME_OVER 100 //*0.1 mS, 1000 ~ 100 mS, 100 ~ 10mS
uint16_t TimerTimeouts = 0, ErrI2c = 0, ErrI2c1 = 0, ErrI2c2 = 0, ErrI2c3 = 0, Addr1[255];
uint16_t RXdata, addrCount=0;
volatile uint16_t TimerTimeouts = 0, ErrI2c = 0, ErrI2c1 = 0, ErrI2c2 = 0, ErrI2c3 = 0, ErrI2c4 = 0, ErrI2c5 = 0, Addr1[255];
volatile uint16_t RXdata, addrCount=0;
void TimerBaseTimeoutInc(void)
{
TimerTimeouts++;
if(TimerTimeouts < TIME_OVER*16) TimerTimeouts++;
}
@ -75,6 +71,10 @@ void I2CMasterInit(uint16_t I2C_OwnAddress, uint16_t I2CSlave_Address)
//
I2caRegs.I2CMDR.bit.BC = 0x0U;
I2caRegs.I2CFFRX.bit.RXFFRST = 1;
I2caRegs.I2CFFTX.bit.I2CFFEN = 1;
I2caRegs.I2CFFTX.bit.TXFFRST = 1;
//
// Configure slave and own address
//
@ -125,7 +125,7 @@ uint16_t j = 0;
//
// Function to send data over I2C.
//
void I2CWrite(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_TXdata)
uint16_t I2CWrite(uint16_t slaveAddr, uint16_t MemAdr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_TXdata)
{
//
@ -133,6 +133,21 @@ void I2CWrite(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, ui
//
uint16_t index = 0;
I2caRegs.I2CFFRX.bit.RXFFRST = 0;
I2caRegs.I2CFFTX.bit.I2CFFEN = 0;
I2caRegs.I2CFFTX.bit.TXFFRST = 0;
I2caRegs.I2CFFRX.bit.RXFFRST = 1;
I2caRegs.I2CFFTX.bit.I2CFFEN = 1;
I2caRegs.I2CFFTX.bit.TXFFRST = 1;
TimerTimeouts = 0;
while((I2caRegs.I2CSTR.bit.BB == 1)&&(TimerTimeouts < TIME_OVER));
if(TimerTimeouts >= TIME_OVER)
{
ErrI2c++;
return 1;
}
//
// Configure slave address
//
@ -147,13 +162,12 @@ void I2CWrite(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, ui
//
//Set Data Count
//
I2caRegs.I2CCNT = byteCount;
I2caRegs.I2CFFTX.bit.TXFFINTCLR = 1;
I2caRegs.I2CCNT = byteCount+1;
//
// send Start condition
//
// I2caRegs.I2CMDR.bit.STP = 0x1;
I2caRegs.I2CMDR.bit.STT = 0x1;
I2caRegs.I2CMDR.bit.NACKMOD = 0x0;
I2caRegs.I2CDXR.all = MemAdr ;
//
//transmit the bytes
@ -161,33 +175,54 @@ void I2CWrite(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, ui
for(index=0; index < byteCount; index++)
{
I2caRegs.I2CDXR.all= I2C_TXdata[index];
}
//
// send Start condition
//
I2caRegs.I2CMDR.bit.STT = 0x1;
//
//wait till byte is sent
//
TimerTimeouts = 0;
while((I2caRegs.I2CSTR.bit.BYTESENT != 0x1)&&(TimerTimeouts < TIME_OVER));
TimerTimeouts = 0;
while((I2caRegs.I2CFFTX.bit.TXFFST > 0)&&(TimerTimeouts < TIME_OVER*(byteCount+1)));
if(TimerTimeouts >= TIME_OVER)
{
ErrI2c++;
return 1;
}
I2caRegs.I2CFFTX.bit.TXFFINTCLR = 1;
I2caRegs.I2CSTR.bit.BYTESENT = 0x1;
if(TimerTimeouts >= TIME_OVER) {ErrI2c++; return;}
TimerTimeouts = 0;
while((I2caRegs.I2CSTR.bit.NACK == 0x1)&&(TimerTimeouts < TIME_OVER));
if(TimerTimeouts >= TIME_OVER)
{
ErrI2c1++;
return 1;
}
//
// Send STOP condition if specified
//
if(sendStopCondition)
{
I2caRegs.I2CMDR.bit.STP = 0x1;
TimerTimeouts = 0;
while((I2caRegs.I2CMDR.bit.STP != 0x0)&&(TimerTimeouts < TIME_OVER));
I2caRegs.I2CSTR.bit.BYTESENT = 0x1;
if(TimerTimeouts >= TIME_OVER) {ErrI2c1++; return;}
if(TimerTimeouts >= TIME_OVER)
{
ErrI2c2++;
return 1;
}
}
I2caRegs.I2CSTR.bit.BYTESENT = 0x1;
TimerTimeouts = 0;
while(TimerTimeouts < TIME_OVER);
return 0;
}
//
// Function to read data over I2C. Returns the number of bytes read
//
uint16_t ttest=0;
uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_RXdata)
{
I2caRegs.I2CMDR.bit.NACKMOD = 0x0;
@ -202,6 +237,67 @@ uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition,
I2caRegs.I2CMDR.bit.MST = 0x1;
I2caRegs.I2CMDR.bit.TRX = 0x0;
uint16_t count = 0;
I2caRegs.I2CFFRX.bit.RXFFINTCLR = 0;
I2caRegs.I2CCNT = byteCount;
I2caRegs.I2CMDR.bit.STT = 0x1;
TimerTimeouts = 0;
while( (I2caRegs.I2CFFRX.bit.RXFFST < byteCount) && (TimerTimeouts < TIME_OVER*byteCount));
if(TimerTimeouts >= TIME_OVER)
{
ErrI2c3++;
return 1;
}
I2caRegs.I2CMDR.bit.STP = 0x1;
for(count=0; count < byteCount; count++)
{
RXdata = I2C_RXdata[count] = I2caRegs.I2CDRR.all;
}
// TimerTimeouts = 0;
// while((I2caRegs.I2CSTR.bit.NACK == 0x1)&&(TimerTimeouts < TIME_OVER));
// if(TimerTimeouts >= TIME_OVER)
// {
// ErrI2c4++;
// return 1;
// }
I2caRegs.I2CMDR.bit.NACKMOD = 0x1;
TimerTimeouts = 0;
while((I2caRegs.I2CMDR.bit.STP != 0x0)&&(TimerTimeouts < TIME_OVER));
if(TimerTimeouts >= TIME_OVER)
{
ErrI2c5++;
return 1;
}
I2caRegs.I2CSTR.bit.BYTESENT = 0x1;
I2caRegs.I2CFFRX.bit.RXFFINTCLR = 0;
return 0;
}
uint16_t I2CVerify(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_Vfdata)
{
uint16_t VerErr = 0;
I2caRegs.I2CMDR.bit.NACKMOD = 0x0;
//
// Configure slave address
//
I2caRegs.I2CSAR.all = slaveAddr;
//
// Configure I2C in Master Receiver mode
//
I2caRegs.I2CMDR.bit.MST = 0x1;
I2caRegs.I2CMDR.bit.TRX = 0x0;
uint16_t count = 0;
@ -218,11 +314,12 @@ uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition,
// if(count == (byteCount-1)) {I2caRegs.I2CMDR.bit.NACKMOD = 0x1; I2caRegs.I2CMDR.bit.STP = 0x1;}
if(I2caRegs.I2CSTR.bit.RRDY ==0x1)
{
RXdata = I2C_RXdata[count] = I2caRegs.I2CDRR.all;
RXdata = I2caRegs.I2CDRR.all;
if(I2C_Vfdata[count] != RXdata) VerErr = 1;
count++;
}
}
if(TimerTimeouts >= TIME_OVER) {ErrI2c2 += (byteCount - count); return 0;}
if(TimerTimeouts >= TIME_OVER) {ErrI2c2 += (byteCount - count); return 1;}
//
// Send STOP condition
@ -233,11 +330,8 @@ uint16_t I2CRead(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition,
TimerTimeouts = 0;
while((I2caRegs.I2CMDR.bit.STP != 0x0)&&(TimerTimeouts < TIME_OVER));
I2caRegs.I2CSTR.bit.BYTESENT = 0x1;
if(TimerTimeouts >= TIME_OVER) {ErrI2c3++; return 0;}
if(TimerTimeouts >= TIME_OVER) {ErrI2c3++; return 1;}
}
return count;
if(VerErr) return 2;
else return 0;
}

View File

@ -17,9 +17,10 @@
void I2CMasterInit(uint16_t I2CSlave_OwnAddress, uint16_t I2CSlave_Address);
void I2CWrite(uint16_t slaveAddr, uint16_t byteCount, bool sendStopCondition, uint16_t * I2C_TXdata);
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);

View File

@ -35,13 +35,39 @@ void FRMUartInit(void)
// GPIO_SetupPinMux() - Sets the GPxMUX1/2 and GPyMUX1/2 register bits
// GPIO_SetupPinOptions() - Sets the direction and configuration of the GPIOS
// These functions are found in the f2838x_gpio.c file.
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 1; // Disable pull-up
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;
// EALLOW;
// GpioCtrlRegs.GPAPUD.bit.GPIO28 = 1; // Disable pull-up
// GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;
//
// GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; //rx
// GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; //tx
// EDIS;
//
// EALLOW;
// GpioCtrlRegs.GPCPUD.bit.GPIO84 = 1; //tx
// GpioCtrlRegs.GPCPUD.bit.GPIO85 = 0;
//
// GpioCtrlRegs.GPCMUX2.bit.GPIO28 = 1; //
// GpioCtrlRegs.GPCMUX2.bit.GPIO29 = 1; //
// EDIS;
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; //
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; //
GPIO_SetupPinMux(85, GPIO_MUX_CPU1, 5);
GPIO_SetupPinOptions(85, GPIO_INPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(84, GPIO_MUX_CPU1, 5);
GPIO_SetupPinOptions(84, GPIO_OUTPUT, GPIO_ASYNC);
GPIO_SetupPinMux(108, GPIO_MUX_CPU1, 0);
GPIO_SetupPinOptions(108, GPIO_INPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(83, GPIO_MUX_CPU1, 0);
GPIO_SetupPinOptions(83, GPIO_INPUT, GPIO_PUSHPULL);
EALLOW;
GpioCtrlRegs.GPDDIR.bit.GPIO108 = 1;
GpioDataRegs.GPDDAT.bit.GPIO108 = 0;
GpioCtrlRegs.GPCDIR.bit.GPIO83 = 1;
GpioDataRegs.GPCDAT.bit.GPIO83 = 1;
EDIS;
// GPIO_SetupPinMux(28, GPIO_MUX_CPU1, 1);
// GPIO_SetupPinOptions(28, GPIO_INPUT, GPIO_PUSHPULL);
// GPIO_SetupPinMux(29, GPIO_MUX_CPU1, 1);
@ -103,26 +129,30 @@ void FMSTR_SCI_PUTCHAR(char _data)
char FMSTR_SCI_GETCHAR()
{
return SciaRegs.SCIRXBUF.all; ;
return SciaRegs.SCIRXBUF.all;
}
void FMSTR_SCI_RE(void)
{
GpioDataRegs.GPCDAT.bit.GPIO83 = 0;
SciaRegs.SCICTL1.bit.RXENA = 1;
}
void FMSTR_SCI_RD(void)
{
GpioDataRegs.GPCDAT.bit.GPIO83 = 1;
SciaRegs.SCICTL1.bit.RXENA = 0;
}
void FMSTR_SCI_TE(void)
{
GpioDataRegs.GPDDAT.bit.GPIO108 = 1;
SciaRegs.SCICTL1.bit.TXENA = 1;
}
void FMSTR_SCI_TD(void)
{
GpioDataRegs.GPDDAT.bit.GPIO108 = 0;
SciaRegs.SCICTL1.bit.TXENA = 0;
}

View File

@ -1,376 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configurations XML_version="1.2" id="configurations_0">
<configuration XML_version="1.2" id="Texas Instruments XDS100v2 USB Debug Probe_0">
<instance XML_version="1.2" desc="Texas Instruments XDS100v2 USB Debug Probe_0" href="connections/TIXDS100v2_Connection.xml" id="Texas Instruments XDS100v2 USB Debug Probe_0" xml="TIXDS100v2_Connection.xml" xmlpath="connections"/>
<connection XML_version="1.2" id="Texas Instruments XDS100v2 USB Debug Probe_0">
<instance XML_version="1.2" href="drivers/tixds100v2icepick_c.xml" id="drivers" xml="tixds100v2icepick_c.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds100v2c28x.xml" id="drivers" xml="tixds100v2c28x.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds100v2cla2.xml" id="drivers" xml="tixds100v2cla2.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds100v2cs_child.xml" id="drivers" xml="tixds100v2cs_child.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds100v2cs_dap.xml" id="drivers" xml="tixds100v2cs_dap.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds100v2cortexM.xml" id="drivers" xml="tixds100v2cortexM.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds510ajsm.xml" id="drivers" xml="tixds510ajsm.xml" xmlpath="drivers"/>
<configuration XML_version="1.2" id="Texas Instruments XDS2xx USB Debug Probe_0">
<instance XML_version="1.2" desc="Texas Instruments XDS2xx USB Debug Probe_0" href="connections/TIXDS2XXUSB_Connection.xml" id="Texas Instruments XDS2xx USB Debug Probe_0" xml="TIXDS2XXUSB_Connection.xml" xmlpath="connections"/>
<connection XML_version="1.2" id="Texas Instruments XDS2xx USB Debug Probe_0">
<instance XML_version="1.2" href="drivers/tixds560icepick_c.xml" id="drivers" xml="tixds560icepick_c.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds560c28x.xml" id="drivers" xml="tixds560c28x.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds560cla2.xml" id="drivers" xml="tixds560cla2.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds560cs_child.xml" id="drivers" xml="tixds560cs_child.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds560cs_dap.xml" id="drivers" xml="tixds560cs_dap.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds560cortexM.xml" id="drivers" xml="tixds560cortexM.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds560ajsm.xml" id="drivers" xml="tixds560ajsm.xml" xmlpath="drivers"/>
<platform XML_version="1.2" id="platform_0">
<instance XML_version="1.2" desc="TMS320F28388D_0" href="devices/f28388d.xml" id="TMS320F28388D_0" xml="f28388d.xml" xmlpath="devices"/>
<device HW_revision="1" XML_version="1.2" description="" id="TMS320F28388D_0" partnum="TMS320F28388D" simulation="no">
<device HW_revision="1" XML_version="1.2" description="" id="TMS320F28388D_0" partnum="TMS320F28388D">
<router HW_revision="1.0" XML_version="1.2" description="ICEPick_C router" id="IcePick_C_0" isa="ICEPICK_C">
<subpath id="Subpath_1">
<property Type="numericfield" Value="0x11" desc="Port Number_0" id="Port Number"/>
</subpath>
<subpath id="CM">
<property Type="numericfield" Value="0x12" desc="Port Number_1" id="Port Number"/>
</subpath>
<subpath id="Subpath_3">
<cpu HW_revision="1.0" XML_version="1.2" description="JLM" deviceSim="false" id="JLM" isa="AJSM">
<property Type="numericfield" Value="0x0" id="Unlock Key bits 31:00"/>
<property Type="numericfield" Value="0x0" id="Unlock Key bits 63:32"/>
<property Type="numericfield" Value="0x0" id="Unlock Key bits 95:64"/>
<property Type="numericfield" Value="0x0" id="Unlock Key bits 127:96"/>
</cpu>
</subpath>
</router>
</device>
</platform>
</connection>
</configuration>
</configurations>