I2s для STM32F4: сейчас работа

Мубас
Сб 2 мая 2015 г., 14:59
Всем привет. Отличный проект и форум. :)
Я очень заинтересован в том, чтобы получить аудиокодек на доске обнаружения STM32F4. Я люблю эту доску за его аудиологические возможности.
Я понимаю, что это повторно i2s (который находится на SPI3) и I2C для работы с DAC.
Могло бы сделать библиотеку ?
Если это так, есть ли у кого -нибудь указатели относительно того, как я бы сделал это, используя текущие ядра STM32Arduino, выполненные Roger? (Спасибо, Роджер.)

Rogerclark
Сб 2 мая 2015 г., 21:21
Мубас

Похоже, на доске Maple Ret6 были i2s

Я сделал поиск на «Maple i2s» и нашел

https: // ackspace.NL/WIKI/DSP_EXPERIMENTS

Я ничего не знаю о i2s, я боюсь.

Вероятно, вам нужно будет прочитать DOC для F4 из STM, сотни страниц, чтобы увидеть, как настроить и использовать порт I2S.

Затем посмотрите, как SPI реализован как руководство по реализации I2S.

Возможно, вам придется добавить новые функции в код и заголовки ядра, если да, дайте мне знать, что вы собираетесь сделать на F4, чтобы я мог сделать эквивалент F1

Мадиас
Солнце 3 мая 2015 г., 7:00 утра
Я работаю над PIC32 с I2S, получил с таблицей данных, примерами кода и большой помощи на форуме Chipkit.
Моя проблема в том, что у меня нет доски I2S STM32.
Я также не знаю, как основаны основы для i2s в Libmaple.
Хорошие документы для начала:
https: // www.Sparkfun.com/datahasthets/bre ... I2sbus.PDF
http: // www.ул.com/web/en/resource/techn ... 087544.PDF
Из структуры я сделал следующее (как я помню):
Настройка шины I2S (постоянная часовая линия) и стрельба по прерыванию (буфер I2S Buffer (почти) пустое - кормление новых данных в шину)

Rogerclark
Солнце 3 мая 2015 г., 23:18
@Mubase

Я быстро посмотрел на справочник Master программирования для устройств STM32F103

http: // www.ул.com/web/en/resource/techn ... 171190.PDF

И похоже, что i2S реализован как специальный режим аппаратного обеспечения SPI.

Поэтому я подозреваю, что ваш лучший вариант - дублировать SPI Libary и изменить его

Однако, глядя на документы, I2S, похоже, имеет уровень протокола поверх необработанной передачи данных с использованием часов и данных, которые вам необходимо понять, чтобы иметь шанс реализовать новую библиотеку

Мубас
Пт, 8 мая 2015 г., 16:29
Всем привет.
ХОРОШО. Я обнимаю голову, пытаясь заставить i2s работать над Discovery STM32F4, чтобы мы могли ссылаться на кодек на борту.
I2s связан с SPI3, и он появляется, так как я сделал простой тест на записи SPI3, а сигналы часов и MOSI появляются на моем осциллографере.
Чтобы использовать i2s, я должен перебрать булавки от SPI3 до i2s.
Пример, который я нашел, дает это:
/* Connect pins to I2S peripheral */ GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_SPI3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SPI3); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SPI3); /* CODEC_I2S pins configuration: MCK pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Connect pins to I2S peripheral */ GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_SPI3); /* Enable the CODEC_I2S peripheral clock */

Мадиас
Пт, 8 мая 2015 г., 19:58
В разговоре с Роджером я написал следующие строки некоторое время назад:
Что -то, что я немного исследовал: поддержка I2S для любой платы STM32 станет «началом с эскиза», я не нашел ни одного связанного материала с Maple/Leaflabs и i2s, были некоторые запланирования много лет назад, но ни одной линии. Код написан. Даже я не знаю, есть ли какая -либо «основная» поддержка в файлах основных файлов Leaflabs, поэтому я думаю, что единственная возможность - изучить файлы cmsis/stdperiphdriver, такие как:
https: // github.com/avikde/koduino/blob/ ... f10x_spi.час
и
https: // github.com/avikde/koduino/blob/ ... f10x_spi.в

Включена поддержка I2S. Преимущество в том, что вы можете перенести некоторые из примеров I2S с помощью этой LIB.

Я думаю, что это может приблизиться к этому.


Имейте в виду, что мне ответил Роджер:
Первоначально, файлы, подобные тем, которые использовали Авик, не существовали, были и другие файлы, но они были авторскими правами, поэтому не могли быть использованы Lealfabs, поэтому они написали свои собственные.

Файлы, которые использует Avikde, поступают из STMCube и являются открытым исходным кодом (ну, хорошо для использования), но STM только выпустила поддержку STMCube для F103 совсем недавно, и, согласно @Westfw, с ними все еще есть проблемы.
Однако это было, вероятно, 1 месяц назад


Так что, может быть, это лучший способ только для i2s (!) использовать stdperiph_driver, а не Leaflabs.

Мубас
Пт 8 мая 2015 г., 23:48
ОК, это здорово. Спасибо, Мадиас. Я посмотрю в файлы Koduino....
Я думал, что начинать с установки в эскизе было также способом. Я поправил часть SPI.час & SPI.c файлы, но я застрял в том, как работает регистр Remap. Gpio alternate function низкий регистр (gpiox_afrl) (x = a..I/J/K) и GPIO Alternate Function High Register (GPIOX_AFRH)
(x = a..Я/J)

Rogerclark
Сб 9 мая 2015 г., 1:30 утра
@mubase

Дайте мне знать, как вы поживаете с Koduino

На днях у меня был быстрый взгляд, но весь репо, как правило, нацелен на F3. Это не просто папки варианта, плата.У TXT есть жесткие кодированные вещи для F3, что затрудняло его работать с F103

