Начинает работать только после внешнего ресета.
Код:
CODE
u8 buf[3801];
u8 crc8_crn = 0; // CRC8 для текущей команды
u8 crc8_prev = 0; // CRC8 для предыдущей команды
u8 crc8 = 0xFF; // CRC8 для подсчета, используется как буфер
u8 comand_crn[5] = {0,0,0,0,0}; // Запрос текущий
u8 comand_prev[5] = {0,0,0,0,0}; // Запрос предыдущий
u8 crc8_array[256] =
{...};
void ReadADC(void); // тение данных с АЦП
u8 ReadWriteSPI1(u8 data); // Чтение и запись с SPI1
u8 CalcCOMAND_CRC8(u8 col); // Расчет CRC8 приходящей команды
u8 crc8_table(u8 data); // Расчет CRC8 по таблице
void CalcBUF_CRC8(void); // Расчет CRC8 у buf[] и запись в последний номер crc8
int main (void){
// System initialization, this will map the exception vectors.
SystemInit(APBDIVISOR);
// initialization PLL
PLLInit();
// Power Control
PowerControl();
// First disable interrupts.
__disable_interrupt();
// Setup interrupt controller.
InitVIC();
InitTimer0Interrupt(Timer0Beat);
// Periodic timer initialization.
InitTimer0();
// Enable interrupts.
__enable_interrupt();
// Start periodic timer.
// StartTimer0();
// Set up peripheral registers.
InitGPIO();
InitSPI1();
u8 i = 0;
u8 fg;
crc8_prev = 0;
for (;;){ // Loop forever.
fg = ReadWriteSPI1(0);
if (fg != 0) {
comand_crn[0] = fg;
S1SPDR = 0;
i = 1;
while (SPI1_SSEL == 0){
if ((S1SPSR & 0x80)) {
comand_crn[i++] = S1SPDR;
S1SPDR = 0;
}
}// end While
// Проверка CRC8 приходящего запроса
crc8 = 0xFF;
crc8_crn = CalcCOMAND_CRC8(i-1);// щас фиксированно 3 байта приходит
if (crc8_prev == 0)
{
//====================================================
// Сначала отвечаем на запрос (предыдущий)
for (u16 k = 0; k <=3800; k++)
{ReadWriteSPI1(buf[k]);};
//====================================================
// Затем выполняем команду
switch (comand_crn[0]){ // В зависимости какая команда пришла
//----------------------------------------------------
case 'k' : //0x6B = 107 // Команда ""
.....
break;
//----------------------------------------------------
case 'z' : //'z' = 122 = 0x7A - Команда "Тест памяти"
.....
break;
//----------------------------------------------------
case 0xA0 : //'' 160 = - Команда ""
.....
break;
//----------------------------------------------------
default: {
....
}
//----------------------------------------------------
}// Конец swith
crc8_prev = crc8_crn;
for (u8 ct = 0; ct <= 4; ct++)
{comand_prev[ct] = comand_crn[ct];};
} //else { S1SPDR = 0;}
}// Есть ли команда
}// For - LOOP
}// End Main
u8 ReadWriteSPI1(u8 data){
S1SPDR = data;
while (!(S1SPSR & 0x80));
return S1SPDR;
};
u8 crc8_table(u8 data){
crc8 = crc8_array[(data ^ crc8)&0xff];
return crc8;
}
u8 CalcCOMAND_CRC8(u8 col){
crc8 = 0xFF;
for (u8 n = 0; n <= 2; n++)
{ crc8 = crc8_array[((comand_crn[n])^ crc8)&0xff]; }
return crc8;
}
void CalcBUF_CRC8(void){
crc8 = 0xFF;
for (u16 n = 0; n <= 3799; n++)
{ crc8 = crc8_table(buf[n]); }
buf[3800] = crc8;
}
u8 crc8_crn = 0; // CRC8 для текущей команды
u8 crc8_prev = 0; // CRC8 для предыдущей команды
u8 crc8 = 0xFF; // CRC8 для подсчета, используется как буфер
u8 comand_crn[5] = {0,0,0,0,0}; // Запрос текущий
u8 comand_prev[5] = {0,0,0,0,0}; // Запрос предыдущий
u8 crc8_array[256] =
{...};
void ReadADC(void); // тение данных с АЦП
u8 ReadWriteSPI1(u8 data); // Чтение и запись с SPI1
u8 CalcCOMAND_CRC8(u8 col); // Расчет CRC8 приходящей команды
u8 crc8_table(u8 data); // Расчет CRC8 по таблице
void CalcBUF_CRC8(void); // Расчет CRC8 у buf[] и запись в последний номер crc8
int main (void){
// System initialization, this will map the exception vectors.
SystemInit(APBDIVISOR);
// initialization PLL
PLLInit();
// Power Control
PowerControl();
// First disable interrupts.
__disable_interrupt();
// Setup interrupt controller.
InitVIC();
InitTimer0Interrupt(Timer0Beat);
// Periodic timer initialization.
InitTimer0();
// Enable interrupts.
__enable_interrupt();
// Start periodic timer.
// StartTimer0();
// Set up peripheral registers.
InitGPIO();
InitSPI1();
u8 i = 0;
u8 fg;
crc8_prev = 0;
for (;;){ // Loop forever.
fg = ReadWriteSPI1(0);
if (fg != 0) {
comand_crn[0] = fg;
S1SPDR = 0;
i = 1;
while (SPI1_SSEL == 0){
if ((S1SPSR & 0x80)) {
comand_crn[i++] = S1SPDR;
S1SPDR = 0;
}
}// end While
// Проверка CRC8 приходящего запроса
crc8 = 0xFF;
crc8_crn = CalcCOMAND_CRC8(i-1);// щас фиксированно 3 байта приходит
if (crc8_prev == 0)
{
//====================================================
// Сначала отвечаем на запрос (предыдущий)
for (u16 k = 0; k <=3800; k++)
{ReadWriteSPI1(buf[k]);};
//====================================================
// Затем выполняем команду
switch (comand_crn[0]){ // В зависимости какая команда пришла
//----------------------------------------------------
case 'k' : //0x6B = 107 // Команда ""
.....
break;
//----------------------------------------------------
case 'z' : //'z' = 122 = 0x7A - Команда "Тест памяти"
.....
break;
//----------------------------------------------------
case 0xA0 : //'' 160 = - Команда ""
.....
break;
//----------------------------------------------------
default: {
....
}
//----------------------------------------------------
}// Конец swith
crc8_prev = crc8_crn;
for (u8 ct = 0; ct <= 4; ct++)
{comand_prev[ct] = comand_crn[ct];};
} //else { S1SPDR = 0;}
}// Есть ли команда
}// For - LOOP
}// End Main
u8 ReadWriteSPI1(u8 data){
S1SPDR = data;
while (!(S1SPSR & 0x80));
return S1SPDR;
};
u8 crc8_table(u8 data){
crc8 = crc8_array[(data ^ crc8)&0xff];
return crc8;
}
u8 CalcCOMAND_CRC8(u8 col){
crc8 = 0xFF;
for (u8 n = 0; n <= 2; n++)
{ crc8 = crc8_array[((comand_crn[n])^ crc8)&0xff]; }
return crc8;
}
void CalcBUF_CRC8(void){
crc8 = 0xFF;
for (u16 n = 0; n <= 3799; n++)
{ crc8 = crc8_table(buf[n]); }
buf[3800] = crc8;
}
Так вот crc8 в строке
Код
// Проверка CRC8 приходящего запроса
crc8 = 0xFF;
crc8_crn = CalcCOMAND_CRC8(i-1);// щас фиксированно 3 байта приходит
проверятеся и не равен нулю. Хотя приходит коректное...crc8 = 0xFF;
crc8_crn = CalcCOMAND_CRC8(i-1);// щас фиксированно 3 байта приходит
Проверял ...
Если нажать на кнопку сброса - то всё окей! (!)
Затык получается в "if (crc8_prev == 0)" , хотя при 2-3 приходе команды crc ведь должен нормальным быть...
Инициализация мк проходит - это точно. Стоит супервизор. МК LPC2194 /01. Среда IAR, оптимизация High, ставил none - не помогает.
Что может быть? почему после ресета начинает нормально работать???
Заранее большое спасибо!