Я пытаюсь завести AD9952 и столкнулся с трудностями. Написал функцию для отправки команд на DDS:
Спойлер
Код: Выделить всё
void ad9952_write_reg(u8 reg, u32 data)
{ u8 ii=0;
u8 inst = reg & 0x1F; // 0x9F for read
u8 nBytes = 1;
if(reg == REG_CFR1 || reg == REG_FTW0)
nBytes = 4;
else if(reg == REG_ASF || reg == REG_POW)
nBytes = 2;
else if(reg == REG_CFR2)
nBytes = 3;
GPIO_ResetBits(adPORTi, adIOUpd);
GPIO_ResetBits(adPORTi, adSCLK);
for(ii = 8; ii > 0; ii--)
{
GPIO_ResetBits(adPORTi, adSCLK);
if((inst & 0x80) == 0x80)
GPIO_SetBits(adPORTi, adSDIO);
else
GPIO_ResetBits(adPORTi, adSDIO);
GPIO_SetBits(adPORTi, adSCLK);
inst = inst << 1;
}
data = data << ((4 - nBytes) * 8);
for(ii = nBytes * 8; ii > 0; ii--)
{
GPIO_ResetBits(adPORTi, adSCLK);
if((data & 0x80000000) == 0x80000000)
GPIO_SetBits(adPORTi, adSDIO);
else
GPIO_ResetBits(adPORTi, adSDIO);
GPIO_SetBits(adPORTi, adSCLK);
data = data << 1;
}
GPIO_SetBits(adPORTi, adIOUpd);
Delay_us(3);
GPIO_ResetBits(adPORTi, adIOUpd);
}Проблема: при попытке настроить PLL либо выходная частота не меняется (чаще всего), либо падает в 2 раза (стало быть Fsysclk удвоилась, хотя такого множителя нет), либо генерация пропадает вовсе. Побывал различные значения битов [7:3], [2] и [1:0] регистра CFR2. Не могу понять в чем дело. CLKMODSELECT на земле.
Запись в CFR1 работает нормально. Микруха б/у, мог ли предыдущий владелец как-то спалить блок PLL? Других мыслей уже не осталось. К тому же встроенный компоратор тоже не работает.