Но F4, вероятно, в порядке, потому что у него есть FPU (это была одна из проблем, когда я пытался использовать Koduino на F103)

Примечание. Я не уверен, что API Koduino на 100% совместим с Arduino, я попытался запустить простой набросок мигания, и он не компилировался, потому что Авик использовал свой собственный тип данных для «логики» я.E высокий или низкий, вместо использования uint8_t или чего бы ни использовали обычные файлы arduino.

Мадиас
Сб, 09 мая 2015 г., 6:05
Спасибо, Роджер, я забыл, что это обсуждение было о STM32F1 (!) xxx, так что все:
https: // github.com/avikde/koduino/tree/ ... M32/Система

Мубас
Сб 09 мая 2015 г. 15:11
Просмотр либмапла gpiof2.C код я вижу эту функцию: void gpio_set_af_mode(gpio_dev *dev, uint8 pin, int mode) { gpio_reg_map *regs = dev->regs; regs->AFR[pin/8] = (regs->AFR[pin/8] & ~(15 << (4*(pin&7)))) | (((mode >> 0) & 15) << (4*(pin&7))); }

Rogerclark
Сб 9 мая 2015 г., 21:16
Я не эксперт по переработке

Матиас сделал это на своей доске нуклео.

Вероятно, лучше скачать PDF -файл в Руководство по программированию для F4 с сайта STM (его сотни страниц) и посмотреть, есть ли какие -либо ограничения для переиздания, у меня было ощущение, что не булавки нельзя произвольно перенастроить на любой другой PIN -код.

Кроме того, я не уверен, почему вы хотите переиздать, это из -за оборудования на доске обнаружения ?

Если это так, попробуйте посмотреть, есть ли какие -либо примеры кода низкого уровня C от STM для i2s на доске обнаружения, так как им нужно было бы сделать то же самое, чтобы вы могли видеть, что они сделали

Мубас
Солнце 10 мая 2015 г. 8:58 утра
Codec.jpg
F4 Discovery Codec Pinout
Кодек.JPG (98.03 киб) просмотрено 2692 раз

Rogerclark
Солнце 10 мая 2015 г. 10:23
@mubase

Это отличные новости.

Извините, я не могу помочь с I2S, но я ничего не знаю об этом протоколе, но я купил несколько досок аудиокодеков i2s несколько месяцев назад, поэтому будет интересно, чтобы увидеть, работает ли какой -нибудь ваш код на F103
Ну, у меня есть F4, но несколько человек играют с платами серии F013V, которые, я думаю, могут иметь i2s (мне нужно дважды проверить)

Мубас
Солнце 10 мая 2015 г. 10:52 утра
Привет, Роджер :) Я не думаю, что вы знаете, работает ли i2c в порту STM32F4??

Rogerclark
Солнце 10 мая 2015 г. 11:14
Извини

Я не уверен насчет i2c. Это также вроде зависит, если вы просто имеете в виду Wire, который был реализован в качестве избитой программного битового или, если вы имеете в виду «Hardwire», которая является истинным оборудованием i2c в UP

Я подозреваю, что программное обеспечение нужно работать, как это было на F103 (ну, у него была очень незначительная ошибка, которая остановила демонстрацию сканера I2C от работы, но, кроме того, это было нормально)

Это все, что я знаю..

Мадиас
Солнце 10 мая 2015 г. 11:57 утра
Программное обеспечение i2c aka Wire.H должен работать. Я упустил из виду код некоторое время назад и увидел только простую цифровую запись там. Единственное, что нужно знать, это то, что определения штифтов «жестко кодируются» в провод.H и линия 58 в проводе.H не слишком быстро для STM32F4 #define I2C_DELAY(x) do{for(int i=0;i

