Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

SPI, AT91SAM7S и IAR

Отправлено Ильдар 29 марта 2007 г. 14:01


здравствуйте!
пытаюсь в иаре проинициализировать SPI но он не включается. что может быть?
инициализирую так:
static void init_SPI2(void)
{
unsigned char i;
AT91PS_SPI pSPI = AT91C_BASE_SPI;
AT91PS_PIO pPIOA = AT91C_BASE_PIOA;
AT91PS_PMC pPMC = AT91C_BASE_PMC;
// AT91PS_PDC pPDC_SPI = AT91C_BASE_PDC_SPI;

// disable PIO from controlling MOSI, MISO, SCK (=hand over to SPI)
// keep CS untouched - used as GPIO pin during init
pPIOA->PIO_PDR = AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK; // | NCPS_PDR_BIT;
// set pin-functions in PIO Controller
pPIOA->PIO_ASR = AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK; /// not here: | NCPS_ASR_BIT;
/// not here: pPIOA->PIO_BSR = NPCS_BSR_BIT;

// set chip-select as output high (unselect card)
pPIOA->PIO_PER = NPCS_BSR_BIT; // enable PIO of CS-pin
pPIOA->PIO_SODR = NPCS_BSR_BIT; // set
pPIOA->PIO_OER = NPCS_BSR_BIT; // output

// enable peripheral clock for SPI ( PID Bit 5 )
pPMC->PMC_PCER = ( (unsigned short) 1 << AT91C_ID_SPI ); // n.b. IDs are just bit-numbers

// SPI enable and reset
pSPI->SPI_CR = AT91C_SPI_SPIEN | AT91C_SPI_SWRST;

// SPI mode: master, fixed periph. sel., FDIV=0, fault detection disabled
pSPI->SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED | AT91C_SPI_MODFDIS;

// set PCS for fixed select
pSPI->SPI_MR &= 0xFFF0FFFF; // clear old PCS - redundant (AT91lib)
pSPI->SPI_MR |= ( (SPI_MR_PCS<<16) & AT91C_SPI_PCS ); // set PCS

// set chip-select-register
// 8 bits per transfer, CPOL=1, ClockPhase=0, DLYBCT = 0
// TODO: Why has CPOL to be active here and non-active on LPC2000?
// Take closer look on timing diagrams in datasheets.
/*
MMC reads data on the rising edge => CPOL=CPHA can't work
=> possible settings: CPOL=0, CPHA=1; CPOL=1, CPHA=0

*/
//pSPI->SPI_CSR[SPI_CSR_NUM] = AT91C_SPI_CPOL | AT91C_SPI_BITS_8 | AT91C_SPI_NCPHA;
//pSPI->SPI_CSR[SPI_CSR_NUM] = AT91C_SPI_BITS_8 | AT91C_SPI_NCPHA;
pSPI->SPI_CSR[SPI_CSR_NUM] = AT91C_SPI_CPOL | AT91C_SPI_BITS_8; // ok
//pSPI->SPI_CSR[SPI_CSR_NUM] = AT91C_SPI_BITS_8;

// slow during init
//if_spiSetSpeed(0xFE); //---------------------

// enable
pSPI->SPI_CR = AT91C_SPI_SPIEN;

/* enable automatic chip-select *//*
pPIOA->PIO_ODR = NPCS_BSR_BIT; // input
pPIOA->PIO_CODR = NPCS_BSR_BIT; // clear
// disable PIO from controlling the CS pin (=hand over to SPI)
pPIOA->PIO_PDR = NCPS_PDR_BIT;
// set pin-functions in PIO Controller
pPIOA->PIO_ASR = NCPS_ASR_BIT;
pPIOA->PIO_BSR = NPCS_BSR_BIT;*/
AT91C_BASE_PIOA->PIO_PDR = AT91C_PA14_SPCK | AT91C_PA13_MOSI | AT91C_PA12_MISO | AT91C_PA11_NPCS0;
AT91C_BASE_PIOA->PIO_ASR = AT91C_PA14_SPCK | AT91C_PA13_MOSI | AT91C_PA12_MISO | AT91C_PA11_NPCS0;
}

при этом когда ставлю pSPI->SPI_CR = AT91C_SPI_SPIEN;
значение pSPI->SPI_CR не изменяется.
также ничего не выводится при записи в регистр SPI_TDR
в чем я здесь ошибся?

Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
увеличьте 6 на 2:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru