Да я тоже думаю, что дело не в MT-link в общем-то. В общем вот код: Функция InitMain+InitCPUSpeed:
void InitCPUSpeed(int speed)
/*******************************************************************
* Название
* InitCPUSpeed
* Описание
* инициализация скорости процессора
* Вызов
* (speed+1) - коэф. умножения частоты кварца
* Возвращаемые значения
* нет
* Статус тестирования
* функция работоспособна
********************************************************************/
{
VPBDIV_bit.VPBDIV=0;// 1/4 скорость - если здесь сделать сразу полную скорость - то глючит
VPBDIV_bit.XCLKDIV=0;// 1/4 скорость
// конфигурируем банки
BCFG0_bit.MW=0; // 8 bit ext bus
BCFG1_bit.MW=0; // 8 bit ext bus
BCFG2_bit.MW=0; // 8 bit ext bus
BCFG3_bit.MW=0; // 8 bit ext bus
BCFG0_bit.RBLE=0;
BCFG1_bit.RBLE=0;
BCFG2_bit.RBLE=0;
BCFG3_bit.RBLE=0;
BCFG0_bit.IDCY=0; // между банками и записью/чтением без задержек
BCFG1_bit.IDCY=0; // между банками и записью/чтением без задержек
BCFG2_bit.IDCY=0; // между банками и записью/чтением без задержек
BCFG3_bit.IDCY=0; // между банками и записью/чтением без задержек
// включили и подсоеденили PLL
// а также сразу программируем скорости для flash
// и памяти
switch(speed)
{
case 1:
// MAM config
MAMTIM = 2; // 2 цикла ожидания при выборке из флеш
// для частот 20...40 МГц
// конфигурация внешнего ОЗУ и устройств
// ОЗУ
BCFG0_bit.WST1=0; // хватит 3 ws на чтение = 101 нс
BCFG0_bit.WST2=3; // хватит 3 ws на запись (+ еще 2 на обрамление) = 101 (168) нс
// 29,4912 МГц
PLLCON=3;
PLLCFG_bit.PSEL=2; // Focco=14.7456*4*(1+1)*2=235,9296 МГц
PLLCFG_bit.MSEL=1;
break;
case 2:
// MAM config
MAMTIM = 3; // 3 цикла ожидания при выборке из флеш
// для частот >40 МГц
// конфигурация внешнего ОЗУ и устройств
// ОЗУ
BCFG0_bit.WST1=1; // хватит 4 ws на чтение = 91 нс
BCFG0_bit.WST2=3; // хватит 4 ws на запись (+ еще 2 на обрамление) = 91 (136) нс
// 44,2368
PLLCON=1;
PLLCFG_bit.PSEL=1; // Focco=14.7456*2*(2+1)*2=176,9472 МГц
PLLCFG_bit.MSEL=2;
break;
case 3:
// MAM config
MAMTIM = 3; // 3 цикла ожидания при выборке из флеш
// для частот >40 МГц
// конфигурация внешнего ОЗУ и устройств
// ОЗУ
BCFG0_bit.WST1=3; // хватит 5 ws на чтение = 84 нс
BCFG0_bit.WST2=5; // хватит 5 ws на запись (+ еще 2 на обрамление) = 84 (118) нс
// 58,9824
PLLCON=1;
PLLCFG_bit.PSEL=1; // Focco=14.7456*2*(3+1)*2=235,9296 МГц
PLLCFG_bit.MSEL=3;
break;
case 0:
default:
// MAM config
MAMTIM = 1; // 1 цикл ожидания при выборке из флеш
// для частот <20 МГц
// конфигурация внешнего ОЗУ и устройств
// ОЗУ
BCFG0_bit.WST1=0; // хватит 3 ws на чтение = 203 нс
BCFG0_bit.WST2=1; // хватит 2 ws на запись (+ еще 2 на обрамление) = 135 (271) нс
// PLL включен, но частота не умножается
// 14,7456 МГц
PLLCON=1;
PLLCFG_bit.PSEL=3; // Focco=14.7456*8*(0+1)*2=235,9296 МГц
PLLCFG_bit.MSEL=0;
break;
}
// активировали настройки PLL
// включаем PLL
PLLFEED=0xaa; PLLFEED=0x55;
// подождем, пока PLL войдет в захват
while (!(PLLSTAT & 0x400));
// теперь подключаем его к ядру
PLLCON=3;
PLLFEED=0xaa; PLLFEED=0x55;
MAMCR = 2; //разрешили полное использование MAM
// переключаем делитель внутренней частоты для переферии
VPBDIV_bit.VPBDIV=1;// полная скорость
VPBDIV_bit.XCLKDIV=1;// полная скорость
}
void InitMain(void)
/*******************************************************************
* Название
* InitMain
* Описание
* глобальная инициализация
* Вызов
* нет
* Возвращаемые значения
* нет
* Статус тестирования
* функция работоспособна
********************************************************************/
{
__disable_interrupt();
// включаем нужную карту памяти для векторов прерываний
#ifndef __CODE_IN_FLASH__
MEMMAP = 2;
#endif
#ifdef __CODE_IN_FLASH__
MEMMAP = 1;
#endif
PINSEL2=0xD800004; // 0000 1101 1000 0000 0000 0000 0000 0100
InitCPUSpeed(3);
ad660_initSPI();
ads1256_initSPI();
ads1256_self_cal();
InitInterrupt();
InitTimers();
DIO_init();
StartTimers();
__enable_interrupt();
}
Далее функция обработчика прерывания таймера, если в ней раскомментировать DIO_setLED4_7 и в функции InitCPUSpeed программировать VPBDIV в самом начале, то делитель реально не переключается а остается на четверти при отладке, без отладки все работает; если же нераскомментировать DIO_setLED4_7 и в функции InitCPUSpeed программировать VPBDIV в самом начале, то все пашет:
void T1Interrupt()
/*******************************************************************
* Название
* T1Interrupt
* Описание
* обработчик прерывания от перовго таймера
* Вызов
* нет
* Возвращаемые значения
* нет
* Статус тестирования
* функция работоспособна
********************************************************************/
{
WORD i;
DWORD MR2_val,T1IR_val;
T1IR_val=T1IR;
if( T1IR_val & (1 << 2))
{// (MR2)
if(!T1int_flag)
{
// забор данных
SPI_send_array[0]=0;
SPI_send_array[1]=0;
SPI_wait_time=__MR_value__(1.0);
SPI_PTR=0;
SPI_NUM=2;
VICIntEnable=VIC_SPI0_bit + VIC_PWM0_bit + VIC_TIMER1_bit;
S0SPDR=0x00;
T1int_flag=1;
// готовим новые значения для MUX и GAIN
if(qwert)
{
ADS1256_MUX_ADCON_DRATE_VALUES[0]=ADS1256_PSEL_AINCOM | ADS1256_NSEL_AINCOM;//ADS1256_PSEL_AIN0 | ADS1256_NSEL_AIN1; // AIN0_1
ADS1256_MUX_ADCON_DRATE_VALUES[1]=7;//0x00;
}
else
{
ADS1256_MUX_ADCON_DRATE_VALUES[0]=ADS1256_PSEL_AIN0 | ADS1256_NSEL_AIN1; // AIN0_1
ADS1256_MUX_ADCON_DRATE_VALUES[1]=0x00;
}
qwert=~qwert;
}
else if (T1int_flag == 1)
{
CurrentADCValue=0x00000000;
CurrentADCValue=CurrentADCValue | ( ((DWORD)SPI_rec_array[0]) << 16);
CurrentADCValue=CurrentADCValue | ( ((DWORD)SPI_rec_array[1]) << 8);
CurrentADCValue=CurrentADCValue | ( (DWORD)SPI_rec_array[2] );
if(qwert)
{
ADC_Res_array[((ADC_Res_array_ptr)&0x0000003f)]=CurrentADCValue;
//ADC_Res_array_ptr++;
}
else
{
ADC_Res_array[((ADC_Res_array_ptr)&0x0000003f)+64]=CurrentADCValue;
ADC_Res_array_ptr++;
}
// загрузка мультиплексоров и GAIN
SPI_send_array[0]=1;
SPI_send_array[1]=ADS1256_MUX_ADCON_DRATE_VALUES[0];
SPI_send_array[2]=ADS1256_MUX_ADCON_DRATE_VALUES[1];
SPI_wait_time=__MR_value__(1.0);
SPI_PTR=0;
SPI_NUM=3;
VICIntEnable=VIC_SPI0_bit + VIC_PWM0_bit + VIC_TIMER1_bit;
S0SPDR=ADS1256_CMD_WREG | (ADS1256_MUX & 0xf);
T1int_flag=2;
}
else
{
//DIO_setLED4_7(0x0);
}
T1IR=1 << 2;
}
else if( T1IR_val & (1 << 3) )
{// переполнение (MR3)
T1EMR=(2 << 4) | (2 << 6) ; // mat10/11
T1IR=1 << 3;
}
else if( T1IR_val & 1 )
{// (MR0)
//DIO_setLED4_7(0xf);
// разрешаем прерывание по CAP10
T1CCR=(1 << 1) | (1 << 2); // CAP10 faling edge + int
// грузим новое значение ЦАП
ad660_wrval(CurrentDACValue);
T1IR=1;
}
else if( T1IR_val & (1 << 4) )
{// прерывание (CAP10)
// запрещаем прерывание по CAP10
T1CCR=0;
SPI_wait_time=__MR_value__(7.0);
SPI_PTR=0;
SPI_NUM=0;
VICIntEnable=VIC_SPI0_bit + VIC_PWM0_bit + VIC_TIMER1_bit;
T1int_flag=0;
S0SPDR=ADS1256_CMD_RDATA;
T1IR=1 << 4;
}
}
void DIO_setLED4_7(BYTE val)
/*******************************************************************
* Название
* DIO_setLED4_7
* Описание
* управление отладочными светодиодами на плате
* Вызов
* val - значения светодиодов VD1...VD4 (без необходимости инверсии)
* Возвращаемые значения
* нет
* Статус тестирования
* функция работоспособна
********************************************************************/
{
val= ~ val;
IO3CLR=0x01700000;
IO3SET=(0x00700000 & (val << 20) ) | (0x01000000 & (val << 21) );
}