Проблема в следующем, я посылаю команду 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;
}
};
|