Razvalyaev
7e0063eee0
Все основные файлы подтянуты без изменений Изменены (только папка main_matlab): - заглушки для ненужных функций (main_matlab.c) - iq библиотека (IQmathLib_matlab.c) - библиотеки DSP281x
562 lines
12 KiB
C
562 lines
12 KiB
C
#include "xPeriphSP6_loader.h"
|
||
|
||
#include "DSP281x_Examples.h"
|
||
#include "DSP281x_Device.h"
|
||
#include "MemoryFunctions.h"
|
||
#include "Spartan2E_Adr.h"
|
||
#include "Spartan2E_Functions.h"
|
||
#include "TuneUpPlane.h"
|
||
#include "x_parallel_bus.h"
|
||
#include "xp_project.h"
|
||
|
||
|
||
|
||
Byte byte; //used 8 most significant bits
|
||
Word word;
|
||
ControlReg controlReg;
|
||
|
||
volatile AddrToSent addrToSent;
|
||
WordToReverse wordToReverse;
|
||
WordReversed wordReversed;
|
||
|
||
|
||
volatile int fail = 0;
|
||
volatile unsigned long length = 0;
|
||
volatile int tryNumb = 0;
|
||
int manufactorerAndProductID = 0;
|
||
static int countInMemWrite = 0;
|
||
|
||
void initState(int adr_device){
|
||
controlReg.all = 0x0000;
|
||
controlReg.bit.cs = 1;
|
||
controlReg.bit.rw = 1;
|
||
controlReg.bit.plane_addr = adr_device;
|
||
controlReg.bit.clock = 0;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
}
|
||
|
||
|
||
|
||
void sendByte(void){
|
||
int bitCnt = 8;
|
||
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.data = byte.bit.data;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
|
||
while (bitCnt > 0) {
|
||
if (controlReg.bit.clock == 1) {
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.data = byte.bit.data;
|
||
// bitCnt--;
|
||
} else {
|
||
controlReg.bit.clock = 1;
|
||
byte.all = byte.all << 1;
|
||
bitCnt--;
|
||
}
|
||
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
}
|
||
}
|
||
|
||
|
||
void sendWord(void){
|
||
int bitCnt = 16;
|
||
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.data = word.bit.data;
|
||
// controlReg.bit.data = word.bit.dataReceived;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
|
||
while (bitCnt > 0) {
|
||
if (controlReg.bit.clock == 1) {
|
||
controlReg.bit.clock = 0;
|
||
// controlReg.bit.data = word.bit.dataReceived;
|
||
controlReg.bit.data = word.bit.data;
|
||
} else {
|
||
controlReg.bit.clock = 1;
|
||
// word.all = word.all >> 1;
|
||
word.all = word.all << 1;
|
||
bitCnt--;
|
||
}
|
||
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
void readByte(void){
|
||
int bitCnt = 8;
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.rw = 0;
|
||
controlReg.bit.data = 0;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
// byte.all = 0x0000;
|
||
while (bitCnt > 0) {
|
||
if (controlReg.bit.clock == 1) {
|
||
byte.all = byte.all << 1;
|
||
controlReg.all = i_ReadMemory(ADR_CONTR_REG_FOR_READ);
|
||
byte.bit.dataReceived = controlReg.bit.eeprom_read;
|
||
controlReg.bit.clock = 0;
|
||
bitCnt--;
|
||
} else {
|
||
controlReg.all = i_ReadMemory(ADR_CONTR_REG_FOR_READ);
|
||
controlReg.bit.clock = 1;
|
||
}
|
||
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
}
|
||
}
|
||
|
||
void readWord(void){
|
||
int bitCnt = 16;
|
||
word.all = 0x0000;
|
||
while (bitCnt > 0) {
|
||
if (controlReg.bit.clock == 1) {
|
||
word.all = word.all << 1;
|
||
// word.all = word.all >> 1;
|
||
controlReg.all = i_ReadMemory(ADR_CONTR_REG_FOR_READ);
|
||
word.bit.dataReceived = controlReg.bit.eeprom_read;
|
||
// word.bit.data = controlReg.bit.eeprom_read;
|
||
controlReg.bit.clock = 0;
|
||
bitCnt--;
|
||
} else {
|
||
controlReg.all = i_ReadMemory(ADR_CONTR_REG_FOR_READ);
|
||
controlReg.bit.clock = 1;
|
||
}
|
||
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
void WREN(void) {
|
||
controlReg.bit.cs = 0;
|
||
byte.all= 0x0600;
|
||
sendByte();
|
||
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.data = 0;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
controlReg.bit.cs = 1;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
}
|
||
|
||
void WRDI(void) {
|
||
controlReg.bit.cs = 0;
|
||
byte.all= 0x0400;
|
||
sendByte();
|
||
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.data = 0;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
controlReg.bit.cs = 1;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
}
|
||
|
||
void WRSR(void) {
|
||
controlReg.bit.cs = 0;
|
||
byte.all= 0x0100;
|
||
sendByte();
|
||
|
||
byte.all= 0x0200;
|
||
sendByte();
|
||
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.data = 0;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
controlReg.bit.cs = 1;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
}
|
||
|
||
void RDSR(void) {
|
||
controlReg.bit.cs = 0;
|
||
controlReg.bit.rw = 1;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
byte.all= 0x0500;
|
||
sendByte();
|
||
|
||
|
||
readByte();
|
||
|
||
controlReg.bit.cs = 1;
|
||
controlReg.bit.rw = 1;
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.data = 0;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
|
||
}
|
||
|
||
void RDID(void) {
|
||
controlReg.bit.cs = 0;
|
||
controlReg.bit.rw = 1;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
if (manufactorerAndProductID == 0)
|
||
byte.all = 0x1500;
|
||
else
|
||
byte.all = 0x9F00;
|
||
sendByte();
|
||
|
||
|
||
readByte();
|
||
|
||
controlReg.bit.cs = 1;
|
||
controlReg.bit.rw = 1;
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.data = 0;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
|
||
}
|
||
|
||
void ERASE(void) {
|
||
controlReg.bit.cs = 0;
|
||
if (manufactorerAndProductID == 0)
|
||
byte.all = 0x6200;
|
||
else
|
||
byte.all = 0xC700;
|
||
sendByte();
|
||
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.data = 0;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
controlReg.bit.cs = 1;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
}
|
||
|
||
|
||
|
||
void READ(void) {
|
||
controlReg.bit.cs = 0;
|
||
byte.all= 0x0300;
|
||
sendByte();
|
||
}
|
||
|
||
void PROGRAM(void) {
|
||
controlReg.bit.cs = 0;
|
||
byte.all= 0x0200;
|
||
sendByte();
|
||
}
|
||
|
||
void ADDR3bytes(FlashAddr flashAddr) {
|
||
int bitCnt = 24;
|
||
addrToSent.all= flashAddr.all;
|
||
addrToSent.all= addrToSent.all << 8;
|
||
|
||
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.data = addrToSent.bit.data;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
|
||
while (bitCnt > 0) {
|
||
if (controlReg.bit.clock == 1) {
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.data = addrToSent.bit.data;
|
||
// bitCnt--;
|
||
} else {
|
||
controlReg.bit.clock = 1;
|
||
addrToSent.all = addrToSent.all << 1;
|
||
bitCnt--;
|
||
}
|
||
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
void DataW256Bytes(volatile unsigned long addrToRead) {
|
||
unsigned long WordNum = 0;
|
||
|
||
while (WordNum < 128) {
|
||
wordToReverse.all= i_ReadMemory(addrToRead + WordNum);
|
||
|
||
wordReversed.bit.bit0 = wordToReverse.bit.bit7;
|
||
wordReversed.bit.bit1 = wordToReverse.bit.bit6;
|
||
wordReversed.bit.bit2 = wordToReverse.bit.bit5;
|
||
wordReversed.bit.bit3 = wordToReverse.bit.bit4;
|
||
wordReversed.bit.bit4 = wordToReverse.bit.bit3;
|
||
wordReversed.bit.bit5 = wordToReverse.bit.bit2;
|
||
wordReversed.bit.bit6 = wordToReverse.bit.bit1;
|
||
wordReversed.bit.bit7 = wordToReverse.bit.bit0;
|
||
|
||
wordReversed.bit.bit8 = wordToReverse.bit.bit15;
|
||
wordReversed.bit.bit9 = wordToReverse.bit.bit14;
|
||
wordReversed.bit.bit10 = wordToReverse.bit.bit13;
|
||
wordReversed.bit.bit11 = wordToReverse.bit.bit12;
|
||
wordReversed.bit.bit12 = wordToReverse.bit.bit11;
|
||
wordReversed.bit.bit13 = wordToReverse.bit.bit10;
|
||
wordReversed.bit.bit14 = wordToReverse.bit.bit9;
|
||
wordReversed.bit.bit15 = wordToReverse.bit.bit8;
|
||
|
||
word.all= wordReversed.all;
|
||
sendWord();
|
||
WordNum++;
|
||
}
|
||
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.data = 0;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
controlReg.bit.cs = 1;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
|
||
}
|
||
|
||
void DataR256Bytes(volatile unsigned long addrToRead) {
|
||
|
||
unsigned long WordNum = 0;
|
||
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.rw = 0;
|
||
controlReg.bit.data = 0;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
|
||
while (WordNum < 128) {
|
||
if ((addrToRead + WordNum) <= length) {
|
||
readWord();
|
||
|
||
wordToReverse.all= i_ReadMemory(addrToRead + WordNum);
|
||
|
||
wordReversed.bit.bit0 = wordToReverse.bit.bit7;
|
||
wordReversed.bit.bit1 = wordToReverse.bit.bit6;
|
||
wordReversed.bit.bit2 = wordToReverse.bit.bit5;
|
||
wordReversed.bit.bit3 = wordToReverse.bit.bit4;
|
||
wordReversed.bit.bit4 = wordToReverse.bit.bit3;
|
||
wordReversed.bit.bit5 = wordToReverse.bit.bit2;
|
||
wordReversed.bit.bit6 = wordToReverse.bit.bit1;
|
||
wordReversed.bit.bit7 = wordToReverse.bit.bit0;
|
||
|
||
wordReversed.bit.bit8 = wordToReverse.bit.bit15;
|
||
wordReversed.bit.bit9 = wordToReverse.bit.bit14;
|
||
wordReversed.bit.bit10 = wordToReverse.bit.bit13;
|
||
wordReversed.bit.bit11 = wordToReverse.bit.bit12;
|
||
wordReversed.bit.bit12 = wordToReverse.bit.bit11;
|
||
wordReversed.bit.bit13 = wordToReverse.bit.bit10;
|
||
wordReversed.bit.bit14 = wordToReverse.bit.bit9;
|
||
wordReversed.bit.bit15 = wordToReverse.bit.bit8;
|
||
|
||
if (word.all != wordReversed.all) {
|
||
fail++;
|
||
WordNum =128;
|
||
} else {
|
||
fail = 0;
|
||
}
|
||
WordNum++;
|
||
} else {
|
||
// flashAddr.bit.addr2 = 0xFF;
|
||
WordNum =128; //finish flash writing
|
||
}
|
||
}
|
||
|
||
controlReg.bit.cs = 1;
|
||
controlReg.bit.rw = 1;
|
||
controlReg.bit.clock = 0;
|
||
controlReg.bit.data = 0;
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, controlReg.all);
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
void memWrite (unsigned int adr_device, volatile unsigned long adr,
|
||
volatile unsigned long adr_eeprom, volatile unsigned long size, unsigned long *ok_write,
|
||
unsigned long *write_error, unsigned long *repeat_error )
|
||
{
|
||
|
||
/////////**********************
|
||
/////////before start procedure
|
||
/////////**********************
|
||
volatile int failNumb = 0;
|
||
volatile int checkNumb = 0;
|
||
volatile unsigned long addrToRead = 0;
|
||
volatile FlashAddr flashAddr;
|
||
|
||
|
||
Led1_Toggle();
|
||
Led2_Toggle();
|
||
|
||
*ok_write= size;
|
||
|
||
|
||
countInMemWrite++;
|
||
|
||
failNumb = 0;
|
||
checkNumb = 0;
|
||
addrToRead = adr;
|
||
length = size + addrToRead;
|
||
addrToRead = adr +8;
|
||
|
||
*write_error = 0;
|
||
*repeat_error = 0;
|
||
|
||
project.stop_parallel_bus();
|
||
|
||
initState(adr_device);
|
||
|
||
|
||
WREN();
|
||
manufactorerAndProductID = 0;
|
||
RDID();
|
||
if (byte.all != 0x1F00) {
|
||
manufactorerAndProductID = 1;
|
||
RDID();
|
||
if ((byte.all != 0x2000) && (byte.all != 0xEF00)) *write_error = 5; //TODO: make defines with flash ID NAMES
|
||
}
|
||
WREN();
|
||
WRSR();
|
||
RDSR();
|
||
|
||
while (byte.all > 0) {
|
||
if (checkNumb < 3) {
|
||
DELAY_US(150);
|
||
RDSR(); //check that flash is not busy
|
||
|
||
// byte.all = 1; // for test!
|
||
|
||
if (failNumb > 1000) {
|
||
// if (failNumb > 30000) { //1000 // for test!
|
||
WREN();
|
||
WRSR();
|
||
RDSR();
|
||
failNumb = 0;
|
||
checkNumb++;
|
||
}
|
||
failNumb++;
|
||
} else {
|
||
*write_error = 1;
|
||
*ok_write= 0;
|
||
failNumb = 1000;
|
||
byte.all = 0x0000;
|
||
tryNumb++;
|
||
}
|
||
}
|
||
|
||
|
||
// failNumb = 1000; // for test!
|
||
|
||
if (failNumb < 1000) {
|
||
|
||
failNumb = 0;
|
||
checkNumb = 0;
|
||
|
||
|
||
WREN();
|
||
ERASE();
|
||
RDSR();
|
||
while (byte.all > 0) {
|
||
DELAY_US(70000);
|
||
RDSR(); //check that flash is not busy
|
||
if (failNumb > 1000) {
|
||
*ok_write= 0;
|
||
*write_error = 2;
|
||
byte.all = 0x0000;
|
||
tryNumb++;
|
||
}
|
||
failNumb++;
|
||
}
|
||
}
|
||
|
||
if (failNumb < 1000) {
|
||
failNumb = 0;
|
||
|
||
flashAddr.all = 0;
|
||
|
||
|
||
/////////**********************
|
||
/////////before start procedure finished
|
||
/////////**********************
|
||
|
||
while (flashAddr.bit.addr2 < 0x08){
|
||
WREN();
|
||
PROGRAM();
|
||
ADDR3bytes(flashAddr);
|
||
DataW256Bytes(addrToRead);
|
||
RDSR();
|
||
Led1_Toggle();
|
||
failNumb = 0;
|
||
checkNumb = 0;
|
||
while (byte.all != 0x0000){
|
||
if (byte.all != 0x0200) {
|
||
if (checkNumb < 30) {
|
||
DELAY_US(3500);
|
||
RDSR(); //check that flash is not busy
|
||
checkNumb++;
|
||
} else {
|
||
byte.all = 0x0200;
|
||
}
|
||
|
||
} else { //programming the page not completed, it's still "data ready"
|
||
if (failNumb < 20) {
|
||
WREN();
|
||
PROGRAM(); //complete procedure again
|
||
ADDR3bytes(flashAddr);
|
||
DataW256Bytes(addrToRead);
|
||
RDSR();
|
||
checkNumb = 0;
|
||
failNumb++;
|
||
} else {
|
||
*ok_write= addrToRead - adr-8;
|
||
*write_error = 3;
|
||
byte.all = 0x0000;
|
||
flashAddr.bit.addr2 = 0x08;
|
||
tryNumb++;
|
||
// asm (" ESTOP0"); //for save flash life
|
||
}
|
||
}
|
||
}
|
||
|
||
if (failNumb < 20){
|
||
READ();
|
||
ADDR3bytes(flashAddr);
|
||
DataR256Bytes(addrToRead);
|
||
Led2_Toggle();
|
||
if (fail ==0) { //if page written correctly, go to the next
|
||
if (flashAddr.bit.addr1 < 0xff) {
|
||
flashAddr.bit.addr1++;
|
||
} else {
|
||
flashAddr.bit.addr1 = 0;
|
||
flashAddr.bit.addr2++;
|
||
}
|
||
addrToRead += 0x00000080;
|
||
} else if (fail > 7) {
|
||
*ok_write= addrToRead - adr - 8;
|
||
*write_error = 4;
|
||
*repeat_error = fail;
|
||
flashAddr.bit.addr2 = 0x08;
|
||
tryNumb++;
|
||
// asm (" ESTOP0"); //for save flash life
|
||
}
|
||
}
|
||
|
||
}
|
||
if ((*write_error != 0) && (tryNumb < 3) && (countInMemWrite < 3)) {
|
||
memWrite (adr_device, adr, adr_eeprom, size, ok_write, write_error, repeat_error );
|
||
}
|
||
countInMemWrite = 0;
|
||
}
|
||
|
||
|
||
tryNumb =0;
|
||
|
||
WriteMemory(ADR_CONTR_REG_FOR_WRITE, 0xffff);
|
||
WriteMemory(ADR_CONTR_REG_FOR_READ, 0xffff);
|
||
|
||
project.reload_all_plates_without_reset_no_stop_error();// wait_start_cds + load_cfg
|
||
|
||
|
||
|
||
WriteMemory(ADR_BUS_ERROR_READ, 0);
|
||
|
||
if(i_ReadMemory(ADR_ERRORS_TOTAL_INFO)) //<2F><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||
{
|
||
xerror(main_er_ID(3),(void *)0);
|
||
}
|
||
|
||
|
||
project.start_parallel_bus();
|
||
}
|