Минутку, давайте разберемся.
Там два вида регистров,
пара за ПЛЛ отвечает (если не прав поправьте) это:
* 0x0235[43:0] M_NUM 283467841536 0x04200000000
* 0x023B[31:0] M_DEN 2147483648 0x80000000
А есть регистры делителя:
* 0x0302[43:0] N0_NUM 1181116006400 0x11300000000
* 0x0308[31:0] N0_DEN 2147483648 0x80000000
ПЛЛ выставили разок и всё, пусть стоит.
А вот с N0_NUM стоит поиграться. (он 44 бита) и N0_DEN (32 бита)
Frequency Plan
* ==============
* Priority: OUT0 is lowest jitter output
*
* Fpfd = 100 MHz
* Fvco = 13.2 GHz [ 13 + 1/5 GHz ] <--- это M_NUM, M_DEN
* Fms0 = 24 MHz
*
* P dividers:
* P0 = Unused
* P1 = Unused
* P2 = 1
* P3 = Unused
* Pxaxb = Unused
*
* M = 132 <---- это что за хрень
* N dividers:
* N0:
* Value: 550 <-это походу N0_NUM/N0_DEN
* Skew: 0.000 s
* OUT0: 12 MHz
* N1:
* Unused
* N2:
* Unused
* N3:
* Unused
*
* R dividers:
* R0 = 2 <- это выходной делитель (классная штука для синта)
* R1 = Unused
* R2 = Unused
* R3 = Unused
*
si5340A
348831 просмотров, 196 ответов — стр. 7 из 14
9 июля 2019 г. в 11:57#91
9 июля 2019 г. в 12:06#92
* M = 132 <---- это что за хреньM_NUM/M_DEN=132
9 июля 2019 г. в 12:16#93
Или Fvco/xtal=13200000000/100000000=132
9 июля 2019 г. в 12:23#94
Вот нашел !
Допустимый диапазон N делителей - от 10 до 4095, а значение N делителя = N_NUM / N_DEN, где N_NUM - 44-битное значение, а N_DEN - 32-битное значение.
вот здесь и должно быть целочисленное деление.
Допустимый диапазон N делителей - от 10 до 4095, а значение N делителя = N_NUM / N_DEN, где N_NUM - 44-битное значение, а N_DEN - 32-битное значение.
вот здесь и должно быть целочисленное деление.
9 июля 2019 г. в 12:49#95
воооооот уже что-то
это значит, что в целочисленном изменении шаг может быть (от 10 до 4096 = NUM/DEN) 2178Гц -что очень мало. Теперь надо добавить R выходной делитель. Номер не пройдет, не хватит стартовой частоты чтобы сделать изменения хотя бы на 2Гц выходными делителями.
В принципе у меня нет цели сделать чистый сигнал ведь у нас опора для синта, а там ...пофиг на фазовый шум и палки.
А если замарочится и сделать чистый сигнал то придется двигать плл, а там что-то с калибровкой....300мс (может и не надо его калибровать) но SOFT_RST придется делать, а он останавливает генерацию.
Короче своеобразный тупик. Хотя если всетаки менять плл то можно все красиво сделать ...наверное.
это значит, что в целочисленном изменении шаг может быть (от 10 до 4096 = NUM/DEN) 2178Гц -что очень мало. Теперь надо добавить R выходной делитель. Номер не пройдет, не хватит стартовой частоты чтобы сделать изменения хотя бы на 2Гц выходными делителями.
В принципе у меня нет цели сделать чистый сигнал ведь у нас опора для синта, а там ...пофиг на фазовый шум и палки.
А если замарочится и сделать чистый сигнал то придется двигать плл, а там что-то с калибровкой....300мс (может и не надо его калибровать) но SOFT_RST придется делать, а он останавливает генерацию.
Короче своеобразный тупик. Хотя если всетаки менять плл то можно все красиво сделать ...наверное.
9 июля 2019 г. в 12:57#96
Допустимый диапазон N делителейЯ это не заметил.. Ну для наших целей вполне.. 13200000000/10 = 1320000000, или 1320 мгц, вряд ли понадобится, да и микросхема не выдаст. 13200000000/4095=примерно 3,2 мгц. То же нормально, а если много, есть еще R.
быть целочисленное деление.Ну давайте прикинем..
Например надо 21,0 мгц. 13200000000/21000000=628 с копейками. Если возьмем 628, то частота на выходе будет 13200000000/628=21,019,108 мгц. Устроит 19 кгц уход в сторону? Попробуем 629, имеем 13200000000/629= 20,985,691. Те же 15 кгц. Так что придется объявить конкурс на лучшее решение. В качестве приза - пиво, виртуальное
.9 июля 2019 г. в 02:46#97
Хотя если всетаки менять плл то можно все красиво сделать ...наверное.Вот что выдал ClockBuilder. Частота опорника 80 мгц, частота выхода 20,00404 мгц. Ну и где здесь целочисленное деление?
9 июля 2019 г. в 05:05#98
Приращение 20 Гц не получится, Вы же сами посчитали выше
Только через float
Только через float
9 июля 2019 г. в 06:28#99
Полностью рабочие процедуры!!!


