Перейти к содержанию
    

moon333

Участник
  • Постов

    113
  • Зарегистрирован

  • Посещение

Весь контент moon333


  1. Делитель частоты достаточно гибко настраивается в Control Register, CLKDIV. Тем более, для 200 кило выборок и выше необходимая минимальная частота ~2.3MHz
  2. Как уже отметили, косвенно всё равно есть эта защита. Но так же добавлю, что источником статического разряда обычно является человек(оператор), и как правил заряд он накапливает относительно заземления. И мне сложно представить как можно ударить статикой так, чтобы пик напряжения возник между цифровыми линиями, а не между сигнальная линия - земля. Не всегда большой конденсатор сможет погладить всплеск напряжения. Посмотрите на временные характеристики ESD разряда и сопоставьте с ESL. Но если речь идёт про "идеальный" кондёр большой ёмкости, то конечно же энергии ESD не должно хватить чтобы его зарядить до опасного напряжения. Уже ответили. Я ещё добавлю, что если TVS рассчитан на 5В, то не надо ожидать, что в пике тока помехи там будет тоже 5 воль, как правило на TVS будет примерно 7-8 Вольт.
  3. Покажите как конкретно правило задаётся. Ещё проверьте приоритет у правила, возможно дело в этом.
  4. Источник питания тоже можно задать в модели как VRM. Он как правило ограничивает низкий импеданс до потребителя только на низких частотах. Самая простоя модель VRM ограничивается идеальный источник + индуктивность(индуктивностью задаётся скорость обратной связи). На высоких частотах (там где индуктивность от VRM говорит своё Я) будьте добры обеспечить Ztarget за счёт конденсаторов, топологии и стека. Не вижу проблем обеспечить 3% точности. Но в таких задачах основная сложность в IRdrop(падение напряжение от источника до потребителя). С IRdrop всё становится сложнее т.к. это падение как раз может быть выше чем 3% от требуемого напряжения. Но это тоже решается, берут обратную связь прям с нагрузки. А ещё лучше, чтобы усилитель обратной связи был с диф. входом, тогда получится скомпенсировать падение напряжение как на + так и на -(в DC/DC эта функция называется Remote Sense).
  5. Мне всегда казалось, что порог определяется импедансом который вносит L_pkg. Когда уже Z_L > Z_Target то дальше развязку городить особо смысла нет. Или я не прав?
  6. В таком случае Вам необходимо было включать два TVS встречно. Вот так, как на 4: https://i.stack.imgur.com/0D89b.png В противном случае, Вы зашунтируете отрицательную полуволну сети.
  7. Overrun flag к моменту приёма всегда был чист. Хотя изначально я тоже на это напарывался. Спасибо. До этого читал по диагонали и из за этого допустил ошибку. Снимал CS раньше, чем успевал передать все данные... Добавил: while (SPI_I2S_GetFlagStatus(SPIx,SPI_FLAG_BSY)!=RESET); Всё заработало.
  8. У Вас подозрение на то, что я пытаюсь отправить данные когда ещё SPI не готов. Правильно ли я Вас понимаю?
  9. Перед тем как что то писать в регистр SPI4->DR стоит: while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET); Я посмотрел, вроде везде так сделано.
  10. Смотрел осциллографом: Данные бегут. Клок есть. CS тоже дёргается. Странно что ID нормально считывается.
  11. Пытаюсь подружит stm32f427 и SPI flash W25Q64FV. Для начала научился читать из FLASH Device Identification по команде Read JEDEC ID (9Fh) SPI4_CS_LOW; while(SPI_I2S_GetFlagStatus(SPI4, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI4, 0x9F); while(SPI_I2S_GetFlagStatus(SPI4, SPI_I2S_FLAG_RXNE) == RESET); data_spi = SPI_I2S_ReceiveData(SPI4); // заглушка, чтобы очистить RXNE while(SPI_I2S_GetFlagStatus(SPI4, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI4, 0x00); while(SPI_I2S_GetFlagStatus(SPI4, SPI_I2S_FLAG_RXNE) == RESET); data_flash[0] = SPI_I2S_ReceiveData(SPI4); while(SPI_I2S_GetFlagStatus(SPI4, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI4, 0x00); while(SPI_I2S_GetFlagStatus(SPI4, SPI_I2S_FLAG_RXNE) == RESET); data_flash[1] = SPI_I2S_ReceiveData(SPI4); while(SPI_I2S_GetFlagStatus(SPI4, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI4, 0x00); while(SPI_I2S_GetFlagStatus(SPI4, SPI_I2S_FLAG_RXNE) == RESET); data_flash[2] = SPI_I2S_ReceiveData(SPI4); SPI4_CS_HIGH; Получаю вполне корректный ответ: 0xEF 0x40 0x17. Судя по даташиту такие значения имеют место быть. Далее я пытался прочитать регистр состояния, после того как выполню команду Write Enable 0x06. По идее бит WEL должен быть установлен, однако читается одни нули 0x00. Далее прилагаю код: Инициализация SPI void init_SPI() { uint8_t x = 0x00; //настройка CS и включения питания GPIO_InitTypeDef GPIO_CS; GPIO_InitTypeDef GPIO_POW; GPIO_CS.GPIO_Pin = GPIO_Pin_11; GPIO_CS.GPIO_Mode = GPIO_Mode_OUT; GPIO_CS.GPIO_Speed = GPIO_Speed_50MHz; GPIO_CS.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_CS.GPIO_OType = GPIO_OType_PP; GPIO_POW.GPIO_Pin = GPIO_Pin_11; GPIO_POW.GPIO_Mode = GPIO_Mode_OUT; GPIO_POW.GPIO_Speed = GPIO_Speed_50MHz; GPIO_POW.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_POW.GPIO_OType = GPIO_OType_PP; GPIO_Init(GPIOE, &GPIO_CS); GPIO_Init(GPIOB, &GPIO_POW); SPI_InitTypeDef SPI_struct_itit; //объявляем структуру для инициализации SPI RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI4, ENABLE); // включаем тактирование SPI4 /* Инициализация структуры Initialize the SPI_Direction - Двухнаправленный SPI или Однонаправленный Initialize the SPI_Mode member - Slave (ведомый) или Master(Мастер) Initialize the SPI_DataSize member - бит в сообщении (8 или 16) Initialize the SPI_CPOL member - задаёт режим работы (режим 0,1,2,3) Initialize the SPI_CPHA member - задаёт режим работы (режим 0,1,2,3) Initialize the SPI_NSS member - Управление CS HARD - автоматически, soft - программно Initialize the SPI_BaudRatePrescaler member - делитель для тактовой частоты SPI Initialize the SPI_FirstBit member - младший или старшый байт первый Initialize the SPI_CRCPolynomial member - CRC полином */ SPI_struct_itit.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_struct_itit.SPI_Mode = SPI_Mode_Master; SPI_struct_itit.SPI_DataSize = SPI_DataSize_8b; SPI_struct_itit.SPI_CPOL = SPI_CPOL_Low; SPI_struct_itit.SPI_CPHA = SPI_CPHA_1Edge; SPI_struct_itit.SPI_NSS = SPI_NSS_Soft; SPI_struct_itit.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; SPI_struct_itit.SPI_FirstBit = SPI_FirstBit_MSB; SPI_struct_itit.SPI_CRCPolynomial = 7; SPI_Init (SPI4,&SPI_struct_itit); // инициализируем SPI4 SPI_Cmd(SPI4,ENABLE); } Инициализация GPIO SPI // инициализация SPI4: SCL,MOSI Other_GPIO.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_14; Other_GPIO.GPIO_Mode = GPIO_Mode_AF; Other_GPIO.GPIO_OType = GPIO_OType_PP; Other_GPIO.GPIO_PuPd = GPIO_PuPd_NOPULL; Other_GPIO.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &Other_GPIO); // инициализация SPI4: MISO Other_GPIO.GPIO_Pin = GPIO_Pin_13; Other_GPIO.GPIO_Mode = GPIO_Mode_AF; Other_GPIO.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &Other_GPIO); // инициализация SPI4: NSS Other_GPIO.GPIO_Pin = GPIO_Pin_11; Other_GPIO.GPIO_Mode = GPIO_Mode_OUT; Other_GPIO.GPIO_OType = GPIO_OType_PP; Other_GPIO.GPIO_PuPd = GPIO_PuPd_NOPULL; Other_GPIO.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &Other_GPIO); //Выбираем альтернативную функцию для всех PIN-SPI GPIO_PinAFConfig(GPIOE, GPIO_PinSource12, GPIO_AF_SPI4); GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_SPI4); GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_SPI4); Посылка команды Write Enable //включение записи во flash void FLASH_Write_Enable(SPI_TypeDef* SPIx) { if (SPIx == SPI4) SPI4_CS_LOW; else __NOP; // Временная заглушка для SPI1 while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPIx, WriteEnable); if (SPIx == SPI4) SPI4_CS_HIGH; else __NOP; // Временная заглушка для SPI1 } Ну и функция считывания Статус регистра uint8_t READ_Stat_Reg (SPI_TypeDef* SPIx) { volatile uint8_t byte = 0x00; SPI4_CS_LOW; while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI4, 0x05); while(SPI_I2S_GetFlagStatus(SPI4, SPI_I2S_FLAG_RXNE) == RESET); byte = SPI_I2S_ReceiveData(SPI4); while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI4, 0x00); while(SPI_I2S_GetFlagStatus(SPI4, SPI_I2S_FLAG_RXNE) == RESET); byte = SPI_I2S_ReceiveData(SPIx); SPI4_CS_HIGH; return byte; } основная main() int main(void) { init_CLOCK(); init_GPIO(); GPIOB->ODR &= ~GPIO_Pin_11; //power FLASH on init_SPI(); FLASH_Write_Enable(SPI4); x = READ_Stat_Reg(SPI4); .................. брейкпоинт ставлю в функции READ_Stat_Reg на строчке SPI4_CS_HIGH; Почему читаются одни 0. Наверняка, что то очевидное... Не вижу :(
  12. Есть ли команда в AD, чтобы убрать не подключённые куски plane? Например для полигона есть Remove Dead Copper. А вот для plane такого не нашёл...
  13. Как в AD17 настроить толщину линий показывающие границу полигона. Это особенно актуально, когда в настройках полигона стоит Fill mode: None (полигон не залит).
  14. А какая конкретно индуктивность у Вас? L3 которая на схеме.
  15. Читал я тут AN2689 от ST. Ни как не могу понять, как так у них получается следующие: на стр 19 они посчитали что для 457нС TVS SM6T27AY может выдерживать до 100kW. Но если температура окружающей среды 85 градусов. Мы смотрим на зависимость Peak power dissipation versus initial junction temperature(прикрепил изображение). И затем утверждаем, что максимальная рассеиваемая мощность для такого импульса сократиться на 25%. Это как так то? На графике же видно, что мощность до 125 градусов не меняется.
  16. А что если во время старта, возникает большой ток т.к. конденсаторы разряжены, и из-за этого создаётся большое падение на резисторе R3. Следовательно срабатывает цепочка UVLO по уровню который указан в спецификации как under-voltage lockout trip level. Не смотря на то, что там есть soft start. Как раз когда ставите конденсаторы с большим esr, во время старта через них течёт меньший ток.
  17. jitter FLL

    Попробовал ради интереса записывать разные значения в UCSCTL0, регистр который как раз отвечает за модулятор. В итоге получил стабильную частоту. Буду переваривать, что произошло... Модулятор ведь нужен чтобы получать промежуточные частоты? По сути для того, чтобы можно было частоту настраивать очень очень и очень гибко, к тому же если это требуется очень плавно. Или я ошибаюсь?
  18. jitter FLL

    Получаю тактовую частоту SMCLK с помощью FLL. Вывожу сигнал SMCLK наружу и получаю вот такую вот картину. Очень большой jitter :(. Кварц при этом стабилен. Это нормальная ситуация при использование FLL? В даташите в разделе DCO написано: Duty cycle| Measured at SMCLK| 40 50 60 |% Просто хочу убедиться, это я неправильно настраиваю клоки или так и должно быть.
  19. Подскажите пожалуйста, какую роль здесь выполняют транзисторы Q2A и Q2B? Моё предположение, что при повышение тока через Q1, увеличивается падение на его Rds_on, следовательно Q2B закрывается тем самым всё больше открывая Q1. Но зачем????
  20. Подскажите пожалуйста как Code Composer Studio v7.1 включить возможность сворачивать функции? Имеется ли такая возможность в принципе? Пример на картинке из Notepad++
  21. Есть вот такой товарищ : MAX40200AUK+ Но у него не очень высокие токи...
×
×
  • Создать...