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 )
//======================
}
//------------------------------------------------------
#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 (...) приводит к такому же зависону.