/** * @file tools.c * @brief Низкоуровневая настройка XINTF Zone 7 и микросекундные задержки. * * init_zone7() программирует GPIO и временные параметры внешней 16-битной шины. * Значения lead/active/trail привязаны к частоте SYSCLKOUT и характеристикам * внешней памяти. pause_us() является активным ожиданием и блокирует процессор, * поэтому подходит только для коротких аппаратных пауз вне критичных ISR. */ #include "DSP2833x_Device.h" // DSP281x Headerfile Include File // Configure the timing paramaters for Zone 7. // Notes: // This function should not be executed from XINTF // Adjust the timing based on the data manual and // external device requirements. /** * @brief Включает XINTF и программирует временную диаграмму Zone 7. * @pre Функция исполняется не из памяти, отображённой в настраиваемую Zone 7. * @post Внешняя шина работает в 16-битном режиме с XTIMCLK=SYSCLKOUT. * @warning Значения тактов рассчитаны для штатной частоты платы. */ void init_zone7(void) { // Make sure the XINTF clock is enabled SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1; // Configure the GPIO for XINTF with a 16-bit data bus // This function is in DSP2833x_Xintf.c InitXintf16Gpio(); EALLOW; // All Zones--------------------------------- // Timing for all zones based on XTIMCLK = SYSCLKOUT XintfRegs.XINTCNF2.bit.XTIMCLK = 0; // Buffer up to 3 writes XintfRegs.XINTCNF2.bit.WRBUFF = 3; // XCLKOUT is enabled XintfRegs.XINTCNF2.bit.CLKOFF = 0; // XCLKOUT = XTIMCLK XintfRegs.XINTCNF2.bit.CLKMODE = 0; // Zone 7------------------------------------ // When using ready, ACTIVE must be 1 or greater // Lead must always be 1 or greater // Zone write timing XintfRegs.XTIMING7.bit.XWRLEAD = 1; XintfRegs.XTIMING7.bit.XWRACTIVE = 2; XintfRegs.XTIMING7.bit.XWRTRAIL = 1; // Zone read timing XintfRegs.XTIMING7.bit.XRDLEAD = 1; XintfRegs.XTIMING7.bit.XRDACTIVE = 3; XintfRegs.XTIMING7.bit.XRDTRAIL = 0; // don't double all Zone read/write lead/active/trail timing XintfRegs.XTIMING7.bit.X2TIMING = 0; // Zone will not sample XREADY signal XintfRegs.XTIMING7.bit.USEREADY = 0; XintfRegs.XTIMING7.bit.READYMODE = 0; // 1,1 = x16 data bus // 0,1 = x32 data bus // other values are reserved XintfRegs.XTIMING7.bit.XSIZE = 3; EDIS; //Force a pipeline flush to ensure that the write to //the last register configured occurs before returning. asm(" RPT #7 || NOP"); } /** * @brief Выполняет блокирующую паузу приблизительно t микросекунд. * @param t Требуемая длительность при текущей конфигурации SYSCLKOUT. * @note Во время цикла процессор не выполняет foreground-работу. */ void pause_us(unsigned long t) { unsigned long i; t = t >> 1; for (i = 0; i < t; i++) { DSP28x_usDelay(CLKMULT*8L); } }