Всем привет, помогите с пресловутым I2S, 2 дня ничего не получается, уже на грани нервного срыва, у всех что-то работает у меня ну не в какую
Генерирую исходник STM32CubeMX для keil 4, ножки настаиваю согласно схеме diskavery.
После генерации кода, ничего не трогаю, а только в тело основного цикла вставляю
HAL_I2S_Transmit_DMA(&hi2s3, (uint16_t*)Audio_Buffer, 1000); и полная тишина! а вот если так сделать
HAL_I2S_Transmit_DMA(&hi2s3, (uint16_t*)255, 1000); порт оживает и начинает генерировать.
Что не так? Почему он не генерирует с переменной Audio_Buffer.
Объясните пожалуйста дурачку что не так делаю.
Привет, можешь проект выложить?
@aveal Привет. Могу. У меня сейчас есть продвижения, но все равно вообще не понятное творится.
В кратце: в настройках I2S сделал передачу данных старшим битом вперед, стояло стандартный кодек филипс. Логическим анализатором слизал инициализацию 43СL22 с прошивки в виде бинарника проигрывание музыки. В общем стал появляться всякий шум писк, но блин! Все не так! Все!
Как я понимаю я к примеру из массива отправляю например плавно возрастающие значения и у меня на выходе осциллограф должен показать что-то типа плавно возрастающей с обрывом в конце, то есть типа пил. Но на выходе просто мелкий шум, типа как магнитофоны шумят когда паузу нажимают. Хотя логический анализатор показывает что данные прилетают верные. Потом подключил переменный резистор на ADC и через DMA сливаю с него в I2S данные, возникают какие-то писки свисты. В общем капец какой-то.
Подчищу код от мусора, ибо сейчас там караул и выложу с фото осциллографа что на выходе у микросхемы.
Я в отчаянии, 5 дней и просто вопросов больше чем ответов, и никто в инете с ней особо кроме как станадартной библиотекой не умеет работать.
В общем в архиве исходник в keil 4 и Cubemx. При вращении переменного резистора 4,7 к0м питание от +3,3 В в наушниках раздаются всякие свисты шумы.
Сделал фотку отрезка инициализации от рабочего прошивочного файла. Почему-то при инициализации, команды передаются по 2 раза.
Например:
1 адрес 0x4A регистр 0х02 данные 0х01
2 адрес 0x4A регистр 0х02
3 адрес 0x4A регистр 0х01
И так передаются все команды настройки. Странно почему, инициализировал только по пункту 1, без дальнейшего отдельного дублирования команд. В общем на фото видно.
Так же на следующей фото видно что при инициализации микросхемы по I2C на выводе MCLK тактирования 12 МГц нету, оно появляется после окончания инициализации, это все слизано с рабочей прошивки, если ее прошить и не подключать флешку, то в наушниках играет короткая музыкальная заставка и мигает синий светодиод. Если сразу не поет, надо нажать ресет.
https://cloud.mail.ru/public/R1yC/c8R5Lv8nq В архиве исходник, в корне *.hex прошивка играющая заставку если не подключена флешка
В общем вопрос, как проиграть или фрагмент мелодии или сгенерировать какой-то сигнал, к примеру синусоиду.
Инициализацию делал так: Возможно в исходнике будут отличия, игрался с регистрами, это ни на что не повлияло по сути
адрес DAC регистр дата
0х4А 0х02 0x01
0х4А 0х04 0xAF
0х4А 0х05 0x81
0х4А 0х06 0x04
0х4А 0х20 0xCB
0х4А 0х21 0xCB
0х4А 0х02 0x9E включение питания
0х4А 0х0A 0x00
0х4А 0х0E 0x04
0х4А 0х27 0x00
0х4А 0х1F 0x0F
0х4А 0х1A 0x0A
0х4А 0х1B 0x0A
Попробуй минимальный-простейший пример запустить, типа как тут я делал - ссылка. Инициализацию опять же можно взять оттуда, делал сто лет назад, но точно помню, что все работало четко - то есть высота нот соответствовала подаваемым сигналам.
@aveal 3 часа мучений и вроде есть положительный результат.
Ваша инициализация слегка шипит, прям еле еле, при вращении переменного резистора в наушниках слышно как меняется выходной потенциал, а осциллограф показывает синусоиду.
I2S работает в режиме DMA, через него заливаются данные с ADC.
С моей инициализацией шипение раз так в 100 сильнее, просто белый шум.
Сейчас настроил чтоб потенциометр задавал частоту прерывания таймера, попробую теперь вывести хоть какой-то звук.
В общем ОГРОМНОЕ СПАСИБО!
Всем добрый день. Я опять со своей проблемой. ну не получается генерировать синусоиду, я не понимаю. Сделал нормальную инициализацию, даже включил аппаратный бипер при инициализации, работает, выкрутил громкость на максимум, работает, но синусоиду не получается генерировать. Или я тупой или лыжи не едут. Помогите, ткните носом где я туплю.
Если закоментированную строку запустить, то с ADC данные идут, при вращении резистора социллограф выдает почти синусоиду, то есть все корректно передается, но как только с массива передаю, полная хрень получается. потенциометром регулирую частоту, она меняется, но вместо синусоиды там типа синусоида которая еще пилой промодулирована. Я в тупике 🙁
Инициализация переферии выполнена кубом 4-й версии.
В в порт 232 выдаю данные с переменной массива, там синусоида идет, а в наушниках фигня
@dimaxa а если постоянный период для TIM2 задать для теста, в районе 9 мкс?
но вместо синусоиды там типа синусоида которая еще пилой промодулирована
А есть изображение этого эффекта?
На видео показал как это выглядит, эта пила создает шум и при увеличении частоты синусоида переходит в меандр, такого не должно быть в принципе.
Хм, читаю сейчас про I2S и наткнулся на такую строку
HAL_I2S_Transmit_DMA(&hi2s2, (uint16_t*)wavReadBuffer2, WAV_BUFFER_SIZE/2);
Так вот у меня
WAV_BUFFER_SIZE/2
не 256, а 1. Но вчера пробовал и 2, 32, 64 и 256, осциллограф показал какие-то холмы и горы вместо синусоиды и частоты переменником переставала регулироваться.
и почему в этой записи
(uint16_t*)wavReadBuffer2
нет значка & перед wavReadBuffer2 ? У меня без этого значка вообще не работает. Голова уже кругом идет, может я туплю уже и не вижу очевидного, но что есть то есть. 🙁
(uint16_t*)wavReadBuffer2
Имя массива эквивалентно указателю на первый элемент, поэтому & не нужен, могло быть &wavReadBuffer2[0]. Попробуй все-таки зафиксировать жестко период TIM2, без потенциометра.