Jump to content

    

hd44780

Свой
  • Content Count

    1231
  • Joined

  • Last visited

Everything posted by hd44780


  1. STM32H743 SPI

    Да, со SPE опечатка вышла при вставке кода в форум. Сорри ... Вот полный текст: // Чтение/запись байта SPI uint8_t spi1_sendByte ( uint8_t data_out ) { uint8_t data_in = 0; // Disable SPI CLEAR_BIT( SPI_PORT->CR1, SPI_CR1_SPE); MODIFY_REG(SPI_PORT->CR2, SPI_CR2_TSIZE, 1); // Enable SPI SET_BIT( SPI_PORT->CR1, SPI_CR1_SPE); SPI_PORT->CR2 = 1; // Передать 1 байт // Start transfer SPI_PORT->CR1 |= SPI_CR1_CSTART; while ( !( SPI_PORT -> SR & SPI_SR_TXP ) ); *((__IO uint8_t *)&SPI_PORT->TXDR) = data_out; // Ждать завершения передачи // while ( !(SPI_PORT->SR & SPI_SR_EOT) ); // Ждать завершения приёма while ( !( SPI_PORT -> SR & SPI_SR_RXP ) ); data_in = *((__IO uint8_t *)&SPI_PORT->RXDR); return data_in; } // SPI_sendByte На TXP ни разу не висит, теперь виснет на EOT (если его раскомментарить), либо (если прикрыть EOT) на следующем за ним RXP. Genadi Zawidowski, да, я помню, вы выше писали об этом, но на TXP у меня вобщем-то никогда не висло, а когда и висло, то по факту это оказывалось следствием моих же ошибок/экспериментов. Поэтому пока я проверяю всегда этот флаг.
  2. STM32H743 SPI

    Датчик заработал, всё гуд. Осталось его только на другой SPI перенести. DMA не делал, пока не нужно, тем более, что ещё надо с UART, таймерами и пр. разобраться. Что касается SPI, остался один простой вопрос - как отправить-принять байт SPI простым опросом? Т.е. то что на F1/F4 делается буквально 4-мя строками кода: // Чтение/запись байта SPI uint8_t bme280_sendbyte ( uint8_t data ) { uint8_t _rxbyte; while ( !( SPI2 -> SR & SPI_SR_TXE ) ); SPI2 -> DR = data; while ( !( SPI2 -> SR & SPI_SR_RXNE ) ); _rxbyte = SPI2 -> DR; return _rxbyte; } // SPI_sendbyte Здесь же, если написать // Чтение/запись байта SPI uint8_t spi1_sendByte ( uint8_t data_out ) { uint8_t data_in = 0; // Disable SPI SET_BIT( SPI_PORT->CR1, SPI_CR1_SPE); MODIFY_REG(SPI_PORT->CR2, SPI_CR2_TSIZE, 1); // Enable SPI SET_BIT( SPI_PORT->CR1, SPI_CR1_SPE); SPI_PORT->CR2 = 1; // Передать 1 байт // Start transfer SPI_PORT->CR1 |= SPI_CR1_CSTART; while ( !( SPI_PORT -> SR & SPI_SR_TXP ) ); *((__IO uint8_t *)&SPI_PORT->TXDR) = data_out; // Ждать завершения передачи // while ( !(SPI_PORT->SR & SPI_SR_EOT) ); // Ждать завершения приёма while ( !( SPI_PORT -> SR & SPI_SR_RXP ) ); data_in = *((__IO uint8_t *)&SPI_PORT->RXDR); return data_in; } // SPI_sendByte Оно тупо виснет на первом цикле ожидания единицы в SPI_SR_TXP :( До всего остального просто не доходит. Как это сделать правильно? Повторяю - без прерываний. С прерываниями всё хорошо :) .
  3. STM32H743 SPI

    Лог анализатора у меня нету, только осцилл. Смотрел я им ногу MISO датчика - там действительно тишина. Полярность и фаза у дисплея и у датчика идентичные. Вот мои настройки SPI дисплея и датчика с F103 проца, где всё работает: Дисплей: SPI_Cmd ( SPI1, DISABLE ); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init ( SPI1, &SPI_InitStructure ); SPI_Cmd ( SPI1, ENABLE ); SPI_CalculateCRC ( SPI1, DISABLE ); Датчик: SPI_Cmd ( SPI2, DISABLE ); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init ( SPI2, &SPI_InitStructure ); SPI_Cmd ( SPI2, ENABLE ); SPI_CalculateCRC ( SPI1, DISABLE ); как видно, они идентичные. Попробую ещё настройки пинов сопоставить. У H7 порты, похоже, такие же как и у F4. Этот датчик у меня и на F439 успешно работает, есть с чем сравнивать.
  4. STM32H743 SPI

    MasterElectric , у Вас приём через прерывание нормально работает? У меня странно как-то - эхо (через проводок MOSI - MISO) нормально идёт, а пытаюсь работать с датчиком BME280 - он на команды не реагирует, читаются одни нули. Дисплей (вообще без ноги MISO) тож нормально работает. Дисп отключил, датчик к тем же ногам подключен.
  5. STM32H743 SPI

    Genadi Zawidowski , да, чёт я тупанул, спасибо, помогло.
  6. STM32H743 SPI

    Я просто постепенно делаю. Для простой инициализации дисплея и рисования точек и по одному достаточно. Попробую блоками картинки в дисплей кидать. Ещё напоролся на какой-то странный баг: я работаю в Atollic TrueStudio, когда использовал код MasterElectric while ( SPI_PORT->SR & SPI_SR_RXP != 0 ) { if ( RxBuffPos < TransLength ) { RxBuff[RxBuffPos++] = *(volatile uint8_t *) &(SPI_PORT->RXDR); } // if else break; } // while В цикл вообще не заходило, естетвенно ничего не принимало, хотя под отладкой виден бит SR.RXP==1 и в RXDR правильное принятое значение. Соответственно всё последующее летит к такой-то матери. Переписал так: while ( 1 ) { uint32_t val; val = SPI_PORT->SR; val &= SPI_SR_RXP; if ( val != 0 ) { if ( RxBuffPos < TransLength ) { r_value = RxBuff[RxBuffPos++] = *(volatile uint8_t *) &(SPI_PORT->RXDR); } // if } // if else break; if ( RxBuffPos == TransLength ) break; } // while Те же яйца, вид сбоку. Но работает. Никто не натыкался? Оптимизацию проверял, там None (-O0).
  7. STM32H743 SPI

    Я кое-как скрутил отправку одного байта ... SPI дисплей (без ноги MISO) вроде задышал. На каких-то странных костылях... Сейчас попробую BME280 прикрутить.. Там обмен двунаправленный. PS. Первые впечатления - хрень полная и тихий ужас ....
  8. STM32H743 SPI

    У меня тож самое пока :crying: . Первый байт проходит в песнями, потом виснет на опросе флагов SR.
  9. STM32H743 SPI

    Угу, спасибо. Я тоже буду отписываться, если что-то новое появится.
  10. STM32H743 SPI

    Что-то я совсем запутался :( Некий прогресс есть, хоть и неполный. 1. Переписал инициализацию на регистрах: CLEAR_BIT( SPI_PORT->CR1, SPI_CR1_SPE); // Disable SPI SPI_PORT -> CR1 = SPI_CR1_SSI; // SSI := 1 SPI_PORT -> CR2 = 0x0; SPI_PORT -> CFG1 = SPI_CFG1_MBR | SPI_CFG1_DSIZE_2 | SPI_CFG1_DSIZE_1 | SPI_CFG1_DSIZE_0; // MBR = 7 - clock/256; DSIZE = 0111 - 8 bit/frame SPI_PORT -> CFG2 = SPI_CFG2_AFCNTR | SPI_CFG2_SSM | SPI_CFG2_CPOL | SPI_CFG2_CPHA | SPI_CFG2_MASTER; // Enable SPI peripheral SET_BIT( SPI_PORT->CR1, SPI_CR1_SPE); работает, проблем пока вроде не заметил, если так можно выразиться в свете нижеследующих пунктов.... от хала оставил только вот это hnucleo_Spi.Instance = SPI_PORT; hnucleo_Spi.State = HAL_SPI_STATE_READY; потому что без него отправка байтов халовской функцией подыхает на взлёте. Инит пинов SPI оставил пока на хале, дабы резать колбасу по кусочкам: // SPI pins GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 2. Дисплей пока отключил, убрал в сторонку, не дорос я до него :biggrin: . Замкнул MISO-MOSI проводком, т.е. просто эхо. Пытаюсь передать байт: хал: // Чтение/запись байта SPI uint8_t ili9162_sendByte ( uint8_t data_out ) { uint8_t data_in; HAL_StatusTypeDef status = HAL_SPI_TransmitReceive(&hnucleo_Spi, &data_out, &data_in, 1, 1000); return data_in; Байт по кольцу гоняет, т.е. возвращает то, что я и отправляю. Типа нормально. закомментариваю хал, пишу на регистрах: // Чтение/запись байта SPI uint8_t ili9162_sendByte ( uint8_t data_out ) { uint8_t data_in; MODIFY_REG(SPI_PORT->CR2, SPI_CR2_TSIZE, 1); // Передача while ( !( SPI_PORT -> SR & SPI_SR_TXP ) ); *((__IO uint8_t *)&SPI1->TXDR) = data_out; SET_BIT ( SPI_PORT->CR1, SPI_CR1_CSTART ); // Приём while ((SPI1->SR & (SPI_SR_RXWNE | SPI_SR_RXPLVL)) == 0); data_in = *((__IO uint8_t *)&SPI_PORT->RXDR); return data_in; 2 байта передаёт-принимает нормально, на третьем виснет на условии приёма. Единственное отличие здесь от хала это то, что HAL_SPI_TransmitReceive постоянно включает/выключает SPI и MODIFY_REG(SPI1->CR2, SPI_CR2_TSIZE, Size); делает при выключенном SPI. Неужели это необходимо? Попробовал включать-выключать SPI - стало ещё хуже - один байт передал и завис .. 3. К слову о периферийных SPI-девайсах. Тут вообще всё плачевно. Вышеупоминавшийся дисплей вообще не инитится, пробовал подключать датчик BME280 (SPI интерфейс) - вместо ID (который равен 60h) читает одни нули, хотя на всяких там F1/F4 как положено 60h и датчик работает с песнями. Эта хрень даже с халовской HAL_SPI_TransmitReceive, которая эхо исправно делает. Помогите разобраться плиз. Такое чувство, что я где-то на одни и те же грабли наступаю ... Рабочий драйвер для BME280 (SPI) могу выложить если кому интересно. По I2C я его ни разу нигде не запускал, пока не нужно. Код уважаемого Genadi Zawidowski смотрел, но, видимо, чего-то недопонял, т.к. тоже повис на приёме байта если правильно помню :( .
  11. Не понял. Вы ж знаете когда вы включили ключ, а когда выключили его. Плюс ещё можете OUT опрашивать, хотя лично я этого не делал.
  12. Да, никакого AF не надо. Простой GPIO out. Как для светодиодика.
  13. У вас есть pull-up на EN. Значит, когда Вы сотрёте проц полностью кнопкой Erase, питание должно пропасть. Это происходит? PA8 я никогда не использовал, не подскажу. PS. Сейчас просмотрел все свои схемы c USB хостом - везде этим ключом рулит PA10.
  14. Вопрос задан непонятно. Если к Вашему устройству подключена, например, USB-флэшка и Вы хотите программно отключать ей питание, то используйте что-то типа STMPS2141STR.
  15. STM32H743 SPI

    С C/D и nCS всё в порядке: void ILI9163writecommand(uint8_t c) { res_rs ( ); //low res_cs ( ); //low ili9162_sendByte ( c ); set_cs ( ); //hi } void ILI9163writedata(uint8_t c) { set_rs ( ); //hi res_cs ( ); //low ili9162_sendByte ( c ); set_cs ( ); //hi } Вопрос только в отправке байта ..
  16. STM32H743 SPI

    Судя по осциллу SPI и его ноги ожили. Долбаный хал с его callback-ами. Угу, гляну, может там надо как-то ждать реального ухода байта в дисп, иначе он его не воспринимает. Там сразу после отправки CS поднимается в 1. Если поднимется раньше реального ухода байта из всех этих очередей проца, то дисп его не воспримет ...
  17. STM32H743 SPI

    Привет всем. Попал тут в руки проц STM32H743 в виде платы NUCLEO-H743I. Разобрался, как запустить его на все 400 МГц, Systick завёл, светодиодиками помигал - все это заработало. Частоту систика проверил осциллом. Перешёл к SPI (маленький дисплейчик ILI9163). Сам дисп рабочий, работал на Ф103. Драйвер диспа собственно оттуда же. Драйвер разделён на 2 части - низкоуровневая (работа с SPI и ногами) и т.н. высокоуровневая (пуляние в дисп команд, отрисовка точек, знакогенератор и пр). Соответственно в адаптации нуждается только низкоуровневая часть, т.к. высокоуровневая напрямую в ноги и SPI не лезет. С ногами nCS, nRESET и пр. ногодрыгом я управился, они работают нормально, а с SPI затык - синхра идёт исправно, а из ноги MOSI упорно прёт ноль. Нога MISO в данном случае не нужна вообще, т.к. у дисплея её нет. Пишу на помеси из регистров и кубового хала. М.б. это и нехорошо, но с ходу писать на регистрах на проце, которого раньше в глаза не видел как-то нехорошо. Инит пинов: // Configure PA5 - SPI1 SCK GPIO_InitStruct.Pin = GPIO_PIN_5; // SCK GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* // Configure PA7 - SPI1 MOSI // Configure PB5 - SPI1 MOSI // Configure PD7 - SPI1 MOSI GPIO_InitStruct.Pin = GPIO_PIN_7; // MOSI // GPIO_InitStruct.Pin = GPIO_PIN_5; // MOSI GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // GPIO_InitStruct.Pull = GPIO_PULLUP; // GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; // HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); */ // PA7 - SPI1 MOSI // MODER - AF = 10 GPIOA->MODER |= GPIO_MODER_MODER5_1; // 10 // TYPER - PP = 0 - Push-pull GPIOA->OTYPER |= GPIO_OTYPER_IDR_7; // 0 // SPEEDR - OSPEEDRy = 11 GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7; // 11 // PUPD_R = 10 - Pull-down GPIOA->PUPDR |= GPIO_PUPDR_PUPDR7_1; // 10 Нога PA5 (SCK) работает как угодно - хоть халом её инитить, хоть чем. PA7 (MOSI) - не работает никак. Инитил по-разному. Инит SPI (в основном хал): /*** Configure the SPI peripheral ***/ SPI_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_SPI123; SPI_PeriphClkInit.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL; HAL_RCCEx_PeriphCLKConfig(&SPI_PeriphClkInit); /* Enable SPI clock */ // __HAL_RCC_SPI1_CLK_ENABLE(); // SET_BIT (RCC->APB2ENR, RCC_APB2ENR_SPI1EN); RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // SPI Config hnucleo_Spi.Instance = SPI_PORT; // hnucleo_Spi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; hnucleo_Spi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; hnucleo_Spi.Init.Direction = SPI_DIRECTION_2LINES; // hnucleo_Spi.Init.Direction = SPI_DIRECTION_2LINES_TXONLY; hnucleo_Spi.Init.CLKPhase = SPI_PHASE_2EDGE; hnucleo_Spi.Init.CLKPolarity = SPI_POLARITY_HIGH; hnucleo_Spi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hnucleo_Spi.Init.CRCPolynomial = 7; hnucleo_Spi.Init.DataSize = SPI_DATASIZE_8BIT; hnucleo_Spi.Init.FirstBit = SPI_FIRSTBIT_MSB; hnucleo_Spi.Init.NSS = SPI_NSS_SOFT; hnucleo_Spi.Init.TIMode = SPI_TIMODE_DISABLE; hnucleo_Spi.Init.Mode = SPI_MODE_MASTER; hnucleo_Spi.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; /* Recommended setting to avoid glitches */ hnucleo_Spi.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; hnucleo_Spi.Init.CRCLength = SPI_CRC_LENGTH_8BIT; hnucleo_Spi.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; hnucleo_Spi.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; hnucleo_Spi.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; hnucleo_Spi.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; hnucleo_Spi.Init.MasterSSIdleness = 0x00000000; hnucleo_Spi.Init.MasterInterDataIdleness = 0x00000000; hnucleo_Spi.Init.MasterReceiverAutoSusp = 0x00000000; HAL_SPI_Init(&hnucleo_Spi); // Enable SPI peripheral SET_BIT( SPI_PORT->CR1 , SPI_CR1_SPE); SPI_PORT === SPI1. Отправка байта в SPI1 (хал): // Чтение/запись байта SPI void ili9162_sendByte ( uint8_t data ) { /* // Длина передаваемых байт - 1 MODIFY_REG (SPI1->CR2, SPI_CR2_TSIZE, 1); // Старт передачи SET_BIT(SPI1->CR1, SPI_CR1_CSTART); while ( !( SPI1 -> SR & SPI_SR_TXP ) ); SPI1 ->TXDR = data; // Ждать завершения передачи // while ( ! ( SPI1 -> SR & SPI_SR_TXC ) ); */ uint8_t data_in; HAL_StatusTypeDef status = HAL_OK; status = HAL_SPI_TransmitReceive(&hnucleo_Spi, &data_in, &data, 1, 1000); } // SPI_sendByte Моя поделка на регистрах не пашет вообще, я пока бросил, оставил хал. Проверяю всё это вызовом в вечном цикле ili9162_sendByte ( 0xAA ); В чём может быть дело? Если надо, выложу весь проект на 9 атоллике. Спасибо.
  18. Да, как-нибудь гляну ...
  19. Дисплей и отладка есть, Слава Богу. В общем после правок множителей всё завелось. WAV и FLAC немного подвывали, решилось увеличением частоты SPI. Получившиеся настройки таковы: SC_MULT = x4.5 SC_ADD = x2.0 Соответственно, CLOCKF = 0xC000 | 0x1800 | 0x0430. Единственное, что не пошло, это WMA. Тишина полная, хотя файл проверенный. Ну да фиг с ним, я ими не пользуюсь, сделал пару штук исключительно для проверки этих чипов. Jury093, спасибо Вам огромное.
  20. Значит так. 1. Проверил осциллом/частотомером - синус свистит идеально. Частотомер показал ровно столько, сколько я заказал. 2. Перекодировал тот файлик со звучение 440Hz в MP3 44.1kHz 32 KBps - частотомер показал ну так 880Hz в среднем, немного прыгает +-50..100Hz. Более высокие битрейты чуть позже проверю. Чё с этим делать? Крутить CLOCK_F?
  21. Да, сделаю, спасибо. Есть файл - звучит 440 Hz.
  22. Сорри, я не понял, что это был вопрос. Да, расчёты все на 12.288, т.к. кварц 24.576, то везде задаётся vs1011_writeCommand ( VS1011_MODE, SM_SDINEW | SM_CLK_RANGE ); // 0x8800 SM_CLK_RANGE - 15 бит в 1 - кварц 24..26. А в расчётах магического числа для CLOCK_F в доке вообще ни звука об этом. Я для интереса пытался рассчитывать для 24.576 - результат не влез в отведённые 10 бит.
  23. не, я таким тюнингом вообще никогда не занимался. Но пойду раскурю эту тему, может там мусор какой валяется ... У китайцев схема несколько упрощена в сравнении с тем, что нарисовано в ДШ :( . ЗЫ купил модуль, чтобы не делать самому плату, а тут такая хрень. Чип у меня и свой уже 3 года в коробке где-то валяется .. Угу. Поленились ребяты эти GPIO0 и GPIO1 вместе спаять ... Потому и молчала. Там ещё куча ног в воздухе у них висит - GPIO2...GPIO7. Там I2S для внешнего ЦАПа и ещё один SPI какой-то что-ли. Синус померю осциллом, отпишусь.
  24. Впаял кварц 24.578. Функцию писка немного переписал: void vs1011_sinewave_beep ( ) { // n = const uint8_t sine_on [ 8 ] = { 0x53, 0xEF, 0x6E, 0x04, 0x00, 0x00, 0x00, 0x00 }; const uint8_t sine_off [ 8 ] = { 0x45, 0x78, 0x69, 0x74, 0x00, 0x00, 0x00, 0x00 }; uint8_t i; VS1011_RESET_RES ( ); // nRESET = 0 delay_ms ( 1 ); VS1011_SET_RES ( ); // nRESET = 1 delay_ms ( 500 ); // Ждать, пока DREQ == 0 while ( VS1011_DREQ != SET ); vs1011_writeCommand ( VS1011_MODE, SM_SDINEW | SM_TESTS | SM_CLK_RANGE ); for ( i = 0; i < 8; i ++ ) vs1011_writeData ( sine_on [ i ] ); delay_ms ( 250 ); for ( i = 0; i < 8; i ++ ) vs1011_writeData ( sine_off [ i ] ); delay_ms ( 250 ); } // vs1011_sinewave_beep вызываю в цикле. Пищит нормально в оба уха, no problem, как говорят. Частоту на выходе, правда, не мерял. Текущий драйвер прилагаю. А вот с проигрыванием беда - mp3 проигрываются буквально как на магнитофоне с завышенной скоростью движения ленты. Другие форматы не пробовал. функция проигрывания файла самая примитивная, без наворотов: uint8_t readBuf [ READBUF_SIZE ]; // Проигрываемый файл FIL file; // Проиграть файл bool Play_file ( char *fName ) { FRESULT res; UINT nRead; // открыть файл res = f_open ( &file, fName, FA_OPEN_EXISTING | FA_READ ); if ( res != FR_OK ) return false; // цикл проигрывания while ( 1 ) { // Ждать запроса данных от VS // DREQ == 1 - посылать // DREQ == 0 - ждать while ( vs1011_isDataReq ( ) == false ); res = f_read ( &file, readBuf, 32, &nRead ); if ( res != FR_OK || nRead != 32 ) { break; } // if vs1011_send32 ( readBuf ); } // while // закрыть файл f_close ( &file ); // послать 2к нулей для очистки внутренних буферов VS for ( nRead = 0; nRead < 2048; nRead ++ ) vs1011_writeData ( 0 ); // Сброс VS vs1011_reset ( ); return true; } // Play_file Размер буфера 2 кила (там был кеш с опережающим чтением, я его пока выкинул), но то пофиг, ни на что не влияют. В чём ещё могут быть траблы? PS. начинаю думать, что этот модуль - вообще брак полный :crying: . vs10xx.zip