89 lines
3.3 KiB
C
89 lines
3.3 KiB
C
/**
|
||
* @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);
|
||
} }
|
||
|