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

 
 
> ADuC7021: ADC и SPI, косяк работы АЦП
krofork
сообщение May 10 2007, 10:32
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 15-12-06
Пользователь №: 23 530



есть ADuC7021 (ARM7TDMI).

у него работает АЦП
то что он напреобразовывал должно отдаваться по SPI.

На вход подаётся тестовый периодический сигнал (период ~20 мс).
если он то что напреобразовывал отдаёт по UART, то вроде всё нормально

если же включаем SPI (UART продолжает работать - собственно через него я и веду "лог" работы программы), то в оцифрованном сигнале вижу "зарубки" (нулевое значение) через каждые ~2мс. причем периодичность этих "зарубов" не зависит от скорости обмена по SPI (брались скорости и 250кГц и 1 МГц и 4МГц)

канал АЦП - ADC0

интересно также, что в обратном направлении (Ц-А пробразование буфера принятого по SPI, периодическое) - происходит без косяков - то есть работа SPI каким то макаром отражается на АЦП и никак на ЦАП.

может кто нибудь наведет, почему может происходить подобное?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Waso
сообщение Aug 24 2010, 09:36
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



День добрый!
Подниму тему ибо уже неделю бьюсь и не могу победить. Тоже ADuc7021, тоже проблема с SPI. Причем уже передавать пытаюсь банальный алфавит, но на приемной стороне его нет, а только нули, нули... Это проверено осциллографом. Вот код:
Код
  // SPISTA (p.70)
#define SPIRX_OVF   (SPISTA & (1<<5))
#define SPIRX_IRQ   (SPISTA & (1<<4))
#define SPIRX_FULL  (SPISTA & (1<<3))
#define SPITX_UDF   (SPISTA & (1<<2))
#define SPITX_IRQ   (SPISTA & (1<<1))
#define SPITX_EMPTY (!(SPISTA & (1)))

// SPICON  (p.70)
#define SPI_CONTINUOUS_TX   (1UL << 12)
#define SPI_LOOPBACK        (1UL << 11)
#define SPI_SO_EN           (1UL << 10)
#define SPI_SLAVE_SELECT_EN (1UL << 9)
#define SPI_RXOVF_OVERWRITE (1UL << 8)
#define SPI_TXUDF_SENDZERO  (1UL << 7)
#define SPI_TXWRITE_TRANS   (1UL << 6)
#define SPI_LSB_FIRST       (1UL << 5)
#define SPI_CLK_IDLEHIGH    (1UL << 3)
#define SPI_PHASE           (1UL << 2)
#define SPI_MASTER_MODE     (1UL << 1)
#define SPI_ENABLE          (1UL << 0)

#define SPI_BITRATE     1000000LL
#define SPI_MODE  (SPI_TXWRITE_TRANS | SPI_SO_EN | SPI_ENABLE \
                   | SPI_TXUDF_SENDZERO | SPI_CONTINUOUS_TX)

#ifndef SPI_BITRATE
#define SPI_BITRATE  100000LL
#endif

#define SPI_DIVISOR (((41779200LL/2)/SPI_BITRATE)-1)

#if (SPI_DIVISOR >= 0xFE)
#error "Bad SPI_BITRATE value! Look p.69 datasheet."
#endif

#ifndef SPI_MODE
#error "SPI_MODE not defined!"
#endif

uint8_t spidata[SPI_N];     // буфер выходных данных SPI

void SPI_Init(void)
{
  SPICON = SPI_MODE;
  SPIDIV = SPI_DIVISOR;
#if (SPI_MODE&SPI_MASTER_MODE)
  dir_out(SPI_SCK);
  dir_out(SPI_MOSI);
  dir_in(SPI_MISO);
  GP1CON &= ~(0x0FFF0000); GP1CON |= 0x02220000; // выбрали функцию GPIO как SPI
#else // (SPI_MODE&SPI_MASTER_MODE)
  dir_in(SPI_SCK);
  dir_in(SPI_MOSI);
  dir_out(SPI_MISO);
  dir_in(SPI_CS);  
  GP1CON &= ~(0xFFFF0000); GP1CON |= 0x22220000; // выбрали функцию GPIO как SPI
#endif //(SPI_MODE&SPI_MASTER_MODE)
}

__inline void SPI_StartIRQTX(void)
{
  spitxcount = 0;
  SPITX = spidata[spitxcount++];
  IRQEN = SPI_SLAVE_BIT;
  on(Req);      // сигнал что данные готовы - когда мастер его видит - он выставляет SlaveSelect и читает данные.
}

void SPI_Ready_ISR(void)
{
  SPITX = spidata[spitxcount++];
  if(spitxcount>=SPI_N)
  {
    IRQCLR = SPI_SLAVE_BIT;
    off(Req);
    if(AdcBufRdy_flag) ADC_Start();
  }
}

void main(void){
...
SPI_Init();
...
while(1)    // вечный цикл
  {
      while(spitxcount < SPI_N);  // Ждем окончания передачи предыдущих байт..

spidata[0] = 'A'; spidata[1] = 'B'; spidata[2] = 'C'; spidata[3] = 'D';
spidata[4] = 'E'; spidata[5] = 'F'; spidata[6] = 'G'; spidata[7] = 'H';

      SPI_StartIRQTX();   // запускаем передачу данных на фоне
  }
}

Если убрать из режима SPI_TXUDF_SENDZERO (передача нуля если передающий регистр не готов), то шлет не нули а всякую чушь. Тоесть на лицо Underflow (передающий регистр не готов). А почему оно так - непойму.
Go to the top of the page
 
+Quote Post



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

 


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


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