Jump to content

    

moon333

Участник
  • Content Count

    80
  • Joined

  • Last visited

Community Reputation

0 Обычный

About moon333

  • Rank
    Частый гость
  • Birthday 08/10/1993

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Recent Profile Visitors

3255 profile views
  1. В таком случае Вам необходимо было включать два TVS встречно. Вот так, как на 4: https://i.stack.imgur.com/0D89b.png В противном случае, Вы зашунтируете отрицательную полуволну сети.
  2. Overrun flag к моменту приёма всегда был чист. Хотя изначально я тоже на это напарывался. Спасибо. До этого читал по диагонали и из за этого допустил ошибку. Снимал CS раньше, чем успевал передать все данные... Добавил: while (SPI_I2S_GetFlagStatus(SPIx,SPI_FLAG_BSY)!=RESET); Всё заработало.
  3. У Вас подозрение на то, что я пытаюсь отправить данные когда ещё SPI не готов. Правильно ли я Вас понимаю?
  4. Перед тем как что то писать в регистр SPI4->DR стоит: while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET); Я посмотрел, вроде везде так сделано.
  5. Смотрел осциллографом: Данные бегут. Клок есть. CS тоже дёргается. Странно что ID нормально считывается.
  6. Пытаюсь подружит 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. Наверняка, что то очевидное... Не вижу :(
  7. Есть ли команда в AD, чтобы убрать не подключённые куски plane? Например для полигона есть Remove Dead Copper. А вот для plane такого не нашёл...
  8. Как в AD17 настроить толщину линий показывающие границу полигона. Это особенно актуально, когда в настройках полигона стоит Fill mode: None (полигон не залит).
  9. А какая конкретно индуктивность у Вас? L3 которая на схеме.
  10. Читал я тут AN2689 от ST. Ни как не могу понять, как так у них получается следующие: на стр 19 они посчитали что для 457нС TVS SM6T27AY может выдерживать до 100kW. Но если температура окружающей среды 85 градусов. Мы смотрим на зависимость Peak power dissipation versus initial junction temperature(прикрепил изображение). И затем утверждаем, что максимальная рассеиваемая мощность для такого импульса сократиться на 25%. Это как так то? На графике же видно, что мощность до 125 градусов не меняется.
  11. А что если во время старта, возникает большой ток т.к. конденсаторы разряжены, и из-за этого создаётся большое падение на резисторе R3. Следовательно срабатывает цепочка UVLO по уровню который указан в спецификации как under-voltage lockout trip level. Не смотря на то, что там есть soft start. Как раз когда ставите конденсаторы с большим esr, во время старта через них течёт меньший ток.
  12. jitter FLL

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

    Получаю тактовую частоту SMCLK с помощью FLL. Вывожу сигнал SMCLK наружу и получаю вот такую вот картину. Очень большой jitter :(. Кварц при этом стабилен. Это нормальная ситуация при использование FLL? В даташите в разделе DCO написано: Duty cycle| Measured at SMCLK| 40 50 60 |% Просто хочу убедиться, это я неправильно настраиваю клоки или так и должно быть.
  14. Подскажите пожалуйста, какую роль здесь выполняют транзисторы Q2A и Q2B? Моё предположение, что при повышение тока через Q1, увеличивается падение на его Rds_on, следовательно Q2B закрывается тем самым всё больше открывая Q1. Но зачем????