реклама на сайте
подробности

 
 
> Не работает SPI
yshur
сообщение Jan 20 2007, 13:29
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 20-01-07
Пользователь №: 24 624



Используем ARM AT91M42800 и АЦП с SPI интерфейсом.
Драйвер для чтение АЦП отказывается работать, если поместить чтение АЦП в прерывание от таймера (на ножках SPI ничего нет).
Вне прерывания драйвер работает нормально.

В чем может быть проблема?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Jan 20 2007, 13:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Изложите проблему более подробно, и приведите код "драйвера" АЦП и прерывания таймера. А то так гадать придется долго.
Go to the top of the page
 
+Quote Post
yshur
сообщение Jan 20 2007, 14:22
Сообщение #3





Группа: Новичок
Сообщений: 2
Регистрация: 20-01-07
Пользователь №: 24 624



Цитата(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 не происходит.
Если читать АЦП без всяких прерываний все нормально.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 23:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01399 секунд с 7
ELECTRONIX ©2004-2016