void saveReg5340A(void) {//ini 5340
char buf[20];
uint8_t x[2];//3
uint8_t y[2];
for (int i = 0; i < SI5340_REVD_REG_CONFIG_NUM_REGS; i++) {
x[0] = 0x01;
x[1] = (uint8_t) (si5340_revd_registers.address >>
;
y[0] = (uint8_t) (si5340_revd_registers.address & 0x00ff);
y[1] = si5340_revd_registers.value;
if (i == 6) HAL_Delay(500);
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
//
// sprintf(buf, "%06d", i);
// BSP_LCD_DisplayHStringAt(0, 80, (uint8_t *)buf, LEFT_MODE);
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
//N_PIBYP
x[0] = 0x01;
x[1] = 0x0A;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = 0x04;
y[1] = 0;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
//Write SOFT_RST = 1 (0x001C).
x[0] = 0x01;
x[1] = 0x00;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = 0x1c;
y[1] = 1;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
void si5340aSetFrequency_1(uint32_t freq) {
uint64_t num;
uint32_t denom=2147483648;
uint64_t pllFreq = 13200000000;
num=(uint64_t)(pllFreq*((float)denom/freq));
send5340(0x03, N0_NUM, N0_DEN, num, denom);
}
void send5340(uint8_t page, uint8_t reg, uint8_t reg_1, uint64_t P1, uint32_t P2) {
uint8_t x[2];
uint8_t y[7];
x[0] = 0x01;
x[1] = page;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = reg;
y[6] = (uint8_t) ((P1 & 0xFF0000000000) >> 40);
y[5] = (uint8_t) ((P1 & 0x00FF00000000) >> 32);
y[4] = (uint8_t) ((P1 & 0x0000FF000000) >> 24);
y[3] = (uint8_t) ((P1 & 0x000000FF0000) >> 16);
y[2] = (uint8_t) ((P1 & 0x00000000FF00) >>
;
y[1] = (uint8_t) (P1 & 0x0000000000FF);
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 7, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}

void saveReg5340A(void) {//ini 5340
char buf[20];
uint8_t x[2];//3
uint8_t y[2];
for (int i = 0; i < SI5340_REVD_REG_CONFIG_NUM_REGS; i++) {
x[0] = 0x01;
x[1] = (uint8_t) (si5340_revd_registers.address >>
;y[0] = (uint8_t) (si5340_revd_registers.address & 0x00ff);
y[1] = si5340_revd_registers.value;
if (i == 6) HAL_Delay(500);
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
//
// sprintf(buf, "%06d", i);
// BSP_LCD_DisplayHStringAt(0, 80, (uint8_t *)buf, LEFT_MODE);
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
//N_PIBYP
x[0] = 0x01;
x[1] = 0x0A;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = 0x04;
y[1] = 0;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
//Write SOFT_RST = 1 (0x001C).
x[0] = 0x01;
x[1] = 0x00;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = 0x1c;
y[1] = 1;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
void si5340aSetFrequency_1(uint32_t freq) {
uint64_t num;
uint32_t denom=2147483648;
uint64_t pllFreq = 13200000000;
num=(uint64_t)(pllFreq*((float)denom/freq));
send5340(0x03, N0_NUM, N0_DEN, num, denom);
}
void send5340(uint8_t page, uint8_t reg, uint8_t reg_1, uint64_t P1, uint32_t P2) {
uint8_t x[2];
uint8_t y[7];
x[0] = 0x01;
x[1] = page;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = reg;
y[6] = (uint8_t) ((P1 & 0xFF0000000000) >> 40);
y[5] = (uint8_t) ((P1 & 0x00FF00000000) >> 32);
y[4] = (uint8_t) ((P1 & 0x0000FF000000) >> 24);
y[3] = (uint8_t) ((P1 & 0x000000FF0000) >> 16);
y[2] = (uint8_t) ((P1 & 0x00000000FF00) >>
;y[1] = (uint8_t) (P1 & 0x0000000000FF);
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 7, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
9 июля 2019 г. в 06:32#100
Игорь, принимайте работу 
10мгц 20мгц и 17.....мгц
(холмики от БП)

10мгц 20мгц и 17.....мгц
(холмики от БП)
9 июля 2019 г. в 06:38#101
Вобщем покопался в мануале по диагонали. В reference manual (Si5341-40-D-RM.pdf) на 32й странице написано вот что
Цитировать7.2 Using the M Divider for DCO Applications
The VCO can be treated as a DCO by changing the value of the M feedback divider. By changing the M divider, all the output frequencies will change by the same amount in ppm. Changing the M divider is only valid for small changes in the output frequencies. Contact Silicon Labsfor assistance in the implementation of this capability.Собственно этот M-feedback задает коэф.деления в петле ФАПЧ и определяет на какой частоте работает ГУН. Так как ГУН у нас только один (в 5351 например их два) то сформировать с низким ФШ сигнал мы сможем только один (с целочисленным делителем в MultiSynth). Остальные частоты будут с более высоким уровнем ФШ т.к. придется использовать дробные делители.
Дальше в принципе все понятно. Для требуемой частоты выбираем целочисленный делитель (при этом ГУН на максимум надо выводить). При плавной перестройке меняем в небольших пределах делитель M - он всегда дробный. Вопрос в каком диапазоне вы его можем менять без ресета ФАПЧ и не будет ли там каких артефактов пока остается открытым
Цитировать7.2 Using the M Divider for DCO Applications
The VCO can be treated as a DCO by changing the value of the M feedback divider. By changing the M divider, all the output frequencies will change by the same amount in ppm. Changing the M divider is only valid for small changes in the output frequencies. Contact Silicon Labsfor assistance in the implementation of this capability.Собственно этот M-feedback задает коэф.деления в петле ФАПЧ и определяет на какой частоте работает ГУН. Так как ГУН у нас только один (в 5351 например их два) то сформировать с низким ФШ сигнал мы сможем только один (с целочисленным делителем в MultiSynth). Остальные частоты будут с более высоким уровнем ФШ т.к. придется использовать дробные делители.
Дальше в принципе все понятно. Для требуемой частоты выбираем целочисленный делитель (при этом ГУН на максимум надо выводить). При плавной перестройке меняем в небольших пределах делитель M - он всегда дробный. Вопрос в каком диапазоне вы его можем менять без ресета ФАПЧ и не будет ли там каких артефактов пока остается открытым
9 июля 2019 г. в 06:55#102
Игорь, принимайте работу
По мусору - вполне, по фазовым шумам смотреть нужно, но получить их хуже -130 дБ/Гц, полагаю, вряд ли возможно, а этого хватит для моих синтезов...

А шаг какой получился? Полгерца есть?

9 июля 2019 г. в 07:29#103
0.0002гц
9 июля 2019 г. в 07:32#104
Более чем...

9 июля 2019 г. в 08:33#105
num=(uint64_t)(pllFreq*((float)denom/freq));
С Вашим кодом дает большую ошибку, а вот так:
num=(uint64_t)((float)pllFreq/(float)freq)*denom; получается правильный результат (хотя возможно чудит компилятор, такое с ним бывает...)
Все же проверьте калькулятором.. Причем не только в симуляторе дает ошибку, но и в железе.