Перейти к содержанию
    

TMS320VC5509A idle mode

Здравствуйте!

Есть DSP 5509A, c внешним кварцем на 12МГц. Пытаюсь загнать его в режим IDLE, с выключением всех доменов, и получить заветные микроамперы, сулимые даташитом spra078d.pdf. Код отрабатывает, ядро засыпает - видно по снижению потребления и, собственно, по коду. Но кварец продолжает стучать. Камень грузится из флэша по spi. Перед засыпанием никакие прерывания не разрешаю. Приведу код, вдруг что-нибудь упустил. Прошу прощение за "magic nubmers". CSL не использую, чтобы ничего не упустить.

 

  volatile int i;

  _disable_interrupts();
  
  *EBSR = 0x8000; // Clockout disable in External Bus Selection Register
  *USBDPLL = 0x0200; // set USB PLL to x4 in USB PLL register
  *USBDPLL = 0x0210; // set lock bit
  *USBIDLECTL = 0x0004; // activate USB (USB Reset = 1) in USB IDLE Control register
  *USBCTL |= 0x0080; // pull DP high in USB CTL
  *USBIDLECTL = 0x0005; // activate USB and enable USB idle (USB Reset =1, USB Idle = 1)
  *EBSR = 0xc000; // Clockout & osc disable in External Bus Selection Register
  
  *I2CMDR2 = 0x0001; // IDLE IIC
  *ADCCLKCTL = 0x0100; // IDLE ADC
  
  *(ioport volatile unsigned int *)0x2812 |= 0x4000; // IDLE McBSP0 with PCR0
  *(ioport volatile unsigned int *)0x2C12 |= 0x4000; // IDLE McBSP1 with PCR1
  *(ioport volatile unsigned int *)0x3012 |= 0x4000; // IDLE McBSP2 with PCR2
  *(ioport volatile unsigned int *)0x1002 |= 0x8000; // IDLE Timer0 with TCR0
  *(ioport volatile unsigned int *)0x2402 |= 0x8000; // IDLE Timer1 with TCR1
  *IER0 = 0x0000;
  *IER1 = 0x0000;
  *IFR0 = 0xffff;
  *IFR1 = 0xffff;
  
  
  *ICR = 0x002E; // enable EMIF, Peripheral, and DMA idle
  for (i=0; i<1000; i++);
  asm(" IDLE");

  *ICR = 0x003F; // enable all domens idle
  // delay of at least 2.5 us needed between the two IDLE instructions
  for (i=0; i<1000; i++);
  asm(" IDLE");

Есть подозрение, что какой-то блок не даёт выключить домен CLKGEN. Если запустить код под эмулятором, то после нажатия Halt, регистр ISTR (Idle Status Register) содержит 0x003F. т.е. все блоки в неактивном состоянии. В регистрах IFR0 и IFR1 нули.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...