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

 
 
> AT91rm9200 работа с SPI через PDC, Особенности работы
Daermon
сообщение Nov 23 2007, 06:06
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 36
Регистрация: 26-10-07
Пользователь №: 31 739



Подскажите порядок работы.

Как я это вижу сам.
1. Делаю инициализацию
void DAC::Init()
{
AT91F_PIOA_CfgPMC();
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,
((unsigned int) AT91C_PA4_NPCS1 ) |
((unsigned int) AT91C_PA1_MOSI ) |
((unsigned int) AT91C_PA2_SPCK ), // Peripheral A
0); // Peripheral B
AT91F_AIC_CfgPMC();
AT91F_SPI_CfgPMC();
SPI_Configure(AT91C_BASE_SPI, AT91C_SPI_MSTR| // Master Mode
AT91C_SPI_PS_FIXED| // Fixed peripheral
AT91C_SPI_MODFDIS| // Mode Fault Detection disable
AT91C_SPI_PCS1);
AT91F_SPI_CfgCs (1, (unsigned int)(0xff<<8));
AT91F_SPI_Enable(AT91C_BASE_SPI);
AT91F_PDC_Open(AT91C_BASE_PDC_SPI);
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_SPI,0, 0, (void (*)(void))IRQ_SPI);
AT91C_BASE_AIC->AIC_EOICR = 0 ; /* unstack one level */
AT91C_BASE_AIC->AIC_ICCR = ( 1<<AT91C_ID_SPI );

AT91F_SPI_SendFrame (AT91C_BASE_SPI, TxBuf, 5, 0,0 );

AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_SPI);
__enable_interrupt();

AT91F_SPI_EnableIt(AT91C_BASE_SPI,AT91C_SPI_SPENDTX); //AT91C_US_RXRDY);

}

inline void SPI_Configure(AT91PS_SPI pSPI, unsigned int mode)
{
//* Reset the SPI mode
pSPI->SPI_MR = 0 ;
//* Disable all interrupts
pSPI->SPI_IDR = 0xFFFFFFFF ;
//* Reset all the Chip Select register
pSPI->SPI_CSR[0] = 0 ;
pSPI->SPI_CSR[1] = 0 ;
pSPI->SPI_CSR[2] = 0 ;
pSPI->SPI_CSR[3] = 0 ;
//* Disable receiver and transmitter and stop any activity immediately
pSPI->SPI_CR = AT91C_SPI_SPIDIS;

AT91F_SPI_CfgMode (pSPI, mode);


}

2. Обработчик прерывания :
static __arm __irq void IRQ_SPI()
{
AT91C_BASE_AIC->AIC_IVR = 0 ; /* enter interrupt in protected mode */
unsigned int st,st1;
st = (AT91C_BASE_SPI->SPI_SR) ;
st1 = (AT91C_BASE_SPI->SPI_IMR);
st &=st1;
if( st & AT91C_SPI_SPENDTX)
{
AT91F_SPI_SendFrame (AT91C_BASE_SPI, TxBuf, 1, 0,0 );
}
AT91C_BASE_US1->US_CR = AT91C_US_RSTSTA;
AT91C_BASE_AIC->AIC_EOICR = 0 ;

};



В таком виде все работает(что то передается по шине), но возникает вопрос: Нужно ли управлять NPCS1? (Использую всего одно устройство - ЦАП). NPCS1 держиться постоянно 0.

Какие еще особенности могут быть при работе с ЦАП?

Сообщение отредактировал Daermon - Nov 23 2007, 06:11
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 10:32
Рейтинг@Mail.ru


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