[an error occurred while processing this directive]
Опять-таки SPI в AT89S8252, будь он неладен!
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено ПиТёК 01 августа 2002 г. 10:02

По просьбе уважаемого Abc123 привожу полный текст функции, в которой отключается и включается SPI:
[CSAD - внешний регистр для chip-select'a АЦП LTC2418, используется в частности для проверки окончания преобразования.]
Проблема в том, что после выключения SPI (SPCR=0x17;), проверки готовности результата и включения SPI при работе с ним (SPDR=xx) на выходах SPI ничего не появляется. Если убрать выключение/включение SPI через SPCR, то он работает нормально.

void GetADC(uchar channel)
{ uint k;
SPCR=0x17; // disable SPI, работаем с Р1.6, Р1.7 как с битами порта...
SCK=0;
CSAD=0xFE;
k=8000;
while (--k) { WATCHDOG=1; CSAD=0xFE; if (!MISO) break; CSAD=0xFF; }
if (k==0) ADCval[channel].Val=0xFFFFFFFF;
else { // conversion is finished, read ADC
SPCR=0x57; // Enable SPI, Р1.6 и Р1.7 подключаются к SPI
k=SPSR;
ADCval[channel].Val=0L;
SPDR=0xA0+channel;
k=100; while (((SPSR & 0x80)==0) && (k!=0)) k--;
ADCval[channel].Bytes[0]=SPDR;
SPDR=0;
k=100; while (((SPSR & 0x80)==0) && (k!=0)) k--;
ADCval[channel].Bytes[1]=SPDR;
SPDR=0;
k=100; while (((SPSR & 0x80)==0) && (k!=0)) k--;
ADCval[channel].Bytes[2]=SPDR;
SPDR=0;
k=100; while (((SPSR & 0x80)==0) && (k!=0)) k--;
ADCval[channel].Bytes[3]=SPDR;
WATCHDOG=1;
}
CSAD=0xFF;
}

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru