Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Виснет программа с дерганьем ногой
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Colobox
Доброго всем времени суток!

LPC2138, IAR 4.5
Имеется вот такой код обмена по SPI:
Код
#define CS0_ON          IO0CLR_bit.P0_7= 1//
#define CS0_OFF         IO0SET_bit.P0_7= 1//
#define CS1_ON          IO0SET_bit.P0_10= 1//
#define CS1_OFF         IO0CLR_bit.P0_10= 1//
#define CS_OFF           CS0_OFF; CS1_OFF

//-----------------------------------------------------
bool TSpiTransfer::Pop( void )
{
if ( !Ready() )  return false;
//====
Start();
//====================================
TTransaction* t= &Transaction[current];
//=================
byte a= t->Address();
Select(a);
//=================
Buffer[0]= t->Cmd();//
t->Load( Buffer );
//====
byte l= t->Length();
for ( byte i = 0; i < l; ++i )
{
Spi0ReadWrite( Buffer[i] );
};
//====
l= t->ResponseLength();
for ( int i = 0; i < l; ++i )
{
  Buffer[i]= Spi0ReadWrite();
};

//=================
CS_OFF;//
//=================
t->Apply();//
run= false;
//=======================================
Discount();
//====================================
return true;
}
//------------------------------------------------------
void TSpiTransfer::Select ( byte Address )
{
//=====================
switch ( Address )
  {
   case 0 : CS0_ON;
        break;
   case 1 : CS1_ON;
        break;
  //====
   default : CS0_ON;
   };//end of switch ( Address )
//======================
}
//------------------------------------------------------

После запуска мк виснет насмерть. Пошагово смотрел- выполняются несколько
команд в начале main(), затем прерывание по системному таймеру- обработка прерывания и...
переход на начало программы, затем прерывание и т.д. по кругу.
Если Select() убрать, то все нормально. Если вместо Select() просто поставить CS0_ON (без выбора), например,
то все нормально также.
Чем ИАРу switch с ногодерганьем не нравица???!!! :-(
Причем, замена switch на if (...) else if (...) приводит к такому же зависону.
AHTOXA
Вряд ли дело в свиче. А CS1 точно имеет активный уровень 1?
Цитата(Colobox @ Mar 23 2010, 13:16) *
Код
#define CS1_ON          IO0SET_bit.P0_10= 1//

И я бы убрал "//" из макроса.
_Pasha
Цитата(Colobox @ Mar 23 2010, 12:16) *
Если вместо Select() просто поставить CS0_ON (без выбора), например,
то все нормально также.

Хто такой этот byte у Вас и не помогает ли он влететь в Data Abort ?
MALLOY2
Приведенный код работать должен, навсякий неплохо было бы взглянуть на TTransaction. Но 99% проблема или в нехватке стека или прерывания обрабатываются не должным образом ищите собаку там.
Colobox
Цитата(MALLOY2 @ Mar 23 2010, 16:04) *
Приведенный код работать должен, навсякий неплохо было бы взглянуть на TTransaction. Но 99% проблема или в нехватке стека или прерывания обрабатываются не должным образом ищите собаку там.


Нет, классы ни причем:
Код
//-----------------------------------------------------------
void Select ( byte Address )
{
if( Address )
CS0_ON;
   else
     CS1_ON;
}
//------------------------------------------------------------
int main()
{
.....................
.....................
Select ( 0 );
.....................
.....................
}


Такой безотносительный код тоже виснет. Программа вылетает в _exit:
И потом на j-link овский резет не реагирует, так в exit-е и находится.
MALLOY2
_exit: это заглушка иара, туда попадаешь при выходе с функции main, там код зацикливается.

Сделайте так:
Код
int main()
{
   Select ( 0 );
   for(;;);
}


Или так:
Код
int main()
{
    for(;;)
    {
         Select ( 0 );
     }
}
Colobox
Хм... Посмотрел внимательно прогу: в одном классе описал массивы, а память под них не выделил,
ни статически, ни динамически, а потом заносил в эти масссивы данные, портя память.
Скорее всего в этом и была проблема. Спасибо за ответы smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.