Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: flash на SPI, LPC213x
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Spb_Alex
Проблема в следующем, я посылаю команду flash-у, шлю три байта адреса, а потом - тишина, прерывание не генерится, вопрос так и должно?

flash - serial - AT26DF atmel

//// на всякий случай - прога

void SPI_ISR (void) __irq // обработчик прерываний SPI (для внешней flash)
{
syst_fl.Irq();

S0SPINT = SPINT_reset; //Signal end of interrupt
VICVectAddr = NULL_REG; //Dummy write to signal end of interrupt
}

void CApuLibDataFlash::Irq() // реакция на прерывание по SPI
{
switch(status)
{
case (SPI_STAT1):
S0SPDR = AT26_write;
status = SPI_STAT2; //set next state
break;

case (SPI_STAT2): //Send Write Address
if( --SPI_byte_adr_count)
{
status = SPI_STAT2; //Set Next state
}
else
{
status = SPI_STAT3; //End condition
}
S0SPDR = adr_bufer[SPI_byte_adr_count]; //Send Address

break;

case (SPI_STAT3): //write data
S0SPDR = *SPI_buffer++;
if( --SPI_bytecount)
{
status = SPI_STAT3; //Set Next state
}
else
{
status = SPI_STAT4; //End condition
}
break;

case (SPI_STAT4): //End condition
S0SPDR = Dummy; //Need this dummy write for simulation
IOSET1 = IOCLR1_pull_low; //Pull Chipselect high
status = SPI_STAT7; //jump to null case
break;


case (SPI_STAT5):
if(( --SPI_byte_adr_count)-1)
{
status = SPI_STAT6; //Set Next state
}
else
{
status = SPI_STAT5; //End condition
}
S0SPDR = adr_bufer[SPI_byte_adr_count]; //Send Address

status = SPI_STAT6; //set next state
break;

case (SPI_STAT6):
*SPI_buffer = S0SPDR; //read data
S0SPDR = 0xFF; //Send Address //temp
SPI_buffer++;

if( --SPI_bytecount)
{
status = SPI_STAT6; //Set Next state
}
else
{
status = SPI_STAT7; //End condition
}
break;

case (SPI_STAT7) : //Null Case
lock = 0;
break;

case (SPI_STAT8): // передача адреса

if( ( --SPI_byte_adr_count)-1)
{
status = SPI_STAT8; //Set Next state
}
else
{
status = SPI_STAT7; //End condition
}
S0SPDR = adr_bufer[SPI_byte_adr_count]; //Send Address
break;


default :
break;

}

};
zltigo
Moderator:
Настоятельно не рекомедуется постить обширные неформатированные и нечитабельные исходники. Как минимум пользуйтесь соответствущими тэгами.
Alex03
Spb_Alex Читать неформатированный текст тяжело, а разбираться во всей Вашей машине состояний тоже моло кому охота, тем более что нет инициализации, старта передачи и т.д. Из вопроса так и не понял толи у Вас шлются первых 3 байта, толи сразу прерывания не работают. Да и флеш там на SPI повешен или ещё чего - дело десятое. Если нет прерываний всех кроме первого - то так и пишите.

Теперь по делу:
Цитата
SPI Status Register (S0SPSR - 0xE002 0004)

Bit 7 SPIF - SPI transfer complete flag. When 1, this bit indicates when a SPI data transfer is complete. When a master, this bit is set at the end of the last cycle of the transfer. When a slave, this bit is set on the last data sampling edge of the SCK. This bit is cleared by first reading this register, then accessing the SPI data register.
Note: this is not the SPI interrupt flag. This flag is found in the SPINT register.

Цитата
SPI Interrupt register (S0SPINT - 0xE002 001C)

Bit 0 SPI Interrupt Flag - SPI interrupt flag. Set by the SPI interface to generate an interrupt. Cleared by writing a 1 to this bit.
Note: this bit will be set once when SPIE = 1 and at least one of SPIF and MODF bits changes from 0 to 1. However, only when the SPI Interrupt bit is set and SPI Interrupt is enabled in the VIC, SPI based interrupt can be processed by interrupt handling software.

Т.е. как минимум читайте SPSR в прерывании.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.