Автор Тема: si5340A  (Прочитано 88167 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: si5340A
« Ответ #90 : Июль 09, 2019, 11:57:41 am »
Минутку, давайте разберемся.
Там два вида регистров,
пара за ПЛЛ отвечает (если не прав поправьте) это:
* 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
 *
Да да, я знаю, у меня ничего не получится )))

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1179
Re: si5340A
« Ответ #91 : Июль 09, 2019, 12:06:56 pm »
* M = 132 <---- это что за хрень
M_NUM/M_DEN=132

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: si5340A
« Ответ #92 : Июль 09, 2019, 12:16:27 pm »
Или Fvco/xtal=13200000000/100000000=132
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: si5340A
« Ответ #93 : Июль 09, 2019, 12:23:23 pm »
Вот нашел !

Допустимый диапазон N делителей - от 10 до 4095, а значение N делителя = N_NUM / N_DEN, где N_NUM - 44-битное значение, а N_DEN - 32-битное значение.

вот здесь и должно быть целочисленное деление.
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: si5340A
« Ответ #94 : Июль 09, 2019, 12:49:14 pm »
воооооот уже что-то
это значит, что в целочисленном изменении шаг может быть (от 10 до 4096 = NUM/DEN) 2178Гц -что очень мало. Теперь надо добавить R выходной делитель.  Номер не пройдет, не хватит стартовой частоты чтобы сделать изменения хотя бы на 2Гц  выходными делителями.
В принципе у меня нет цели сделать  чистый сигнал ведь у нас опора для синта, а там ...пофиг на фазовый шум и палки.

А если замарочится и сделать чистый сигнал то придется двигать плл, а там что-то с калибровкой....300мс (может и не надо его калибровать) но SOFT_RST придется делать, а он останавливает генерацию.
Короче своеобразный тупик. Хотя если всетаки менять плл то можно все красиво сделать ...наверное.
Да да, я знаю, у меня ничего не получится )))

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1179
Re: si5340A
« Ответ #95 : Июль 09, 2019, 12:57:36 pm »
Допустимый диапазон 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 кгц.  Так что придется объявить конкурс на лучшее решение. В качестве приза - пиво, виртуальное 123123.

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1179
Re: si5340A
« Ответ #96 : Июль 09, 2019, 02:46:57 pm »
Хотя если всетаки менять плл то можно все красиво сделать ...наверное.
Вот что выдал ClockBuilder. Частота опорника 80 мгц, частота выхода 20,00404 мгц. Ну и где здесь целочисленное деление?

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: si5340A
« Ответ #97 : Июль 09, 2019, 05:05:41 pm »
Приращение 20 Гц не получится, Вы же сами посчитали выше
Только через float
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: si5340A
« Ответ #98 : Июль 09, 2019, 06:28:07 pm »
Полностью рабочие процедуры!!! 123123 123123 123123 123123
 lol22 lol22 lol22 lol22


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 >> 8);

        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) >> 8);
    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);
    };




}
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: si5340A
« Ответ #99 : Июль 09, 2019, 06:32:07 pm »
Игорь, принимайте работу  123123

10мгц 20мгц и 17.....мгц

(холмики от БП)
Да да, я знаю, у меня ничего не получится )))

Оффлайн Relayer

  • Hero Member
  • *****
  • Сообщений: 1006
  • UR5FFR
Re: si5340A
« Ответ #100 : Июль 09, 2019, 06:38:17 pm »
Вобщем покопался в мануале по диагонали. В 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 - он всегда дробный. Вопрос в каком диапазоне вы его можем менять без ресета ФАПЧ и не будет ли там каких артефактов пока остается открытым
В любой схеме есть как минимум одна ненужная деталь :)

Оффлайн Игорь 2

  • Administrator
  • *****
  • Сообщений: 20758
Re: si5340A
« Ответ #101 : Июль 09, 2019, 06:55:26 pm »
Игорь, принимайте работу

По мусору - вполне, по фазовым шумам смотреть нужно, но получить их хуже -130 дБ/Гц, полагаю, вряд ли возможно, а этого хватит для моих синтезов... cr123
А шаг какой получился? Полгерца есть?   123123
Ничего невозможного нет

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: si5340A
« Ответ #102 : Июль 09, 2019, 07:29:20 pm »
0.0002гц
Да да, я знаю, у меня ничего не получится )))

Оффлайн Игорь 2

  • Administrator
  • *****
  • Сообщений: 20758
Re: si5340A
« Ответ #103 : Июль 09, 2019, 07:32:35 pm »
Более чем... 1yep pl33 lol22
Ничего невозможного нет

Оффлайн Владимир_К

  • Hero Member
  • *****
  • Сообщений: 1179
Re: si5340A
« Ответ #104 : Июль 09, 2019, 08:33:29 pm »
num=(uint64_t)(pllFreq*((float)denom/freq));

С Вашим кодом дает большую ошибку, а вот так:
num=(uint64_t)((float)pllFreq/(float)freq)*denom;    получается правильный результат (хотя возможно чудит компилятор, такое с ним бывает...)
Все же проверьте калькулятором.. Причем не только в симуляторе дает ошибку, но и в железе.
« Последнее редактирование: Июль 09, 2019, 08:45:53 pm от Владимир_К »