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

 
 
 
Reply to this topicStart new topic
> At91sam7s256 + AD7715, проблема в SPI?
Shaienn
сообщение Sep 17 2010, 10:01
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494



Добрый день, уважаемые.

Такая проблема, соединил эти два устройства по SPI. Прохожу, с помощью JTAG, операцию чтения из АЦП, получаю нормальные значения. Но когда запускаю без JTAG, то появляется проблема:

Код
unsigned short AD7715ReadData (void)
{
    adcStatus = 0;
    do
    {
    communicationsRegister = read;
    sendSPI(&communicationsRegister);
    adcStatus = receiveSPI();
    }
    while (adcStatus != 0x08);
    communicationsRegister = toDataRegister|read;
    sendSPI(&communicationsRegister);
    adcDATA =  receiveSPI() << 8;
    adcDATA |= receiveSPI();
    return adcDATA;
}


Когда прохожу через JTAG, получаю adcStatus == 0x08 (флаг готовых данных), потом забираю значения из регистра данных.
Но когда JTAGом смотрю только в определенных точках, adcStatus, в основном, 0xFF (иногда появляются левые значения). Соответственно, данные из ацп не забрать.

Пробовал написать программный SPI, но проблема не решилась. То же самое (почти).


То есть SPI в пошаговом режиме принимает правильные данные, а в обычном - гонит.
Из-за чего может возникать такая ситуация? Были мысли про скорость, тормозил SPI, но не влияет.
Голову уже сломал.

Инициализация, прием и отправка по SPI...
Код
void initSPI(void)
{
// Execute a software reset of the SPI twice
AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SWRST;
AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SWRST;

// Configure SPI in Master Mode
AT91C_BASE_SPI->SPI_MR = AT91C_SPI_MSTR |
                         AT91C_SPI_PS_FIXED |
                         (0<<16);
AT91C_BASE_SPI->SPI_CSR[0]   =  AT91C_SPI_CPOL |
                                 AT91C_SPI_SCBR;
// Enable the SPI
AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SPIEN;

}

unsigned short sendSPI (unsigned char *data)
{
AT91C_BASE_SPI->SPI_TDR= *data;
while(!(AT91C_SPI_TDRE));    
return 1;
}

unsigned short receiveSPI (void)
{
while(!(AT91C_SPI_TDRE));
AT91C_BASE_SPI->SPI_TDR = 0xFF;
while(!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_RDRF));
return (AT91C_BASE_SPI->SPI_RDR);
}


Есть идеи?

Сообщение отредактировал Shaienn - Sep 17 2010, 12:54
Go to the top of the page
 
+Quote Post

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

 


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


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