Добрый день, уважаемые.
Такая проблема, соединил эти два устройства по 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