Top.Mail.Ru
Уведомления
Очистить все

[Решено] STM32F407 diskavery + I2S не работает от слова совсем.

Страница 2 / 2
Aveal
(@aveal)
Top level Admin

@dimaxa Я сейчас пробежался по коду, есть ощущение, что тут должно быть DMA_MINC_DISABLE:

hdma_spi3_tx.Init.MemInc = DMA_MINC_ENABLE;
ОтветитьЦитата
Размещено : 13.02.2024 11:42
(@dimaxa)
Level 1

Не нашел эту строку 🙁 Можете носом ткнуть где она? В каком файле.

ОтветитьЦитата
Создатель темы Размещено : 13.02.2024 16:42
Aveal
(@aveal)
Top level Admin

В stm32f4xx_hal_msp.c, вообще это в Cube надо поменять, это сгенерированный файл.

ОтветитьЦитата
Размещено : 13.02.2024 16:45
(@dimaxa)
Level 1

Это я понял что в кубе. Я вообще убрал DMA из кода, теперь у меня генерируется почти меандр. В RS232 вывожу массив, там идет синус, а на осциллографе почти меандр.  У меня руки опускаются победить этот DAC.

Этот код написал в обработчик прерывания таймера, таймер не зависит от переменного резистора

temp=temp+1;
HAL_I2S_Transmit(&hi2s3, (uint16_t*)&sin_tab_2[temp], 256,100);
if (temp==256) {temp=0;}

sin_tab_2 массив из 256 значений синусоиды

 

И на выходе почти меандр амплитудой 0,5 В. Блин ну что не так то.

 

ОтветитьЦитата
Создатель темы Размещено : 13.02.2024 17:43
Aveal
(@aveal)
Top level Admin

Запись от: @dimaxa

HAL_I2S_Transmit(&hi2s3, (uint16_t*)&sin_tab_2[temp], 256,100);

Здесь каждый раз передаются 256 значений начиная с адреса sin_tab_2[temp]. По задумке наверно должно передаваться одно значение каждый раз, когда переполнился таймер?

ОтветитьЦитата
Размещено : 13.02.2024 17:54
(@dimaxa)
Level 1

@aveal Ну вообще да, с каждым тиком новые данные. То есть там вместо 256 надо 1? Сейчас попробую

ОтветитьЦитата
Создатель темы Размещено : 13.02.2024 19:03
(@dimaxa)
Level 1

Поставил 1 вместо 256, и вообще никакой генерации.

ОтветитьЦитата
Создатель темы Размещено : 13.02.2024 19:04
Aveal
(@aveal)
Top level Admin

@dimaxa Можно с самого простого начать - таймер настроить на переполнение раз в 500 мс, чтобы точно передача успела завершиться, и отправлять значения либо из массива, либо просто попеременно ноль и не ноль. Дальше уже подумать над организацией всего, DMA и т. д. Сейчас может таймер вообще переполняется до того как передача предыдущая завершилась.

ОтветитьЦитата
Размещено : 14.02.2024 14:08
(@dimaxa)
Level 1

Тогда уж передачу сделать в теле while (1) {}.

Там точно успеет передать, хоть весь массив. Но вот вопрос, допустим он начнет передавать и опять меандр, почему в порт RS232 массив выходит нормально, синусоида по значениям из массива, а с DAC будет выходить меандр. Меня в тупик это ставит. ладно, сегодня попробую.

ОтветитьЦитата
Создатель темы Размещено : 14.02.2024 14:25
Aveal
(@aveal)
Top level Admin

Запись от: @dimaxa

Тогда уж передачу сделать в теле while (1) {}.

Ну да, HAL_Delay() влепить туда. Просто получим отправную точку, в которой все идет по плану, а следующим шагом, как вариант, из того же места отправлять уже данные синусоиды, и посмотрим результат. То есть движение начнем относительно точки, где все работает как мы и планировали.

ОтветитьЦитата
Размещено : 14.02.2024 14:46
Страница 2 / 2
Поделиться: