проверка памяти
This commit is contained in:
parent
f2e133ebb1
commit
f9a72e9ac6
Binary file not shown.
@ -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); //åñëè äàííûå äëÿ çàïèñè îñòàëèñü, òî çàïèñûâàåì èõ
|
||||
}
|
||||
}
|
||||
|
||||
@ -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_ */
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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_ */
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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_ */
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user