Мубас
Вторник 12 мая 2015 г. 18:58
Привет, Мадиас. :)
Кажется, у меня есть работа i2c. Я вижу тактовой сигнал и использую функцию i2c_master_xfer для отправки адреса & байты данных на кодек. Я вижу их на осциллографе.
Тем не менее, я близок к тому, чтобы сдаться, так как я не могу на всю жизнь, чтобы я работал MCLK I2S!!!!! :зло:
PIN MCLK находится на GPIOC7, который я настроил в виде выхода AF PP, и он перемещен в SPI3.
Я попытался установить PLLI2s на ON и несколько различных комбинаций реестров настройки, но я все еще вижу плоскую линию на своем осциллографе, где я должен увидеть красивые часы.... :(
он делает мою голову в.

Мадиас
Вторник 12 мая 2015 г. 20:39
Mubase, я вижу, я должен скоро купить доску с участием I2S...
Я могу только теоретически помочь:
Итак (лично мне не нравится термин «i2c» и «i2s» - слишком близко друг к другу): i2c работает (с помощью провода.h в программном режиме, как я подозревал...)
Что вы используете модуль/чип I2S? Я немного смущен, потому что вы говорите о i2s и i2c в одном предложении. Если вы можете сказать мне чип, я могу прочитать таблицу данных.

Rogerclark
Ср 13 мая 2015 г. 11:04
Ребята,

У меня есть доска i2s (я думаю)... Я никогда не пробовал это.

Я посмотрю, есть ли у меня какое -то время на выходных, чтобы посмотреть на i2s

Mubase может выложить весь свой код


Я думаю, что с i2s это то, что она больше похожа на SPI в его электрических соединениях, чем на i2c

Что ж, у STM это на порту SPI, поэтому должна быть причина для этого

Мубас
Ср 13 мая 2015 г., 11:19
Что вы используете модуль/чип I2S? Я немного смущен, потому что вы говорите о i2s и i2c в одном предложении. Если вы можете сказать мне чип, я могу прочитать таблицу данных. Я использую доску обнаружения STM32F4. Микроконтроллер является STM32F407VGT. У платы есть аудиокодек, Cirrus C43L22. Он использует i2s в качестве аудио -контроллера и I2C для связи с контрольными сигналами кодека.

Код здесь ::
void setup() { i2s.end(); // de init gpio_set_mode(GPIOD,4,GPIO_OUTPUT_PP); // codec reset pin //i2c pin modes gpio_set_mode(GPIOB,6,GPIO_AF_OUTPUT_OD); // i2c clk gpio_set_mode(GPIOB,9,GPIO_AF_OUTPUT_OD); // i2c data // i2c remap to B gpio_set_af_mode(GPIOB,6,4); gpio_set_af_mode(GPIOB,9,4); //enable i2c & i2s clocks which are probably enables already but just to be sure rcc_clk_enable(RCC_I2C1); rcc_clk_enable(RCC_SPI3); RCC_BASE->CFGR &=(1<<(uint32)23); // pll i2s RCC_BASE->CR |=(1<<(uint32)26); RCC_BASE->CR |= (0b1 << 26); /* PLLI2S clock used as I2S clock source */ RCC_BASE->CR |=(1<<16); //HSE on RCC_BASE->CR |=(1<<24); // pll on /* Enable PLLI2S */ RCC_BASE->CR |= (0x0f039583); // from debug // while((RCC_BASE->CR & RCC_PLLI2SRDY) == 0) // { // } //i2s pins gpio_set_mode(GPIOC,10,GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOC,12,GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOC,7,GPIO_AF_OUTPUT_PP); //set remap to spi3 gpio_set_af_mode(GPIOA,4,6); gpio_set_af_mode(GPIOC,7,6); gpio_set_af_mode(GPIOC,10,6); gpio_set_af_mode(GPIOC,12,6); //gpio turn off codec for now gpio_write_bit(GPIOD,4,0); //configure i2s /* SPI3_BASE->I2SCFGR |= 0b0000111000000000; SPI3_BASE->I2SPR |= 0b0000001100000011; SPI3_BASE->I2SPR |= 0b0000001100000011;*/ prescaler and turn on i2S MCLK SPI3_BASE->I2SCFGR |=(SPI_I2SCFGR_I2SCFG_MASTER_TX); // i2s in master transmitter mode. //i2c setup i2c_set_clk_control(I2C1,1); i2c_set_input_clk(I2C1,3); i2c_enable_ack(I2C1); i2c_master_enable(I2C1, 0); i2c_peripheral_enable(I2C1); codec_ctrl_init(); //i2s begin i2s.begin(); }

Rogerclark
Ср 13 мая 2015 г. 12:15
У меня нет руководства для F4

Но в руководстве F103 он говорит
MCK: Мастер -часы (отображаются отдельно), когда I2S настроен в мастер -режиме (и когда установлен бит MCKOE в регистре SPI_I2SPR), чтобы вывести эти дополнительные часы, сгенерированные при предварительно сконфигурированной частоте, равной 256 × FS, где Fs - частота отбора проб звука Но вы, кажется, делаете это в своем коде

Я знаю, что некоторые вещи не могут быть сделаны, пока SPI включен, поэтому, возможно, попробуйте отключить и повторно включить SPI 3 после всех других изменений

Или предпочтительно отключить его в начале

Внести все изменения и включить

Если вы еще этого не делали (в коде это немного сложно сказать, просто посмотрев на битовые шаблоны, лучше всего делать #Defines для битовых шаблонов для читаемости для читаемости

Мубас
Ср 13 мая 2015 г., 13:31
В SPI.C Файл Существует функция с именем spi_peripheral_enable (): void spi_peripheral_enable(spi_dev *dev) { bb_peri_set_bit(&dev->regs->CR1, SPI_CR1_SPE_BIT, 1); }

Мубас
Ср 13 мая 2015 г., 17:43
ХОРОШО!! Теперь у меня есть сигнал MCLK GPIOC7, а сигнал WS выходит от GPIOA4 на 44.1 кГц!!
Я добавил функцию в SPI.C Файл, который устанавливает i2s для включения в режим Master Xmit, 16 -битный Phillips Standard. void i2s_peripheral_enable(spi_dev *dev) { bb_peri_set_bit(&dev->regs->I2SCFGR, SPI_I2SCFGR_I2SE_BIT, 1); SPI3_BASE->I2SCFGR |=(SPI_I2SCFGR_I2SE); SPI3_BASE->I2SCFGR |=(SPI_I2SCFGR_I2SCFG_MASTER_TX); SPI3_BASE->I2SCFGR |= (SPI_I2SCFGR_I2SMOD_I2S ); SPI3_BASE->I2SCFGR |= ( SPI_I2SCFGR_I2SSTD_PHILLIPS); SPI3_BASE->I2SCFGR |= ( SPI_I2SCFGR_DATLEN_16_BIT); SPI3_BASE->I2SCFGR |= ( SPI_I2SCFGR_CKPOL_LOW); SPI3_BASE->I2SCFGR |=(0b000011100000000); SPI3_BASE->I2SPR |= (00000011100000011); // set for mck on and 48K samplerate }

Rogerclark
Ср 13 мая 2015 г., 20:59
Мубас

Спасибо, фантастические новости

Когда вы получите шанс, вы можете застегнуть и опубликовать свои новые функции (без спешки)

Я выкопаю свои внешние аппаратные модули I2S и выясню, какой чип они используют

Мадиас
Ср 13 мая 2015 г., 22:00
I'm using an STM32F4 discovery board. The microcontroller is an stm32f407vgt. The board has an on board audio codec, the cirrus c43l22. It uses I2S as its audio controller and I2C to communicate with the codec's control signals.

Rogerclark
Ср 13 мая 2015 г., 22:41
Матиас

Я только что проверил, и мои модули не i2s :-(

У меня есть VS1053 http: // www.VLSI.fi/en/products/vs1053.HTML
Интерфейс I2S для внешнего ЦАП Я был в замешательстве, потому что i2s состоит в том, чтобы они управляли внешним ЦАП, а не для их использования DAC :-(


Может быть, я могу просто использовать Adafruit Lib

https: // github.com/adafruit/adafruit_vs1053_library

Мне нужно будет посмотреть, смогу ли я получить DAC i2s самостоятельно.

И в то же время, эта либера (когда у меня есть время)

Мадиас
Чт 14 мая 2015 г., 6:15
Роджер, это VS1053, припаянный на вашей плате DEF или отдельный модуль?
Если у вас есть модуль LCSoft VS1053, возьмите свой паяльный железо и прочитайте это, иначе вы не можете использовать его для mp3:
http: // www.Баджди.com/lcsoft-vs1053-mp3-module/
Я получил свой модуль LCSoft некоторое время назад, я думаю, я не пробовал его на Maple, я застегнул для вас настройки наброска на тестировании UNO.
VS1053 - это прохладный блок из спецификаций: воспроизведение различных сжатых, а не сжатых аудиоформатов, запись звука.... Преимущество заключается в том, что каждый поток данных проходит через MCU, поэтому вы можете управлять источником, иметь доступ к именам файлов SD-Card, возможно, некоторые взломы DSP (если он работает без FPU?)
Если вам нужно - или просто вы хотите играть - с простой 16 -битной Audio DAC. Следите за PT8211. Они совершенно дешевые, легко настройка и хорошо звучат только о том, чтобы узнать о них: они используют наименее значимый бит оправданный (LSBJ - или называемый «Японский входной формат»), а не i2s. Но это должно быть сделано только на одном бите в регистре. (Существует около 3-4 I2 с аналогичными форматами аудиотока, и, как я знаю, каждый MCU с поддержкой I2S может справиться с большинством из них)
Редактировать: Да, вы можете использовать библиотеку AdaFruit, я также использовал ее в одном из моих тестовых кодов.
РЕДАКТИРОВАТЬ 2: VS1053 - это простое устройство, управляемое SPI, а не i2s

Rogerclark
Чт 14 мая 2015 г., 6:27
Матиас

Да.

Это доска у меня.

Я только что прочитал статью... Так что мне нужно припаять пару булавок вместе .. Без проблем.

Я купил дешевый USB -микроскоп на днях, так что я могу просматривать ситуацию на несовершеннолетнем, пока я припаю, как и в противном случае с некоторыми очками x3, у меня есть очень трудно припаять на этих крошечных чипах


КСТАТИ. Я купил доску для игры в mp3, поэтому использование i2s не было моей главной заботой.

Спасибо за наброски ООН. Я не уверен, когда у меня будет время попробовать их.

Все немного занято работой, так как я начал новый проект несколько дней назад, и я все еще пытаюсь понять, что требуется или как его программировать ;-)

еще раз спасибо

Роджер

Пса. Теперь я создам раздел вне темы, когда я его помню !

Мубас
Чт 14 мая 2015 г., 7:17 утра
Спасибо за код, мадиас.
Одна проблема, с которой я становлюсь, заключается в выводе данных через I2S MOSI. Я понимаю, что это нужно сделать из ISR, но я не уверен, как настроить функцию прерывания для SPI, когда TX пуст.
Кто -нибудь может помочь мне в этом?
Я посмотрел на ISR.S и векторы, но не знают, как их настроить...

Rogerclark
Чт 14 мая 2015 г., 7:29
Мубас

Вы, вероятно, должны посмотреть на DMA

Victorpv заставил его работать на F103, но он использовал старую / устаревшую версию функций DMA (поскольку они, казалось, было легче добраться до работы)

На F4 появилась новая концепция «труб DMA», которую Leaflabs изменили на использование, потому что она лучше подходила для F4

Кроме того, я думаю, что вам нужно посмотреть на код NVIC, потому что я думаю, что NVIC обрабатывает все прерывания, а не отдельные подразделы
эн.глин. Я не думаю, что у SPI / I2S есть регистр для ISR, я думаю, что реестр находится в разделе NVIC

(не уверен, что что -то из этого помогает ;-)

Редактировать.

Вы также можете просто опросить, чтобы SPI был готов

Если вы посмотрите в Spi Lib в F103, он проверяет 2 разные вещи после того, как он записывает байт, до выхода функции. Я думаю, что один из флагов, который он ждет некоторое время, - это флаг готового данных, я.e Это готово к большему количеству данных

Очевидно, это совсем не эффективно.

Мадиас
Чт 14 мая 2015 г., 7:47
Вы можете уволить IRQ также вручную для тестирования, но вы получите много дрожания.
В этот момент я не могу вам помочь, без i2S-STM32 Poard.
Я думаю, что лучшая идея - Google «Demo STM32 I2S или что -то в этом роде, я нашел такие вещи:
http: // электроника.Stackexchange.com/Qu ... разрывистое использование
https: // github.com/bjornfor/stm32-test/ ... Эинтеррот
http: // ebrombaugh.Studionebula.com/synth/stm32f4_codec/
Должно быть возможно изучить примеры кода приведенных выше ссылок, чтобы получить некоторые подсказки, как управлять IRQ/Buffer Stuff.

Роджер: Вы правы с DMA и I2S. Вы получаете лучшую производительность, если у вас есть постоянный поток данных (F.эн. из SD-карта). Я не играл с этим на своем PIC32, потому что я использую «расчет звука в реальном времени», поэтому каждый образец рассчитывается в каждом триггере IRQ, поэтому поток не предсказуемый.

Роджер: Я использую что -то подобное для точной пайки:
http: // www.aliexpress.com/item/multi-fu ... 04310.HTML
У него двойное увеличительное стекло (3.5x и 12x) и светодиодный свет. Даже TFQ64 (еще не пробовал 100) не будет проблемой для припадения с ним. Вам нужно разобрать владелец пайки железа, если вам не нравится запах сгоревшего пластика. (Полностью дизайн недостаток)

Rogerclark
Чт 14 мая 2015 г. 8:08 утра
Матиас,

У меня довольно большое освещенное увеличительное стекло, но это не высокое увеличение.

Я также использую x3 «чтение» очки - которые были бы ужасно для «чтения», но очень полезны для увеличения X3 (хотя вы получите головокружение, если вы попытаетесь носить их и ходить)

У меня также есть x 10 Jewellers Eye Glass

А также этот USB -микроскоп для очень маленьких вещей (хотя на экране ПК есть некоторое отставание)

http: // www.eBay.компонент.au/itm/2mp-usb-digi ... 27daea5d93

Изображение

Rogerclark
Чт 14 мая 2015 г. 8:21
Мубас

Также взгляните на

https: // github.com/leaflabs/libmaple/bl ... RT-DMA.CPP

и
http: // форумы.Leaflabs.com/тема.PHP?ID = 1882

Пса. Я думаю, что я сказал «трубку» раньше. Теперь я вижу, что это "трубка" ;-)

Я думаю, что мне удалось получить трубку DMA, работающую для аппаратного сериала, но я не думаю, что пример Leaflabs сработал в существующей форме

Но стоит попробовать

Я, наверное, опубликовал что -то на Arduino.Форум CC, несколько месяцев назад об этом

Но это такая огромная нить, я не уверен, смогу ли я его найти.

Редактировать.

Нашел это

http: // форум.Ардуино.CC/INDEX.PHP?тема ... MSG2141899

Я предполагаю, что репо F4 был взят из достаточно поздней версии, которая включает в себя трубки DMA, но у меня не было возможности посмотреть

Пса. Мубас

Если у вас есть какие -либо вопросы DMA, то это также стоит привлечь к Victorpv, он проделал всю работу, заставляя SPI DMA работать над F103, и я уверен, что многие вещи, которые он узнал, будут применимы к вашему DMA на F4

Ах, также, я думаю, F4 может дать DMA FIFO, его стоит проверить. У подростки есть один (не STM), но я знаю, что F103 не

Мадиас
Чт 14 мая 2015 г. 8:22 утра
Я смотрел видео на YT, наверняка превосходно для изучения вещей, но из -за отсутствия, которое я видел на видео, может быть, трудно для «пайки в реальном времени» (я знаю себя и я «припаял» микроскоп, а не на печатной плате в течение нескольких минут и Держатель пластиковых линз не проявил бы милосердие по поводу тепла железа) ;)
Другая проблема: микроскоп не был бы моим: маленькая дочь, насекомые, запросы умов
...Но я добавил это в свой список желаний :)

Мубас
Пт 15 мая 2015 г., 18:50
Кажется, я не могу заставить библиотеку проводов работать.. или я не думаю, что это.. Я вижу тактовой сигнал на B6, но нет активности от B9 (SDL)...


Итак, я использую библиотеку I2C и эту функцию, чтобы поговорить с кодеком по I2C: void writecsl(uint8 reg, uint8 data) { /* all i2c transactions send and receive arrays of i2c_msg objects */ i2c_msg msgs[1]; // we dont do any bursting here, so we only need one i2c_msg object uint8 msg_data[2]= {reg,data}; //msg_data = {reg,data}; msgs[0].addr = 0x94; msgs[0].flags = 0; // write msgs[0].length = 2; msgs[0].data = msg_data; i2c_master_xfer(I2C1, msgs, 1,5); }

Rogerclark
Пт 15 мая 2015 г., 22:33
Мубас

Похоже, библиотеки E.G Wire не была перенесена в F4 командой Aeroquad (который сделал порт из оригинальной/старой версии Libmaple)

Я думаю, что ваш лучший вариант - просто скопировать библиотеку проводов из F103 и сделать папку библиотек в папке STM32F4.

Это программное обеспечение i2c, так что будет работать для F4. Он использует цикл синхронизации для управления скоростью.

Если вы посмотрите в проволоку.час

Есть макрос, который предназначен для цикла для задержки

И скорость определяется soft_standard или soft_fast

По умолчанию используется Soft Fast, поэтому просто положите туда 100, и попробуйте.

Однако, если у вас нет масштаба, будет немного сложно работать, положить скорость.
Но я оцениваю, что 50 на доске 168 МГц должно быть менее 100 кГц,

Эн.G 16 составляет 100 кГц при 72 МГц
Так

168/72 x 16 = 37, а затем позволив другим инструкциям быть быстрее, я бы попробовал подсчет 50
#define SOFT_STANDARD 16 #define SOFT_FAST 0 //#define I2C_DELAY(x) {uint32 time=micros(); while(time>(micros()+x));} #define I2C_DELAY(x) do{for(int i=0;i

Мубас
Сб 16 мая 2015 г., 2:28
О, блестящий!
Библиотека, которую вы предложили, дает результаты на моем осциллографе. :)
Я думаю, что я там на полпути.
Еще одна вещь, которая меня беспокоит, - это то, почему я не могу отправить что -либо на SPI (i2s) MOSI, которую я вижу в своей области.
Я вижу все остальные сигналы (SCK, WS, MCLK), но ничего на PC12, который является PIN -код MOSI.
Я попробовал SPI_TX и даже написал непосредственно в регистр DR, но без результатов, когда I2S настроен.
Если я настраиваю обычную SPI, то все в порядке, и я могу отправить что -нибудь на MOSI....

Rogerclark
Сб 16 мая 2015 г. 5:53 утра
Мубас

Вы имеете в виду, что пытаетесь использовать SPI, а также i2s или вы имеете в виду, что один из сигналов i2s не работает.?

В любом случае, единственное, что я могу предложить, это посмотреть на настройку регистра для SPI, а также посмотреть на установку RCC, на случай, если что -то в RCC также нужно настроить

Мубас
Сб 16 мая 2015 г., 11:29
да, извините, что не ясно. Я имею в виду сигнал I2S SD (на языке SPI это обычно для меня.) я тоже не использую SPI. Регистры настроены в режиме I2S. На линии SD не появляется сигнал, что бы я ни делал! хм....

Rogerclark
Сб 16 мая 2015 г. 20:42
Мубас

Я думаю, что это может быть вопрос для собственного форума поддержки сообщества STMS. Но я бы не упомянул, что вы используете Arduino IDE и т. Д., Просто подробно опишите, какие регистры у вас есть настройка и т. Д., И посмотрите, смогут ли они сказать вам, что вы пропустили

Мубас
Солнце 17 мая 2015 г., 19:51
Я говорю с кодеком!!! : D

После неудачных попыток заставить Wire для работы, я вернулся к коду Maple Audiocodec от http: // wiki.OpenMusicLabs.com/wiki/audiocodecshield

Код, используемый для связи с элементом управления I2C Codec Wolfson на плате DSP, использует бит с опросом, чтобы проверить на получение данных данных.

Я изменил код, чтобы отразить последовательность запуска и вывести непрерывный тон, используя встроенную функцию звукового сигнала Codec: // i2c start condition char i2cbb_start(void) { if (digitalRead(SDA_PIN) == 0) { // check if data line released return -1; // end with failure if not released } else if (digitalRead(SCL_PIN) == 0) { // check if clock line released return -2; // end with failure if not released } else { // send start condition digitalWrite(SDA_PIN, LOW); // data low mydelay(10); // delay digitalWrite(SCL_PIN, LOW); // clock low mydelay(10); // delay return 1; // set state to success } } // i2c stop condition void i2cbb_stop(void) { digitalWrite(SDA_PIN, LOW); // pull data low mydelay(10); // delay digitalWrite(SCL_PIN, HIGH); // release clock line mydelay(10); // delay digitalWrite(SDA_PIN, HIGH); // release data line mydelay(40); // delay to make sure a new data transfer doesnt occur too quickly } // i2c data send char i2cbb_send(unsigned char data) { // clock out data unsigned char state = 0; // initialize return state unsigned char i; for(i = 8 ; i > 0 ; i--) { digitalWrite(SDA_PIN, (data & (1 << (i - 1)))); mydelay(10); digitalWrite(SCL_PIN, HIGH); mydelay(10); digitalWrite(SCL_PIN, LOW); } // check for ack digitalWrite(SDA_PIN, HIGH); // release line mydelay(10); // wait a bit unsigned char d = 30; // initialize timeout while(digitalRead(SDA_PIN) == 1){ // wait for ack // timeout in case of nack togglePin(LED_PIN); d--; if (d == 0) { state = 2; // set i2c state to nack break; } } // clock the ack or nack digitalWrite(SCL_PIN, HIGH); mydelay(10); digitalWrite(SCL_PIN, LOW); // make sure line is released d = 30; while(digitalRead(SDA_PIN) == 0){ // timeout in case of failure togglePin(LED_PIN); d--; if (d == 0) { state = 3; // set i2c state to no line release break; } } if (state > 1) { // send stop if failure i2cbb_stop(); } else { // set state to success state = 1; } return state; } // full i2c protocol for 3 byte transfer unsigned char i2cbb(unsigned char reg, unsigned char data) { if (i2cbb_start() != 1) { // send start condition return 2; } else if (i2cbb_send(ADDR) != 1) { // send address and write bit return 3; } else if (i2cbb_send(reg) != 1) { // send register to write to return 4; } else if (i2cbb_send(data) != 1) { // write data to register return 5; } else { i2cbb_stop(); // send stop condition return 1; } } // each register retries until success // if communication fails the device will hang void codec_maple_reg_setup(void) { gpio_write_bit(GPIOD,4,1); while (i2cbb(0x02, 0x01) != 1) { // power save registers -> all on delay(10); } while (i2cbb(0x0d, 0x01) != 1) { // digital data format -> 16b spi mode delay(10); } while (i2cbb(0x00, 0x99) != 1) { // left input configure delay(10); } while (i2cbb(0x47, 0x80) != 1) { // right input configure delay(10); } while (i2cbb(0x032, (1<<7)) != 1) { // left headphone configure delay(10); } while (i2cbb(0x32, (0<<7)) != 1) { // right headphone configure delay(10); } while (i2cbb(0x00, 0x00) != 1) { // digital pathway configure delay(10); } while (i2cbb(0x04, 0xaf) != 1) { // analog pathway configure delay(10); } while (i2cbb(0x0d, 0x70) != 1) { // analog pathway configure delay(10); } while (i2cbb(0x05, 0x81) != 1) { // analog pathway configure delay(10); } while (i2cbb(0x06, 0x07) != 1) { // analog pathway configure delay(10); } while (i2cbb(0x0a, 0x00) != 1) { // analog pathway configure delay(10); } while (i2cbb(0x27, 0x00) != 1) { // analog pathway configure delay(10); } while (i2cbb(0x1a| 0x80, 0xaa) != 1) { // analog pathway configure delay(10); } while (i2cbb(0x1f, 0x0f) != 1) { // analog pathway configure delay(10); } //beeps while (i2cbb(0x1c, 0b01101111) != 1) { // analog pathway configure delay(10); } while (i2cbb(0x1d, 00000110) != 1) { // analog pathway configure delay(10); } while (i2cbb(0x1e, 11000000) != 1) { // analog pathway configure delay(10); } while (i2cbb(0x02, 0x9e) != 1) { // analog pathway configure delay(10); } /* #if SAMPLE_RATE == 88 while (i2cbb(0x10, 0xbc) != 1) { // clock select 88.2kHz delay(10); } #elif SAMPLE_RATE == 44 while (i2cbb(0x10, 0xa0) != 1) { // clock select 44.1kHz delay(10); } #elif SAMPLE_RATE == 22 while (i2cbb(0x10, 0xe0) != 1) { // clock select 22.05kHz delay(10); } #elif SAMPLE_RATE == 8 while (i2cbb(0x10, 0xac) != 1) { // clock select 8.018kHz delay(10); } #elif SAMPLE_RATE == 2 while (i2cbb(0x10, 0xce) != 1) { // clock select 2.45kHz delay(10); } #endif */ // while (i2cbb(0x12, 0x01) != 1) { // device enable // delay(10); // } }

Мадиас
Пн 18 мая 2015 г. 8:16 утра
Поздравляю Мубасе! Продолжайте идти! :)
Как вы управляли соединением I2S? Какая библиотека вы используете для этого?

Мубас
Пн 18 мая 2015 г., 9:24
Привет, Мадиас. Я включил 3 новых функции в SPI.C, которые настраивают I2S для 16 -битного стандарта Phillips в режиме Master Xmit.
Контакты для SPI3 настроены в режиме AF как AF_OUTPUT_PP.
//set remap to spi3 gpio_set_af_mode(GPIOA,4,6); gpio_set_af_mode(GPIOC,7,6); gpio_set_af_mode(GPIOC,10,6); gpio_set_af_mode(GPIOC,11,6); gpio_set_af_mode(GPIOC,12,6); //i2s pins gpio_set_mode(GPIOC,10,GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOC,12,GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOC,11,GPIO_INPUT_FLOATING); gpio_set_mode(GPIOC,7,GPIO_AF_OUTPUT_PP); gpio_set_mode(GPIOA,4,GPIO_AF_OUTPUT_PP);

Мубас
Чт 21 мая 2015 г., 9:51
Привет!!! Наконец -то у меня это работает!!!!
Выполнив некоторую отладку в блоге примера на разуме (настройка STM32F4 для аудио) и проверяя значения регистра.
Глядя на регистры, которые я заметил, что I2S не настраивался в режиме Master Transmit.
Я узнал, что это было потому, что в моей функции:
//changed for i2s -06/05/2015 s.scutt (mubase) void i2s_peripheral_16_bit_master(spi_dev *dev) { bb_peri_set_bit(&dev->regs->I2SPR, SPI_I2SPR_MCKOE_BIT, 1); // turn on mclk SPI3_BASE->I2SCFGR |=SPI_I2SCFGR_I2SCFG_MASTER_TX; // master xmit SPI3_BASE->I2SCFGR |= SPI_I2SCFGR_I2SMOD_I2S ; // i2s mode SPI3_BASE->I2SCFGR |= SPI_I2SCFGR_I2SSTD_PHILLIPS; // phillps standard SPI3_BASE->I2SCFGR |= SPI_I2SCFGR_DATLEN_16_BIT; // datalength 16 bit SPI3_BASE->I2SCFGR |= SPI_I2SCFGR_CKPOL_LOW; // cpol low }

Мадиас
Чт 21 мая 2015 г., 21:49
Mubase: Это действительно отличная новость, и я рад за вас!
Я убежден, что когда люди используют больше этих досок i2s, мы возвращаемся к вашим исследованиям о работе i2s! Может, у вас есть время, чтобы положить *.zip -файл всех ваших рабочих кодов в раздел «кодовые снабжения»?

Martinayotte
Пт 22 мая 2015 г. 15:49
@mubase, у вас где -то есть GitHub ? Я хотел бы одолжить вашу папку STMF4 (как предложено Роджером в этой теме: ViewTopic.PHP?F = 39&T = 115#P966) Поскольку GitHub Роджера не является актуальным для F4.
(Или вы также можете предоставить мне молнию, это тоже будет хорошо)
заранее спасибо,

Мубас
Пт 22 мая 2015 г., 19:09
Привет, Мартин. Если вы перейдете в раздел Snapplets на кодовых сайте на форуме, я добавил zip -файл файлов, которые я изменил или добавил. Все остальное то же самое, кроме как я использую библиотеку проводов для F103, которая работает. Посмотрите на кодовые снеклетки.
Позже я подтолкну всю папку F4 в свой GitHub.
Ваше здоровье!
Стив.S (Mubase)

Martinayotte
Пт 22 мая 2015 г., 19:42
Привет, Стив,
На самом деле, я не ищу твою либера. Я взял копию F1, но, кажется, не работает должным образом, так как мой MCP23017 не мигает мои светодиоды.
На самом деле он работает, когда я использую STM32F4XX_DSP_STDPERIPH_LIB_V1.4.0 Платформа.
Что -то, что я видел, это то, что Wire Lib от STM32Duino, похоже, не инициализирует GPIO с подтягиванием, как это делает Stdperiph, мне пришлось добавлять внешне, но все еще не работает. :(
Я думаю, я должен выяснить ...

Мубас
Сб 23 мая 2015 г., 10:57
хорошо. То, что я сделал, это удалил все библиотеки проводов под Libmaple (Wire, Hardwire, Wirebase), создать папку библиотек в папке STM32F4 и поместить там провод.
Затем я использовал опцию «Импорт библиотеки» в IDE, чтобы поднять библиотеки проводов.
Дело в том, что я на самом деле не использовал функции библиотеки проводов, чтобы поговорить с кодеком. Я не мог заставить их работать.
Чтобы поговорить с кодеком, я использовал код из примера кодека STM32 Wolfson, но мне нужно было инициализировать I2C, используя WIRE.начинать().
Я не использовал проволоку.write (), провод.Begintransmission () и т.д...

Martinayotte
Сб 23 мая 2015 г., 21:26
Привет, Стив,
Итак, если вы не используете проволоку, кроме провода.начался (), может быть, вам вообще не нужно ?
В начале у моего дерева не было проводки под папкой STM32F4, поэтому я сделал копию из STM32F1, как вы.
Я подключил свою плату с захватом FX2 на шину и анализировал ее с помощью Pulseview-Sigrok, вывод STM32 что-то, но не декостируемый поток i2c, он не соответствует отправке, это почти чистый мусор.
С STM32F4XX_DSP_STDPERIPH_LIB_V1.4.0, протокол I2C ясен и последователен, но, конечно, это сделано с помощью оборудования STM32, а не программного обеспечения Bitbanging.
Я думаю, мне придется переключиться на другую либера ... :?

Мубас
Солнце 24 мая 2015 г., 5:03
Привет, Мартин. Да это странно. Как вы предложили, я бросил с помощью провода и изменил свой кодек.H файл, чтобы включить настройки PIN -код для штифтов i2c. Все проволоки.Begin () делал, инициализировал булавки как выходные дренажи. Затем установите высокий SDA и SCL. Так что теперь мне это не нужно. Код, который я использую для общения с кодеком, очень хороший. Взглянуть на это! Это из оригинального кода для кодека Wolfson Labs для Leaflabs. :
// I2C Codec setup functions. Code adapted from http://www.openmusiclabs.com/projects/codec-shield/ #define ADDR 0x94 // i2c address and write bit #define SDA_PIN 25 // i2c data line #define SCL_PIN 22 // i2c clock line #define LED_PIN 60 // board led pin void mydelay(unsigned char t) { while((t << 4) > 0) { togglePin(LED_PIN); t--; } } // i2c start condition char i2cbb_start(void) { if (digitalRead(SDA_PIN) == 0) { // check if data line released return -1; // end with failure if not released } else if (digitalRead(SCL_PIN) == 0) { // check if clock line released return -2; // end with failure if not released } else { // send start condition digitalWrite(SDA_PIN, LOW); // data low mydelay(10); // delay digitalWrite(SCL_PIN, LOW); // clock low mydelay(10); // delay return 1; // set state to success } } // i2c stop condition void i2cbb_stop(void) { digitalWrite(SDA_PIN, LOW); // pull data low mydelay(10); // delay digitalWrite(SCL_PIN, HIGH); // release clock line mydelay(10); // delay digitalWrite(SDA_PIN, HIGH); // release data line mydelay(40); // delay to make sure a new data transfer doesnt occur too quickly } // i2c data send char i2cbb_send(unsigned char data) { // clock out data unsigned char state = 0; // initialize return state unsigned char i; for(i = 8 ; i > 0 ; i--) { digitalWrite(SDA_PIN, (data & (1 << (i - 1)))); mydelay(10); digitalWrite(SCL_PIN, HIGH); mydelay(10); digitalWrite(SCL_PIN, LOW); } // check for ack digitalWrite(SDA_PIN, HIGH); // release line mydelay(10); // wait a bit unsigned char d = 30; // initialize timeout while(digitalRead(SDA_PIN) == 1){ // wait for ack // timeout in case of nack togglePin(LED_PIN); d--; if (d == 0) { state = 2; // set i2c state to nack break; } } // clock the ack or nack digitalWrite(SCL_PIN, HIGH); mydelay(10); digitalWrite(SCL_PIN, LOW); // make sure line is released d = 30; while(digitalRead(SDA_PIN) == 0){ // timeout in case of failure togglePin(LED_PIN); d--; if (d == 0) { state = 3; // set i2c state to no line release break; } } if (state > 1) { // send stop if failure i2cbb_stop(); } else { // set state to success state = 1; } return state; } // full i2c protocol for 3 byte transfer unsigned char i2cbb(unsigned char reg, unsigned char data) { if (i2cbb_start() != 1) { // send start condition return 2; } else if (i2cbb_send(ADDR) != 1) { // send address and write bit return 3; } else if (i2cbb_send(reg) != 1) { // send register to write to return 4; } else if (i2cbb_send(data) != 1) { // write data to register return 5; } else { i2cbb_stop(); // send stop condition return 1; } } // each register retries until success // if communication fails the device will hang void codec_reg_setup(void) { gpio_write_bit(GPIOD,4,1); while (i2cbb(0x02, 0x01) != 1) { // power save registers -> all on delay(10); } while (i2cbb(0x00, 0x99) != 1) { // delay(10); } while (i2cbb(0x47, 0x80) != 1) { // inits delay(10); } while (i2cbb(0x0d, 0x03) != 1) { // playback ctrl delay(10); } while (i2cbb(0x32, (1<<7)) != 1) { // vol delay(10); } while (i2cbb(0x32, (0<<7)) != 1) { // vol delay(10); } while (i2cbb(0x00, 0x00) != 1) { // inits delay(10); } while (i2cbb(0x04, 0xaf) != 1) { // power ctl delay(10); } while (i2cbb(0x0d, 0x70) != 1) { delay(10); } while (i2cbb(0x05, 0x81) != 1) { // clocking delay(10); } while (i2cbb(0x06, 0x07) != 1) { delay(10); } while (i2cbb(0x0a, 0x00) != 1) { delay(10); } while (i2cbb(0x27, 0x00) != 1) { delay(10); } while (i2cbb(0x1a| 0x80, 0x0a) != 1) { // both channels on delay(10); } while (i2cbb(0x1f, 0x0f) != 1) { delay(10); } while (i2cbb(0x02, 0x9e) != 1) { delay(10); } }

Martinayotte
Солнце 24 мая 2015 г., 17:36
Привет, Стив !
Я нашел проблему: позор мне, глупая младшая ошибка !
Я просто пересек штифты по умолчанию для SCL и SDA в проводе.h Когда я скопировал файл из папки F1 в F4... : o

Пидж