Цитата(aaarrr @ Jan 20 2007, 13:37)

Изложите проблему более подробно, и приведите код "драйвера" АЦП и прерывания таймера. А то так гадать придется долго.
Вот драйвер чтения АЦП :
typedef struct _SPIA_Desc
{
const SpiDesc * spi_desc ;
u_int mode_spi ;
}SPIA_Desc ;
/*===============================================================================
===================
LOCAL MACROS
================================================================================
==================*/
/*===============================================================================
===================
LOCAL VARIABLES
================================================================================
==================*/
/*===============================================================================
===================
GLOBAL VARIABLES
================================================================================
==================*/
SPIA_Desc spia_dev = {0};
/*===============================================================================
===================
LOCAL FUNCTIONS
================================================================================
==================*/
/*===============================================================================
===================
GLOBAL FUNCTIONS
================================================================================
==================*/
/*===============================================================================
===================
FUNCTION: Data_Processor_Handler()
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
None
PRE-CONDITIONS:
None
POST-CONDITIONS:
IMPORTANT NOTES:
None
================================================================================
==================*/
ERROR_CODE HAPI_SPIA_Init(void )
{
ERROR_CODE ret_value = TRUE;
spia_dev.spi_desc = &SPIA_DESC;
spia_dev.mode_spi = (SPI_MASTER
//#ifdef _DEBUG_ATMEL
| SPI_NPCS0_USED
| SPI_NPCS1_USED
| SPI_NPCS2_USED);
/*
#else
| SPI_NPCS0_USED | SPI_NPCS0_OPENDRAIN
| SPI_NPCS1_USED | SPI_NPCS1_OPENDRAIN
| SPI_NPCS2_USED | SPI_NPCS2_OPENDRAIN);
#endif
*/
// HAPI_GPIO_Set(LED1);
return ret_value;
}
/*===============================================================================
===================
FUNCTION: Data_Processor_Handler()
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
None
PRE-CONDITIONS:
None
POST-CONDITIONS:
IMPORTANT NOTES:
None
================================================================================
==================*/
ERROR_CODE HAPI_SPIA_On(void )
{
ERROR_CODE ret_value = TRUE;
u_int status;
at91_spi_open ( spia_dev.spi_desc, spia_dev.mode_spi );
status = at91_spi_get_status (spia_dev.spi_desc);
// SPI mode reg
spia_dev.spi_desc->spi_base->SP_MR = SP_MSTR;
spia_dev.spi_desc->spi_base->SP_MR |= 0x0A000000;
// SPI CS regs
spia_dev.spi_desc->spi_base->SP_CSR[0] = 0x0A000000 | 0x00020000 | 0x00000a00 | SP_CPOL | SP_NCPHA | SP_BITS_14;
spia_dev.spi_desc->spi_base->SP_CSR[1] = 0x0A000000 | 0x00020000 | 0x00000a00 | SP_CPOL | SP_NCPHA | SP_BITS_14;
spia_dev.spi_desc->spi_base->SP_CSR[2] = 0x0A000000 | 0x00020000 | 0x00000a00 | SP_CPOL | SP_NCPHA | SP_BITS_14;
if(status & SP_SPIENS)
{
// HAPI_GPIO_Set(LED2);
}
return ret_value;
}
/*===============================================================================
===================
FUNCTION: Data_Processor_Handler()
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
None
PRE-CONDITIONS:
None
POST-CONDITIONS:
IMPORTANT NOTES:
None
================================================================================
==================*/
ERROR_CODE HAPI_SPIA_Off(void )
{
ERROR_CODE ret_value = TRUE;
u_int status;
at91_spi_close ( spia_dev.spi_desc );
status = at91_spi_get_status (spia_dev.spi_desc);
if(!(status & SP_SPIENS))
{
//HAPI_GPIO_Reset(LED2);
}
return ret_value;
}
/*===============================================================================
===================
FUNCTION: Data_Processor_Handler()
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
None
PRE-CONDITIONS:
None
POST-CONDITIONS:
IMPORTANT NOTES:
None
================================================================================
==================*/
ERROR_CODE HAPI_SPIA_Read(UINT8 chip_idx, UINT16 *data)
{
ERROR_CODE ret_value = TRUE;
short t_data = 0;
u_int mode_spi;
u_int status;
mode_spi = spia_dev.spi_desc->spi_base->SP_MR;
mode_spi &= ~(SP_PCS);
switch(chip_idx)
{
case(0):
mode_spi |= SP_PCS0;
break;
case(1):
mode_spi |= SP_PCS1;
break;
case(2):
mode_spi |= SP_PCS2;
break;
default:
mode_spi |= SP_PCS0;
break;
}
spia_dev.spi_desc->spi_base->SP_MR = mode_spi;
// HAPI_GPIO_Set(LED3);
at91_spi_write( spia_dev.spi_desc, &t_data );
do
{
status = at91_spi_get_status (spia_dev.spi_desc);
}
while(!(status & SP_TDRE));
do
{
status = at91_spi_get_status (spia_dev.spi_desc);
}
while(!(status & SP_RDRF));
at91_spi_read( spia_dev.spi_desc, &t_data );
//HAPI_GPIO_Reset(LED3);
*data = (UINT16)t_data;
return ret_value;
}
/*===============================================================================
===================
FUNCTION: HAPI_SPIA_FastRead()
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
None
PRE-CONDITIONS:
None
POST-CONDITIONS:
IMPORTANT NOTES:
None
================================================================================
==================*/
ERROR_CODE HAPI_SPIA_FastRead(UINT8 chip_idx, UINT16 *data)
{
ERROR_CODE ret_value = TRUE;
short t_data = 0;
u_int mode_spi;
u_int status;
u_int i;
mode_spi = spia_dev.spi_desc->spi_base->SP_MR;
mode_spi &= ~(SP_PCS);
switch(chip_idx)
{
case(0):
mode_spi |= SP_PCS0;
break;
case(1):
mode_spi |= SP_PCS1;
break;
case(2):
mode_spi |= SP_PCS2;
break;
default:
mode_spi |= SP_PCS0;
break;
}
spia_dev.spi_desc->spi_base->SP_MR = mode_spi;
// Write data
spia_dev.spi_desc->spi_base->SP_TDR = *data ;
// Check that data has been sent
while(!(spia_dev.spi_desc->spi_base->SP_SR & SP_TDRE));
// Check that data has been received
while(!(spia_dev.spi_desc->spi_base->SP_SR & SP_RDRF));
// Read data
*data = (UINT16)(spia_dev.spi_desc->spi_base->SP_RDR & SP_RD);
for(i = 0; i < 80; i++);
return ret_value;
}
Предварительно инициализирую АЦП функциями HAPI_SPIA_Init и HAPI_SPIA_On
Функция обработчика прерывания:
__irq void sys_ADC_Timer_irq_handler_CH1(void)
{
u_int readkey;
UINT16 buf;
;
readkey=TC5_SR;
HAPI_SPIA_FastRead(ADC_CHANNEL_1, &buf );
AIC_EOICR = 0xFFFFFFFF;
}
Проблема в том что елси вызываю HAPI_SPIA_FastRead из обработчика прерывания , реально передачи данных по SPI не происходит.
Если читать АЦП без всяких прерываний все нормально.