I2S Пример кода

Вассилис
Пт 28 августа 2015 г., 17:52
Эскиз, который я написал, использует аппаратный интерфейс SPI микроконтроллера STM32. Вы можете подключить DAC I2S Pt8211. Формат входных данных последовательной шины PT8211 - японский или называемый формат LSBJ (наименьший значительный бит).

Пример эскиза дает 16-битное значение Синус волна на правом аудиоканале (PT8211 PIN 8) и Пилот волна на левом аудиоканале (PIN 6).

Используется STM32F103C8T6, но может использоваться на любом STM32 с аппаратным интерфейсом SPI. PT8211 подключен на порту SPI_1.
Пример не включает Два дополнения Математическая операция на двоичных числах, но это то, что можно легко сделать.

Соединения
Pt8211 <--> STM32F103
Ws <--> PA3
BCK <--> ПА5
Дин <--> ПА7
/** I2S example code Description: This I2S example creates a Sine waveform on the RIGHT Audio channel of PT8211 and a Sawtooth waveform on the LEFT Audio channel. This is a very simple how-to-use an external I2S DAC example (DAC = Digital to Analog Converter). Created on 27 Aug 2015 by Vassilis Serasidis email: [email protected] Connections between PT8211 DAC and the STM32F103C8T6 WS <--> PA3 BCK <--> PA5 <--> BOARD_SPI1_SCK_PIN DIN <--> PA7 <--> BOARD_SPI1_MOSI_PIN */ #include #define WS PA3 #define BCK PA5 #define DATA PA7 uint16_t hData, lData; // A full cycle, 16-bit, 2's complement Sine wave lookup table uint16_t sine_table[256] = { 0x0000, 0x0324, 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, 0x18f8, 0x1c0b, 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, 0x30fb, 0x33de, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, 0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, 0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, 0x6a6d, 0x6c24, 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, 0x7641, 0x776c, 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, 0x7d8a, 0x7e1d, 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, 0x7fff, 0x7ff6, 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x0000, 0xfcdc, 0xf9b9, 0xf696, 0xf375, 0xf055, 0xed38, 0xea1e, 0xe708, 0xe3f5, 0xe0e7, 0xdddd, 0xdad8, 0xd7da, 0xd4e1, 0xd1ef, 0xcf05, 0xcc22, 0xc946, 0xc674, 0xc3aa, 0xc0e9, 0xbe32, 0xbb86, 0xb8e4, 0xb64c, 0xb3c1, 0xb141, 0xaecd, 0xac65, 0xaa0b, 0xa7be, 0xa57e, 0xa34c, 0xa129, 0x9f14, 0x9d0e, 0x9b18, 0x9931, 0x975a, 0x9593, 0x93dc, 0x9236, 0x90a1, 0x8f1e, 0x8dab, 0x8c4b, 0x8afc, 0x89bf, 0x8894, 0x877c, 0x8676, 0x8583, 0x84a3, 0x83d7, 0x831d, 0x8276, 0x81e3, 0x8163, 0x80f7, 0x809e, 0x8059, 0x8028, 0x800a, 0x8000, 0x800a, 0x8028, 0x8059, 0x809e, 0x80f7, 0x8163, 0x81e3, 0x8276, 0x831d, 0x83d7, 0x84a3, 0x8583, 0x8676, 0x877c, 0x8894, 0x89bf, 0x8afc, 0x8c4b, 0x8dab, 0x8f1e, 0x90a1, 0x9236, 0x93dc, 0x9593, 0x975a, 0x9931, 0x9b18, 0x9d0e, 0x9f14, 0xa129, 0xa34c, 0xa57e, 0xa7be, 0xaa0b, 0xac65, 0xaecd, 0xb141, 0xb3c1, 0xb64c, 0xb8e4, 0xbb86, 0xbe32, 0xc0e9, 0xc3aa, 0xc674, 0xc946, 0xcc22, 0xcf05, 0xd1ef, 0xd4e1, 0xd7da, 0xdad8, 0xdddd, 0xe0e7, 0xe3f5, 0xe708, 0xea1e, 0xed38, 0xf055, 0xf375, 0xf696, 0xf9b9, 0xfcdc, }; void setup() { Serial.begin(19200); delay(100); Serial.println("-= I2S Example =-"); // Setup SPI 1 SPI.begin(); //Initialize the SPI_1 port. SPI.setBitOrder(MSBFIRST); // Set the SPI_1 bit order SPI.setDataMode(SPI_MODE0); //Set the SPI_2 data mode 0 SPI.setClockDivider(SPI_CLOCK_DIV16); // Slow speed (72 / 16 = 4.5 MHz SPI_1 speed) pinMode(WS, OUTPUT); //Set the Word Select pin (WS) as output. } void loop() { uint16_t i; for (i=0;i<256;i++){ lData = sine_table[i]; hData = sine_table[i]; hData >>= 8; digitalWrite(WS, LOW); //Select RIGHT Audio channel SPI.transfer(hData); // Data bits 15-8 SPI.transfer(lData); // Data bits 7-0 digitalWrite(WS, HIGH); //Select LEFT Audio channel SPI.transfer(i); // SPI.transfer(0); // } }

Мадиас
Пт 28 августа 2015 г., 20:39
Ты отличный, Вассилис!
Большое спасибо!
Я припаивал два еще одного из моих (угадывающихся о 50+ ПК) Pt8211:
Изображение
И результат: это работает!
Может быть, если мы не сможем получить работу "Real i2s", это может быть обходной путь. Просто установив процедуры записи SPI на таймере, некоторые фазовые аккумуляторы для каждого голоса в сочетании с моим USB-MIDI-ячейкой (или обычно серийным MIDI-стандартная LIB работает отлично), а Ready-основной синтезатор :)
Итак, с 2 SPI мы можем получить 4 независимых выходов (для аналоговых фильтров)

Что -то другое: есть ли кто -то, что SPI3 работает на любом устройстве? Я вижу в доске.H файл, что есть некоторые проблемы * Примечание:
* SPI3 не используется из-за PIN 43 (PB4) и NRST Tie Together :(, но
* Оставьте определения, чтобы не загромождать вещи. Это только
* ОК, так как Ret6 Ed. специально рекламируется как бета -доска. */
Это реальная запись (я думаю, нет, потому что все, что мы сделали, мы подписали с нашими именами)
Факт, даже с новым примером библиотеки SPI, SPI3 не будет работать для меня.

Некоторые обновления для реальных i2s:
Я снова объединил некоторые из кода Mubase https: // github.com/mubase/stm32f4-ardui ... M32F4Codec
Но я не получу даже простые мастер -часы из моего MCU....Может быть, есть слишком много различий в регистрации между F4 и F1...

Мадиас
Пт 28 августа 2015 г., 21:10
Итак, пришло время для удовольствия:
С помощью этого эскиза демонстрация модифицирована для воспроизведения Waldorf-формата Waveetable: 64 таблицы, каждая таблица с 128 записями.
Он играет звук «ноль» с разными скоростями.
Веселиться!

Для экспертов:
Я делаю свои волнообразные с помощью программы "Audio-Term" https: // www.YouTube.com/watch?V = CPSJMORS39O
С выводом программы (стандартный WaveTable WaveTable Format Waldorf Blofeld) я написал свой собственный эскиз обработки для перевода и исключения аудиодатте сделал это ;) )

Martinayotte
Сб 29 августа 2015 1:51
ОК, ребята !
Я получил меня в твоей подножке, я только что заказал немного PT8211 на eBay ! :)
Есть так дешево !

victor_pv
Сб 29 августа 2015 г., 5:04
Мадиас написал:Ты отличный, Вассилис!
Большое спасибо!
Я припаивал два еще одного из моих (угадывающихся о 50+ ПК) Pt8211:
Изображение
И результат: это работает!
Может быть, если мы не сможем получить работу "Real i2s", это может быть обходной путь. Просто установив процедуры записи SPI на таймере, некоторые фазовые аккумуляторы для каждого голоса в сочетании с моим USB-MIDI-ячейкой (или обычно серийным MIDI-стандартная LIB работает отлично), а Ready-основной синтезатор :)
Итак, с 2 SPI мы можем получить 4 независимых выходов (для аналоговых фильтров)

Что -то другое: есть ли кто -то, что SPI3 работает на любом устройстве? Я вижу в доске.H файл, что есть некоторые проблемы * Примечание:
* SPI3 не используется из-за PIN 43 (PB4) и NRST Tie Together :(, но
* Оставьте определения, чтобы не загромождать вещи. Это только
* ОК, так как Ret6 Ed. специально рекламируется как бета -доска. */
Это реальная запись (я думаю, нет, потому что все, что мы сделали, мы подписали с нашими именами)
Факт, даже с новым примером библиотеки SPI, SPI3 не будет работать для меня.

Некоторые обновления для реальных i2s:
Я снова объединил некоторые из кода Mubase https: // github.com/mubase/stm32f4-ardui ... M32F4Codec
Но я не получу даже простые мастер -часы из моего MCU....Может быть, есть слишком много различий в регистрации между F4 и F1...

Мадиас
Сб 29 августа 2015 г., 7:44
Спасибо за ваши вклад, Виктор!
SPI3: сейчас работает, см. Тема: ViewTopic.PHP?f = 3&t = 521
Следуя вещам, которые я реализовал:
16 -битная передача данных (помните, что SPI.SetDatasize должна быть последней строкой конфигурации SPI ;) )
Настройка всего звукового двигателя на Timer3 (тот же таймер как dma 1 spi1_tx)
ДМА -материал для меня совершенно новый, я думаю и узнать об этом.... но должно быть легко реализовано в новом коде ниже
/** I2S example code (modified by Matthias Diro: 16bit transfer, setting up on timer3) Description: This I2S example creates a Sine waveform on the RIGHT Audio channel of PT8211 and a Sawtooth waveform on the LEFT Audio channel. This is a very simple how-to-use an external I2S DAC example (DAC = Digital to Analog Converter). Created on 27 Aug 2015 by Vassilis Serasidis email: [email protected] Connections between PT8211 DAC and the STM32F103C8T6 WS <--> PA3 BCK <--> PA5 <--> BOARD_SPI1_SCK_PIN DIN <--> PA7 <--> BOARD_SPI1_MOSI_PIN */ #include #define WS PA3 #define BCK PA5 #define DATA PA7 // A full cycle, 16-bit, 2's complement Sine wave lookup table uint16_t sine_table[256] = { 0x0000, 0x0324, 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, 0x18f8, 0x1c0b, 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, 0x30fb, 0x33de, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, 0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, 0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, 0x6a6d, 0x6c24, 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, 0x7641, 0x776c, 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, 0x7d8a, 0x7e1d, 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, 0x7fff, 0x7ff6, 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x0000, 0xfcdc, 0xf9b9, 0xf696, 0xf375, 0xf055, 0xed38, 0xea1e, 0xe708, 0xe3f5, 0xe0e7, 0xdddd, 0xdad8, 0xd7da, 0xd4e1, 0xd1ef, 0xcf05, 0xcc22, 0xc946, 0xc674, 0xc3aa, 0xc0e9, 0xbe32, 0xbb86, 0xb8e4, 0xb64c, 0xb3c1, 0xb141, 0xaecd, 0xac65, 0xaa0b, 0xa7be, 0xa57e, 0xa34c, 0xa129, 0x9f14, 0x9d0e, 0x9b18, 0x9931, 0x975a, 0x9593, 0x93dc, 0x9236, 0x90a1, 0x8f1e, 0x8dab, 0x8c4b, 0x8afc, 0x89bf, 0x8894, 0x877c, 0x8676, 0x8583, 0x84a3, 0x83d7, 0x831d, 0x8276, 0x81e3, 0x8163, 0x80f7, 0x809e, 0x8059, 0x8028, 0x800a, 0x8000, 0x800a, 0x8028, 0x8059, 0x809e, 0x80f7, 0x8163, 0x81e3, 0x8276, 0x831d, 0x83d7, 0x84a3, 0x8583, 0x8676, 0x877c, 0x8894, 0x89bf, 0x8afc, 0x8c4b, 0x8dab, 0x8f1e, 0x90a1, 0x9236, 0x93dc, 0x9593, 0x975a, 0x9931, 0x9b18, 0x9d0e, 0x9f14, 0xa129, 0xa34c, 0xa57e, 0xa7be, 0xaa0b, 0xac65, 0xaecd, 0xb141, 0xb3c1, 0xb64c, 0xb8e4, 0xbb86, 0xbe32, 0xc0e9, 0xc3aa, 0xc674, 0xc946, 0xcc22, 0xcf05, 0xd1ef, 0xd4e1, 0xd7da, 0xdad8, 0xdddd, 0xe0e7, 0xe3f5, 0xe708, 0xea1e, 0xed38, 0xf055, 0xf375, 0xf696, 0xf9b9, 0xfcdc, }; HardwareTimer timer(3); void setup() { SPI.begin(); //Initialize the SPI_1 port. SPI.setBitOrder(MSBFIRST); // Set the SPI_1 bit order SPI.setDataMode(SPI_MODE0); //Set the SPI_2 data mode 0 SPI.setClockDivider(SPI_CLOCK_DIV4); // speed (72 / 4 = 18 MHz SPI_1 speed) PT8211 up to 20MHZ clock pinMode(WS, OUTPUT); //Set the Word Select pin (WS) as output. SPI.setDataSize (SPI_CR1_DFF); // setting SPI data size to 16Bit // timer3 setup timer.pause(); // Pause the timer while we're configuring it timer.setPeriod(1); // // Set up period in microseconds timer.setChannel1Mode(TIMER_OUTPUT_COMPARE); // Set up an interrupt on channel 1 timer.setCompare(TIMER_CH1, 1); // Interrupt 1 count after each update timer.attachCompare1Interrupt(timer3_irq); timer.refresh(); // Refresh the timer's count, prescale, and overflow timer.resume(); // Start the timer counting } byte counter=0; void loop() { } void timer3_irq(void) { digitalWrite(WS, LOW); //Select RIGHT Audio channel SPI.write(sine_table[counter]); digitalWrite(WS, HIGH); //Select LEFT Audio channel uint16_t ch2=counter<<8; SPI.write(ch2); counter++; }

Мадиас
Сб 29 августа 2015 г., 10:48
Тем временем немного <редактировать> Mario Melody с правильным шагом (я передал его из своего PIC32, так что в оставшемся коде) есть огромные накладные расходы)
Изображение
Как вы можете увидеть 4.25US используются с 21US, поэтому аудио -процедура занимает около 20%, возможно, это может быть лучше с DMA...

victor_pv
Сб 29 августа 2015 12:57
Мадиас написал:Тем временем немного <редактировать> Mario Melody с правильным шагом (я передал его из своего PIC32, так что в оставшемся коде) есть огромные накладные расходы)
Изображение
Как вы можете увидеть 4.25US используются с 21US, поэтому аудио -процедура занимает около 20%, возможно, это может быть лучше с DMA...

Мадиас
Сб 29 августа 2015 г., 22:07
Еще раз спасибо, Виктор. Как я уже сказал, материал DMA неизвестен для меня, поэтому я должен сначала изучить основы DMA.
Нашел хороший учебник для SPI здесь: http: // polplaiconesa.com/turnerials/spi+dma.HTML
Wiki Leaflabs хорошо написан, но без каких -либо примеров (ОК, один пример USART). http: // wiki.Leaflabs.com/index.PHP?title = dma
Оффтопический: (или не такой оффтопический...)
Тем временем я потерпел все мои 10шт-печатные доски для аналоговых фильтра (от грязных дешевых печатных плат) ---> Слишком много ошибок/ошибок (и полного невозможного разделения аналогового переключения) это возвращает меня, по крайней мере, на полгода для моего мастер -проекта. Хорошо, я называю это "кривой обучения Rising Learning". Все, что я знаю, это то, что я больше никогда не буду использовать глупую программу "Fritzing". Я сейчас на Кикаде, и это похоже на действительно альтернативу для орла. (Я не могу использовать бесплатную лицензию Eagle, потому что мне нужно 100x100 и не только 80x100..)
Но есть хорошие новости для себя: вначале я планировал использовать MCU STM32 только для контроля моего синтезатора (TFT, Encoder, ручки, USB-MIDI) и в качестве аудио-подъема MCU A PIC32MX250. Недостаток: две разные территории и методы загрузки в конечном продукте. Тем временем я возьму большую MCU STM32 (RET, Vet) в качестве единственной версии для всего. (2x spi/i2s = 4 ind. 16-битные голосовые выходы, 1x SPI для остального: TFT, Ext. Control DAC Like LT1665,...) Недостаток - отсутствие блока FPU в серии STMF1. Я провел тесты, и в каждом тесте говорится: «Избегайте плавания за каждую стоимость!". Хорошо, я научился использовать фиксированную точку арифметики....Может быть, через один или два года я на STM32F7.

Мадиас
Солнце 30 августа 2015 12:04
Хорошо, забыл немного инфо для Виктора:
На рисунке показывается фиктивная штифт, я установил его высоко на стартовой трансляции и низко на конце. Итак, я получил 20% использования. Это также помогает мне найти правильную частоту настройки: 47,62 кГц в моем примере (вместо 48 кГц..).

victor_pv
Солнце 30 августа 2015 12:17
Мадиас написал:Еще раз спасибо, Виктор. Как я уже сказал, материал DMA неизвестен для меня, поэтому я должен сначала изучить основы DMA.
Нашел хороший учебник для SPI здесь: http: // polplaiconesa.com/turnerials/spi+dma.HTML
Wiki Leaflabs хорошо написан, но без каких -либо примеров (ОК, один пример USART). http: // wiki.Leaflabs.com/index.PHP?title = dma
Оффтопический: (или не такой оффтопический...)
Тем временем я потерпел все мои 10шт-печатные доски для аналоговых фильтра (от грязных дешевых печатных плат) ---> Слишком много ошибок/ошибок (и полного невозможного разделения аналогового переключения) это возвращает меня, по крайней мере, на полгода для моего мастер -проекта. Хорошо, я называю это "кривой обучения Rising Learning". Все, что я знаю, это то, что я больше никогда не буду использовать глупую программу "Fritzing". Я сейчас на Кикаде, и это похоже на действительно альтернативу для орла. (Я не могу использовать бесплатную лицензию Eagle, потому что мне нужно 100x100 и не только 80x100..)
Но есть хорошие новости для себя: вначале я планировал использовать MCU STM32 только для контроля моего синтезатора (TFT, Encoder, ручки, USB-MIDI) и в качестве аудио-подъема MCU A PIC32MX250. Недостаток: две разные территории и методы загрузки в конечном продукте. Тем временем я возьму большую MCU STM32 (RET, Vet) в качестве единственной версии для всего. (2x spi/i2s = 4 ind. 16-битные голосовые выходы, 1x SPI для остального: TFT, Ext. контроль ЦАП,...) Недостаток - отсутствие блока FPU в серии STMF1. Я провел тесты, и в каждом тесте говорится: «Избегайте плавания за каждую стоимость!". Хорошо, я научился использовать фиксированную точку арифметики....Может быть, через один или два года я на STM32F7.

Мадиас
Солнце 30 августа 2015 г. 15:00
Виктор, я попытаюсь подойти к DMA позже на этой неделе.
Тем временем я действительно люблю Кикад после того, как знал ловушки, это очень элегантно разработать схему и печатную плату.
Это моя первая часть нового модуля аналогового фильтра в качестве 3D рендеринга (не все компоненты установлены как 3D-модели, нет времени для него).
3D-модельер-не только привлекательная вещь, но это действительно полезно найти некоторые незначительные «тактичные» ошибки.
Изображение

victor_pv
Солнце 30 августа 2015 г., 17:22
Мадиас написал:Виктор, я попытаюсь подойти к DMA позже на этой неделе.
Тем временем я действительно люблю Кикад после того, как знал ловушки, это очень элегантно разработать схему и печатную плату.
Это моя первая часть нового модуля аналогового фильтра в качестве 3D рендеринга (не все компоненты установлены как 3D-модели, нет времени для него).
3D-модельер-не только привлекательная вещь, но это действительно полезно найти некоторые незначительные «тактичные» ошибки.
Изображение

Martinayotte
Солнце 30 августа 2015 г., 17:26
Я тоже использую Кикад, но я никогда не пробовал 3D рендера.
Лично мне нравится Кикад больше, чем орел, так как следы печатной платы отделены от символов детали, легче управлять деталями с несколькими следами.

Sheepdoll
Солнце 30 августа 2015 г., 21:41
Я использую Кикад с 2012 года или около того. Это был 3D -модельер, который продал меня.

Я также потратил время, чтобы написать кучу (почтовых) сценариев, которые преобразовали мои многолетние проекты ExpressPCB в Кикад. Я даже построил несколько 3D -модели карт MicroSD, которые использовал. ExpressPCB шифрует файлы дизайна, хотя они продают Герберса за 50 баксов.

Затем Кикад изменил внутреннюю структуру файла и переместил библиотеки на GIT. Я скачал недавнюю ночную сборку для Mac, нужно будет выполнить некоторую работу по восстановлению моих библиотек, чтобы он мог снова найти 3D -модели. Новый 3D Viewer намного приятнее и позволяет лучше рендеринг.

Возможность перемещать доски между ExpressPCB и Кикадом действительно хороша. Хотя это может быть немного дорого, мне нравится быстрый поворот и легкий встроенный в инструмент, который предлагает ExpressPCB, или один. (которые обычно составляют 3 отключения)

Martinayotte
Солнце 30 августа 2015 г., 21:44
Для тех, кто все еще использует орла, но хочет прыгнуть в Кикад, здесь сайт, который обеспечивает онлайн -конверсию либеров:

http: // kicad.jp/eagle2kicad/

Мадиас
Солнце 30 августа 2015 г., 22:21
Хороший найденный, Martinayotte!
Потому что я почти использую «экзотические» IC, где нет либеров или следов в Кикаде (например, SSM2164, как V2164, V2164....Хорошо, этот я нашел :) )
Sheepdoll: Я также использую Kicad на OSX, с ночной загрузкой ясной «нет боли» (только одна или две настройки, чтобы сделать)
Только большой недостаток: клонирование куча компонентов (например, подключители, которые вы используете 5x, 10x...) невозможно (я имею в виду с обновлениями/синхронизированными сетевыми списками, поэтому у вас есть схема и как - уже отсортированы - следы вашей печатной платы). Был сценарий для старой версии, но он не будет работать с более новыми сборками.
Относительная новая функция в Кикаде:
толкать и ссорить
https: // www.YouTube.com/watch?v = fdfz_c5mbrc

Мадиас
Чт, 03 сентября 2015 г., 16:07
Последние новости:

Получил "Real" i2s, по крайней мере, на SPI3 Working

-- -подробности скоро! ---

Rogerclark
Чт, 03 сентября 2015 г., 21:12
Отличный...

Спасибо, Матиас.

Мадиас
Чт, 03 сентября 2015 г., 21:39
Хорошо, детали не придут слишком рано.
Это была огромная попытка заставить его работать, в основном «Mubase» версия для STM32F4 помогла мне, и справочное руководство STM32F1.
Я не уверен, как реализовать это лучше всего:
Есть много изменений в SPI.H и SPI.С (уровень ядра, нижний случай, а не SPI.Библиотека C/H) Добавление недостающих конфигурационных битов и функций. Так что я должен быть чувствительным, чтобы не разбить их. Может быть, RCC.H также нуждаются в некоторых записях (должны это подтвердить).
Следующее рассмотрение - поднять материал в "SPI.C "(верхний регистрация - библиотека) или в отдельный" i2s.c "файл.
В настоящее время я работаю над рутиной прерывания (Статус: Работа). Большое различное между SPI-DAC и I2S-DAC заключается в том, что устройство i2S нужно часто питаться данными, даже если значение не изменилось.
Здесь у меня есть общий вопрос с прерывами:
Часть моего кода:
В настройке: spi_irq_enable(SPI3, SPI_TXE_INTERRUPT);

victor_pv
Чт, 03 сентября 2015 г., 22:45
Мадиас написал:Хорошо, детали не придут слишком рано.
Это была огромная попытка заставить его работать, в основном «Mubase» версия для STM32F4 помогла мне, и справочное руководство STM32F1.
Я не уверен, как реализовать это лучше всего:
Есть много изменений в SPI.H и SPI.С (уровень ядра, нижний случай, а не SPI.Библиотека C/H) Добавление недостающих конфигурационных битов и функций. Так что я должен быть чувствительным, чтобы не разбить их. Может быть, RCC.H также нуждаются в некоторых записях (должны это подтвердить).
Следующее рассмотрение - поднять материал в "SPI.C "(верхний регистрация - библиотека) или в отдельный" i2s.c "файл.
В настоящее время я работаю над рутиной прерывания (Статус: Работа). Большое различное между SPI-DAC и I2S-DAC заключается в том, что устройство i2S нужно часто питаться данными, даже если значение не изменилось.
Здесь у меня есть общий вопрос с прерывами:
Часть моего кода:
В настройке: spi_irq_enable(SPI3, SPI_TXE_INTERRUPT);

Мадиас
Пт, сентябрь 04, 2015 7:09
Дорогой Виктор,

еще раз спасибо!
ОК: Я удалил включить/отключить IRQ в самом IRQ, и он работает (не знаю, в чем проблема была в предыдущем из моего кода, поэтому я настраивал это включение/отключение IRQ - на PIC32 это необходимый шаг)
Кроме того, ваш небольшой код IRQ работает, как и ожидалось! void __irq_spi3(void) { SPI3_BASE->DR=(transferdata[flip]); flip=(flip + 1) % buffer_size; }

Мадиас
Пт
Хорошо, теперь я пытаюсь заставить DMA работать.
Короче говоря, блок -схема:
I2s в настроенной на правильную частоту для ЦАП, поэтому всякий раз, когда буфер SPI TX пуст, должно быть написано новое значение. Значение - это массив TransferDataa [2]: первым является значение левого канала, вторым является правый канал.
В своем рабочем примере я настроил IRQ, который запускается, когда буфер SPI пуст. Таким образом, он отправляет каждый раз влево и каждый нечетный раз, как правильное значение канала.
Я пытался понять код DMA в SPI.C, пример ILI9341 и, кроме того, не принадлежат STM32DUIN.
Итак, мой код инициации для DMA: // DMA ******** dma_init(DMA2); spi_tx_dma_enable(SPI3); // 6. Setup a DMA transfer (for both TX and RX). If we only want // write (TX) // Parameters: // - DMA // - DMA channel // - Memory register for SPI // - The size of the SPI memory register // - The buffer we want to copy things to or transmit things from // - The unit size of that buffer // - Flags (see the Maple DMA Wiki page for more info in flags) dma_setup_transfer(DMA2, DMA_CH2, &SPI3->regs->DR, DMA_SIZE_16BITS, transferdataa, DMA_SIZE_16BITS, (DMA_MINC_MODE | DMA_TRNS_CMPLT | DMA_TRNS_ERR)); // 7. Attach an interrupt to the transfer. Note that we need to add // the interrupt flag in step 6 (DMA_TRNS_CMPLT and DMA_TRNS_ERR). // Also, we only attach it for one of the transfers since they are // going to finish at the same time because they are in sync. dma_attach_interrupt(DMA2, DMA_CH2, DMAEvent); //8. Setup the priority for the DMA transfer. dma_set_priority(DMA2, DMA_CH2, DMA_PRIORITY_VERY_HIGH); // dma_set_priority(DMA1, DMA_CH3, DMA_PRIORITY_VERY_HIGH); // 9. Setup the number of bytes that we are going to transfer. dma_set_num_transfers(DMA2, DMA_CH2, 2); //dma_set_num_transfers(DMA1, DMA_CH3, 512); // 10. Enable DMA to start transmitting. When the transmission // finishes the event will be triggered and we will jump to // function DMAEvent. // dma_enable(DMA2, DMA_CH2); spi_irq_enable(SPI3, SPI_TXE_INTERRUPT);

Мадиас
Пт, сентябрь 04, 2015 18:14
Хорошо, может быть, я даю краткий ответ себе (взято из библиотек TFT):
SPI IRQ должен быть установлен с такими кодом, как «DMASEND» (от SPI.в) uint8 SPIClass::dmaSend(uint8 *transmitBuf, uint16 length, bool minc) { if (length == 0) return 0; uint32 flags = ((DMA_MINC_MODE * minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); uint8 b; dma1_ch3_Active=true; dma_init(DMA1); dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); // TX spi_tx_dma_enable(SPI1); dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_8BITS, transmitBuf, DMA_SIZE_8BITS, flags);// Transmit buffer DMA dma_set_num_transfers(DMA1, DMA_CH3, length); dma_enable(DMA1, DMA_CH3);// enable transmit while (dma1_ch3_Active); while (spi_is_rx_nonempty(this->spi_d) == 0); // "4. Wait until RXNE=1 ..." b = spi_rx_reg(this->spi_d); // "... and read the last received data." while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." dma_disable(DMA1, DMA_CH3); spi_tx_dma_disable(SPI1); return b; }

Rogerclark
Пт
Большую часть времени, взятого для отправки одного байта через SPI, - это время, проведенное в 2 петлях, которые ожидают, пока SPI закончится.

Если вы знаете, что ваш код не будет отправлять больше данных, пока SPI все еще будет передаваться, лучше не ждать завершения вообще.

Еще один вариант - проверить / дождаться завершения последней передачи, прежде чем отправить байт в SPI, так как это может быть более эффективным в некоторых случаях.

В качестве альтернативы для DMA можно использовать обратный вызов. Тогда вы можете выбрать, делать что -нибудь в полном обратном вызове SPI DMA или, возможно, ничего не делать.

Я знаю, что продолжаю упоминать полные обратные вызовы DMA, но я не думаю, что кто -то еще, кроме меня, будет их использовать ;-)

Мадиас
Пт
Роджер:
В SPI.C: /* Roger Clark and Victor Perez, 2015 * Performs a DMA SPI send using a TX buffer. * On exit TX buffer is not modified. * Still in progress. */

Rogerclark
Пт
Привет, Матиас

Я мало что знаю об этом, но я думаю, что когда буфер TX переходит от 1 байта к пустому, тогда запрос IRQ отправляется.

После этого, в то время как буфер TX пуст, не должно быть больше IRQ ?

Но мне нужно будет подробно рассмотреть и, возможно, прочитать руководство, чтобы полностью понять.

victor_pv
Пт, сентябрь 04, 2015 22:23
Мадиас написал:Хорошо, может быть, я даю краткий ответ себе (взято из библиотек TFT):
SPI IRQ должен быть установлен с такими кодом, как «DMASEND» (от SPI.в) uint8 SPIClass::dmaSend(uint8 *transmitBuf, uint16 length, bool minc) { if (length == 0) return 0; uint32 flags = ((DMA_MINC_MODE * minc) | DMA_FROM_MEM | DMA_TRNS_CMPLT); uint8 b; dma1_ch3_Active=true; dma_init(DMA1); dma_attach_interrupt(DMA1, DMA_CH3, &SPIClass::DMA1_CH3_Event); // TX spi_tx_dma_enable(SPI1); dma_setup_transfer(DMA1, DMA_CH3, &SPI1->regs->DR, DMA_SIZE_8BITS, transmitBuf, DMA_SIZE_8BITS, flags);// Transmit buffer DMA dma_set_num_transfers(DMA1, DMA_CH3, length); dma_enable(DMA1, DMA_CH3);// enable transmit while (dma1_ch3_Active); while (spi_is_rx_nonempty(this->spi_d) == 0); // "4. Wait until RXNE=1 ..." b = spi_rx_reg(this->spi_d); // "... and read the last received data." while (spi_is_tx_empty(this->spi_d) == 0); // "5. Wait until TXE=1 ..." while (spi_is_busy(this->spi_d) != 0); // "... and then wait until BSY=0 before disabling the SPI." dma_disable(DMA1, DMA_CH3); spi_tx_dma_disable(SPI1); return b; }

Мадиас
Пт
Спасибо Виктор и Роджер!
Я получил DMA работать (не с кодом оптимизирующих вещей из поставщика победителей выше), время измерения между светодиодом и от него намного длиннее, чем в моем без-dma-method. Итак, я работаю над этим.
По вопросу открыто (в начале моего поста DMA):
Стоит ли установить Spi-Empty-Buffer-IRQ, и этот IRQ-место для всех вещей DMA? (Я сделал это так с менее хорошими результатами).

victor_pv
Пт
Мадиас написал:Спасибо Виктор и Роджер!
Я получил DMA работать (не с кодом оптимизирующих вещей из поставщика победителей выше), время измерения между светодиодом и от него намного длиннее, чем в моем без-dma-method. Итак, я работаю над этим.
По вопросу открыто (в начале моего поста DMA):
Стоит ли установить Spi-Empty-Buffer-IRQ, и этот IRQ-место для всех вещей DMA? (Я сделал это так с менее хорошими результатами).

victor_pv
Сб 05 сентября 2015 г. 12:09
Мадиас написал:Роджер:
В SPI.C: /* Roger Clark and Victor Perez, 2015 * Performs a DMA SPI send using a TX buffer. * On exit TX buffer is not modified. * Still in progress. */

Мадиас
Сб 05 сентября 2015 г., 13:22
Просто быстрое воспроизведение, и вот большое спасибо!
DMA работает с подсказками Victor! (Оба канала: синус слева, увидели вправо)

Вот результат от логического анализатора (приведенный в IRQ Begin, вывел на END END):
Изображение
Неплохо, не так ли? :)
редактировать: Я думаю, что самое наиболее используемое время для этого - включить/выключить светодиод ;)

Мадиас
Сб 05 сентября 2015 13:35
Вот код (тест) (только материал, связанный с DMA):

Перед настройкой: #define buffer_size 2 uint16_t i2s_buffer[2]; uint16_t i2s_buffer_bottom[buffer_size]; uint16_t *i2s_buffer_top_half = &i2s_buffer[buffer_size/2];

victor_pv
Сб 05 сентября 2015 14:02
Мадиас написал:Вот код (тест) (только материал, связанный с DMA):

Перед настройкой: #define buffer_size 2 uint16_t i2s_buffer[2]; uint16_t i2s_buffer_bottom[buffer_size]; uint16_t *i2s_buffer_top_half = &i2s_buffer[buffer_size/2];

Мадиас
Солнце 06, 2015 7:08 утра
Дорогой Виктор,
Извините за то, что все испортило!
Теперь он почти идеально подходит, только if ((dma_get_isr_bits( DMA2, DMA_CH2) & 0x2)==1) { i2s_buffer_top_half[0]= i2s_buffer_bottom[0]+1; } else if ((dma_get_isr_bits( DMA2, DMA_CH2) & 0x4)==1) { i2s_buffer_bottom[0]=i2s_buffer_top_half[0]+1; }

victor_pv
Солнце 06 сентября 2015 14:39
Мадиас написал:Дорогой Виктор,
Извините за то, что все испортило!
Теперь он почти идеально подходит, только if ((dma_get_isr_bits( DMA2, DMA_CH2) & 0x2)==1) { i2s_buffer_top_half[0]= i2s_buffer_bottom[0]+1; } else if ((dma_get_isr_bits( DMA2, DMA_CH2) & 0x4)==1) { i2s_buffer_bottom[0]=i2s_buffer_top_half[0]+1; }

Мадиас
Солнце 06, 2015, 16:55
Виктор,
В любом случае, я получил это с: void DMAEvent() { //digitalWrite(LED,1); if (dma_get_isr_bits( DMA2, DMA_CH2)==3) { digitalWrite(LED, 1); i2s_buffer[0] = sine[wavecounter1] << 3; // half transfer (10) + complete (01) wavecounter1++; } else { i2s_buffer[1] = wavecounter2 << 8; wavecounter2++; digitalWrite(LED,0); }

Мадиас
Солнце 06 сентября 2015 г., 17:04
Завтра я подумаю о библиотеке I2S. По моему мнению, лучше использовать отдельную библиотеку и не добавлять материал в SPI.в
Многие кодовые блоки почти одинаковы (настройка PIN -кода), но с некоторыми различиями:
Итак, INION I2S - это что -то вроде этого (пример для SPI3): rcc_clk_enable(RCC_SPI3); timer_set_mode(TIMER6, 2, TIMER_DISABLED); // disable every PWM pin! gpio_set_mode(GPIOA, 15 , GPIO_AF_OUTPUT_PP); // SS pin = WS gpio_set_mode(GPIOB, 3 , GPIO_AF_OUTPUT_PP); // sck gpio_set_mode(GPIOB, 4 , GPIO_INPUT_FLOATING); // miso =DO gpio_set_mode(GPIOB, 5 , GPIO_AF_OUTPUT_PP); // mosi = DI gpio_set_mode(GPIOC, 7 , GPIO_AF_OUTPUT_PP); // bck if needed! //SPI3_BASE->I2SPR |= (0x201); // freq setup 44khz, bit 9 = master clock on/off SPI3_BASE->I2SPR |= 0b0000000100010111; // 48khz master clock off, real: 47.9 khz // SPI3_BASE->I2SPR |= 0b0000000100011000; // 44.1khz real 42.44 khz!!! master clock off i2s_peripheral_16_bit_masterx(SPI3); // audio stream setup ---> see below i2s_init(SPI3); // clock usw... ---> not the same as spi_init(SP3)!!!!! void i2s_peripheral_16_bit_masterx(spi_dev *dev) { bb_peri_set_bit(&dev->regs->CR2, SPI_CR2_TXDMAEN_BIT, 1); // DMA enable // bb_peri_set_bit(&dev->regs->I2SPR, SPI_I2SPR_MCKOE_BIT, 1); // turn on_/off 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_MSB; // format --> see "formats" SPI3_BASE->I2SCFGR |= SPI_I2SCFGR_DATLEN_16_BIT; // datalength 16 bit SPI3_BASE->I2SCFGR |= SPI_I2SCFGR_CKPOL_LOW; // cpol low } /* formats SPI_I2SCFGR_I2SSTD (0x3 << 4) #define SPI_I2SCFGR_I2SSTD_PHILLIPS (0x0 << 4) #define SPI_I2SCFGR_I2SSTD_MSB (0x1 << 4) #define SPI_I2SCFGR_I2SSTD_LSB (0x2 << 4) #define SPI_I2SCFGR_I2SSTD_PCM (0x3 << 4) */

Rogerclark
Солнце 06 сентября 2015 г., 21:02
Я предпочитаю отдельную библиотеку,..... Даже если это 80% копия SPI ;-)

victor_pv
Солнце 06 сентября 2015 г. 22:06
Я бы подумал, что отдельная библиотека тоже будет лучшей, так как порт может работать как i2s или SPI, но было бы трудно использовать один и тот же порт SPI как для периферийного устройства SPI, так и для I2S без необходимости менять слишком много реестр поменять режим на каждой передаче. Может быть возможным, но не легким, поэтому я могу только представить, что люди используют SPI1 и/или 2 для периферийных устройств SPI, и 3 и/или 3 для периферийных устройств i2s.

Единственное, что, вероятно, было бы хорошо установить класс, который может создать другой объект для SPI2 и SPI3, чтобы пользователь мог использовать оба для i2s, если это необходимо.
Я могу помочь кодировать подпрограмму передачи DMA, в которую вы можете предоставить имя функции обратного вызова, чтобы вызовать в качестве DMA ISR, поэтому она не будет блокировать, так как он сгущается в коде SPI.

Таким образом, вы можете использовать новую библиотеку для всех материалов i2S, даже установив передачу DMA и позвольте ISR пополнить буфер для эскиза.

Мадиас
Пн сентября 07, 2015 7:18 утра
Я попробую «клонировать» SPI.C Библиотека только с настройками i2s.
Мне нужны еще несколько идей о сценариях I2S:
Использование в качестве синтезатора (манипулирование звуком в реальном времени), как и я.
Используя его в качестве сверхвысокого проигрывателя WAV (SD-карта ---> DMA ---> I2s)
Может быть, аудиозапись (требуется устройство i2s с аудио входом и выходом) - Проблема: неточная скорость отбора проб.
Эффективная доска: аудио в ---> Обработка (Flanger, задержка...) ---> аудио. (довольно бесполезно без ФПУ)
Большой вопрос: можно использовать программное обеспечение MP3, OGG, FLAC DE- /Encoder на STM32F1? (ОЗУ, скорость...)

Но я думаю, что все сценарии имеют одну общую черту:
Нет необходимости в "i2s.Передача "или" i2s.Отправить ", потому что I2S нуждается в постоянном решении потока данных. Так что либо обработка с DMA, либо с SPI.буфер.пустой IRQ (почему мы должны сделать это, если у нас есть DMA? ;) ).
Таким образом, с игроком Audio *WAV мы можем использовать большой буфер (512B - 1K Chunk Size) для «в реальном времени» нам нужно меньше (задержка)

Rogerclark
Пн сентября 07, 2015 7:23 утра
Возможно, отправьте премьер -министр в @mubase и @vasillis, так как я думаю, что это остальные 2 человека, интересующихся i2s

И спросите, что им понадобится / нравится в библиотеке I2S

Мадиас
Пн сентября 07, 2015 11:38
Хорошо, Mubase использует только платы F4 (они разные с i2s), Василлис был бы человеком.
Тем временем я снял SPI.H / SPI.C код к минимуму, поэтому необходимо лишь несколько изменений.

Но у меня большая проблема с пониманием:
Я использую функцию для настройки правильного устройства SPI (I2S), поэтому SPI2 или SPI3: void i2s_peripheral_16_bit_masterx(spi_dev *dev) {

Мадиас
Пн сентября 07, 2015 12:11
ОК, ответьте себе (пожалуйста, проверьте!)
Передача: SPI3_BASE->I2SCFGR |= SPI_I2SCFGR_I2SCFG_MASTER_TX;

Вассилис
Пн, сентябрь 07, 2015 12:46
Мадиас написал:...Василлис был бы человеком.

Мадиас
Рн. Сен. 07, 2015 12:59
Хорошо...... Давайте начнем с синего отпечатка для

I2s.начинать:

Нам нужно не менее 7 значений!
Это значения:
Значение № 1 = устройство SPI (SPI2 или SPI3)
Значение № 2 = I2S Режим конфигурации: SLAV
Значение № 3 = I2S Стандартный выбор (Format): I2S Philips Standard, MSB Оправданный стандарт (слева оправданный), LSB Оправданный стандарт (справа оправдано), Стандарт PCM
Значение № 4 = полярность стационарного состояния, стационарное состояние I2S - низкий уровень, устойчивое состояние
Значение № 5 = Длина данных, которая должна быть передана: 16-битная длина данных, 24-разрядная длина данных, 32-разрядная длина данных, не разрешенная
Значение № 6 = длина канала (количество бит на аудиоканал): 16-разрядная ширина, 32-разрядная ширина (только необходимо, если длина данных = 16 бит)
Значение № 7 = Регистр PRESCALE с MCK в ON OR ONCE *)

Для значения № 7 я напишу некоторые стандартные определения, структура:
Bit9: мастер -часы на/
Bit10: странно или даже
Бит 0-7: прокалер
У меня есть таблица для этого, поэтому я бы определил только некоторые стандартные частоты, которые они работают, например, 44.1 кГц, 48 кГц, по 96 кГц каждый с мастером включения/выключения

Другие значения (очень специфические)
Синхронизация кадров PCM: синхронизация коротких кадров, 1: Синхронизация длинной кадры

так что функция начала i2s могла бы быть: I2S_begin(spi_device, mode, format, clock_p, data_l, channel_l, prescale)

Мадиас
Пн сентября 07, 2015 13:09
Вассилис написал:Мадиас написал:...Василлис был бы человеком.

Мадиас
Пн, сентябрь 07, 2015 13:22
Осталось три вещи:
1) Пожалуйста, рассмотрите справочное руководство ST ---> https: // www.Google.AT/URL?SA = T&rct = j&Q = ... kfqcsbmbaw
Глава 25 "SPI"

2) Все #Defines для i2s можно найти в "SPI.H "(большой с 18 КБ)

3) Странное поведение MCK: в моем PIC32 в режиме i2S мастер -часы всегда работают. Это хорошо, если вы синхронизируете больше устройств i2S. На STM32 MCK находится только при передаче данных. (подтверждено: см. Последний пост ---> https: // my.ул.com/public/ste2ecommuniti ... Просмотры = 2585 )

victor_pv
Пн сентября 07, 2015 13:23
Мадиас написал:Хорошо...... Давайте начнем с синего отпечатка для

I2s.начинать:

Нам нужно не менее 7 значений!
Это значения:
Значение № 1 = устройство SPI (SPI2 или SPI3)
Значение № 2 = I2S Режим конфигурации: SLAV
Значение № 3 = I2S Стандартный выбор (Format): I2S Philips Standard, MSB Оправданный стандарт (слева оправданный), LSB Оправданный стандарт (справа оправдано), Стандарт PCM
Значение № 4 = полярность стационарного состояния, стационарное состояние I2S - низкий уровень, устойчивое состояние
Значение № 5 = Длина данных, которая должна быть передана: 16-битная длина данных, 24-разрядная длина данных, 32-разрядная длина данных, не разрешенная
Значение № 6 = длина канала (количество бит на аудиоканал): 16-разрядная ширина, 32-разрядная ширина (только необходимо, если длина данных = 16 бит)
Значение № 7 = Регистр PRESCALE с MCK в ON OR ONCE *)

Для значения № 7 я напишу некоторые стандартные определения, структура:
Bit9: мастер -часы на/
Bit10: странно или даже
Бит 0-7: прокалер
У меня есть таблица для этого, поэтому я бы определил только некоторые стандартные частоты, которые они работают, например, 44.1 кГц, 48 кГц, по 96 кГц каждый с мастером включения/выключения

Другие значения (очень специфические)
Синхронизация кадров PCM: синхронизация коротких кадров, 1: Синхронизация длинной кадры

так что функция начала i2s могла бы быть: I2S_begin(spi_device, mode, format, clock_p, data_l, channel_l, prescale)

Мадиас
Пн, сентябрь 07, 2015 13:34
Я бы установил все материалы DMA, включая DMA, в еще что -то еще, так что
bb_peri_set_bit (&девчонка->регс->Cr2, spi_cr2_txdmaen_bit, 1); // dma включить
не должно быть там.
Да, извините, этот пример из моего тестового кода, я забыл устранить линию DMA.

Педаль эффекта и обучение: я знаю это: настоящий 12-битный хрустящий звук! :) Еще одна вещь: для несложных эффектов, таких как простая задержка, у вас не будет достаточно оперативной памяти. Я читал, что библиотека CMSIS DSP работает не только на M4, но и на M3...Может быть, хорошая отправная точка для его переноса (я знаю, что на Energia/Ti - Tiva кто -нибудь перенес это)
редактировать: Нашел это! https: // github.com/sumotoy/cmsis-librar ... A-LM4F-MCU

victor_pv
Пн сентября 07, 2015 14:00
Мадиас написал:Я бы установил все материалы DMA, включая DMA, в еще что -то еще, так что
bb_peri_set_bit (&девчонка->регс->Cr2, spi_cr2_txdmaen_bit, 1); // dma включить
не должно быть там.
Да, извините, этот пример из моего тестового кода, я забыл устранить линию DMA.

Педаль эффекта и обучение: я знаю это: настоящий 12-битный хрустящий звук! :) Еще одна вещь: для несложных эффектов, таких как простая задержка, у вас не будет достаточно оперативной памяти. Я читал, что библиотека CMSIS DSP работает не только на M4, но и на M3...Может быть, хорошая отправная точка для его переноса (я знаю, что на Energia/Ti - Tiva кто -нибудь перенес это)
редактировать: Нашел это! https: // github.com/sumotoy/cmsis-librar ... A-LM4F-MCU

Вассилис
Пн сентября 07, 2015 15:36
Мадиас написал:Вассилис написал:Мадиас написал:...Василлис был бы человеком.

Мадиас
Пн сентября 07, 2015, 15:52
Соединения одинаковы, но на плате RET6 (не должны быть разными).
Что на левом канале?
редактировать: синус на левом канале! Я испортил свои проводки...

Вассилис
Пн сентября 07, 2015, 15:55
Я комментирую строку 128 и 134, и это сработало: if (dma_get_isr_bits( DMA2, DMA_CH2) == 3)

Мадиас
Пн сентября 07, 2015, 15:58
Да, но
i2s_buffer [0] = левый канал и
i2s_buffer [1] = правый канал
С ускорительностью if (dma_get_isr_bits (dma2, dma_ch2) == 3) вы ускоряете правый/левый материал! :)

Вассилис
Пн сентября 07, 2015, 16:01
Отключив эти линии, я увидел синусоидальную волну на левом канале и одновременно пилотую волну на правом канале.

Мадиас
Пн, сентябрь 07, 2015, 16:08
Да, но вы заполняете буфер [0] и [1] каждый раз, так что дважды в этом понадобится.
Я установил буфер с [2] и «если» в функции
if (dma_get_isr_bits (dma2, dma_ch2) == 3)
Триггеры каждая «наполовину перенос закончена». Таким образом, он заполняется при первом прерывании буфера [0] n и на следующем буфере [1]
Но, может быть, я что -то пропустил/испортил. Но можете ли вы использовать мой некорректированный пример? Странно, что это работает на моем месте, но не на твоем...

Вассилис
Пн, сентябрь 07, 2015, 16:12
Я снова проверю код. Может быть, есть какие -то проблемы с моим нынешним STM32Duino Repo.

Мадиас
Пн, сентябрь 07, 2015, 16:28
ОК 374 Гц слишком быстро: 374x256 = 95744, но это должно быть 47872

Мадиас
Пн, сентябрь 07, 2015, 17:43
Хорошо, я прошел тестовый светодиод в DMA IRQ: void DMAEvent() { if (dma_get_isr_bits( DMA2, DMA_CH2) == 3) { i2s_buffer[0] = sine[wavecounter1] << 3; // half transfer wavecounter1++; flip=1; } else { i2s_buffer[1] = wavecounter2 << 8 ; wavecounter2++; flip=0; dma_clear_isr_bits(DMA2, DMA_CH2); digitalWrite(LED,flip); }

Мадиас
Пн сентября 07, 2015, 17:49
Если вы используете логический анализатор Saleae, то вы можете добавить «протокол I2S» с следующими настройками:
Изображение
Поэтому я подтвердил, что значения правильные (я удалил <<8 Из разлуки, поэтому он имеет значение только от 0 до 255, и это значения, которые я получил для канала № 1)

Мадиас
Пн сентября 07, 2015 8:39 вечера
Просто примечание:
Необходимый шаг для получения бесплатного звука для сбоев - вставить: dma_set_priority(DMA2, DMA_CH2, DMA_PRIORITY_VERY_HIGH);

Вассилис
Пн сентября 07, 2015 8:55 вечера
Я скачал свежую копию STM32Duino и, наконец, сейчас работает DMA! Проблема была в репозитории, который я использовал. Может быть, тем временем (с дня, когда я загрузил репозиторий, который я использовал) Виктор или Роджер внесли некоторые изменения в файлы DMA.
В любом случае, теперь это работает нормально!

Я получаю прямоугольный импульс с 47.88 кГц на PD2.
Кроме того.

Теперь все в порядке!

Мадиас
Рн. Сен. 07, 2015, 21:17
Поздравляю Василис!
Я думаю, что основная работа выполнена, и из всех таблиц данных, примеров кода и веб -сайтов код инициации теперь очень понятен.
Большое "спасибо" идет к Виктору, который помог мне с DMA и за его терпение со мной ;)
Если сделано некоторые дальнейшие тесты: стабильность звука с высоким приоритетом DMA теперь идеальна, я изменил таблицу синуса на 1024 шага (в моем последнем коде это можно сделать очень легко) и протестировал цикл частоты: с 1024 шагами существует практически Больше не слушается против антиалиаса. Кроме того, я получил работу с моим кодом, что ссылка на 440 Гц действительно 440 Гц, потрясающе.
Вассилис: Что вы планируете с i2s и что должно быть в библиотеке (если нам это нужно)?

Вассилис
Пн, сентябрь 07, 2015, 21:33
Ну, свежий репозиторий работает нормально с DMA, но не работает с моей библиотекой VS1003.

Протестировано на:
Arduino Ide 1.6.3, 1.6.4 и 1.6.5

Я использую Maple Mini и из Arduino Ide я выбираю:

Правление: «Generic STM32F103C Series»
Вариант: «STM32F103CB (20K RAM 128K Flash)»
Метод загрузки: "stlink"

После составления + сжигания клена с примером "hello_stm" синий светодиод начал мигать. Пример кода не выполняется :(

victor_pv
Пн, 07 сентября 2015 11:34
Хороший катевар с приоритетом DMA, я не думал об этом, но, возможно, был тем, что заставляло частоты не совпадать с самого начала.
Я все равно рекомендую установить больший буфер, по крайней мере, несколько байтов. Это поможет значительно уменьшить наклад.

Другой вариант - удалить половину передачи вспышки и удалить "если..."Предложение в ISR и просто перезагрузить оба значения в буфере каждый раз вызывается.
Это уменьшит прерывания до половины. Точка прерывания половины переноса была больше для заполнения более крупных буферов, с таким небольшим буфером нет преимуществ, и невыгодное положение на прерываниях обслуживания так часто.

Мадиас
Вторник 08 сентября 2015 6:02
Вассилис написал:Ну, свежий репозиторий работает нормально с DMA, но не работает с моей библиотекой VS1003.

Мадиас
Вторник 08 сентября 2015 г. 6:10
victor_pv написал:Хороший катевар с приоритетом DMA, я не думал об этом, но, возможно, был тем, что заставляло частоты не совпадать с самого начала.
Я все равно рекомендую установить больший буфер, по крайней мере, несколько байтов. Это поможет значительно уменьшить наклад.

Другой вариант - удалить половину передачи вспышки и удалить "если..."Предложение в ISR и просто перезагрузить оба значения в буфере каждый раз вызывается.
Это уменьшит прерывания до половины. Точка прерывания половины переноса была больше для заполнения более крупных буферов, с таким небольшим буфером нет преимуществ, и невыгодное положение на прерываниях обслуживания так часто.

victor_pv
Вторник 08 сентября 2015 13:35
Если вы сможете справиться с немного меньшей точностью, я бы изменился:
(waveout_a [0] * testvol) / 127)
к
(waveout_a [0] * testvol) / 128)

Компилятор должен оптимизировать это в правую смену 7 битов, а не в раздел, которое требует большего количества циклов.
Но в общем, да, остальное слишком много для ISR.
Я бы использовал индекс, чтобы узнать, где я нахожусь в волновой части, а затем буфер не менее 128 байтов, который дает мне 64 на канал, 32 слова, если использование 16 бит на слово, 128 байтов не должны оставлять вас из памяти, и обеспечил бы мочеиспускание, так как я держу пари, что причина ISR приводит столько потраченного впустую времени, сколько расчет одного из ваших выходных значений, большие отходы.

Если вы опубликуете весь свой набросок где -нибудь, я могу попробовать повернуть его в пример COOS, который показывает вам использование процессора в углу дисплея, если вы используете дисплей, или отправите его через Serialusb, если у вас нет подключенного дисплея, таким образом, вы Можно увидеть, сколько процессора у вас осталось для других вещей, и сколько вы сохраняете с изменениями.

Мадиас
Вторник 08 сентября 2015 14:29
(waveout_A[0] * testvol) / 127) to (waveout_A[0] * testvol) / 128)3

Мадиас
Вторник 08 сентября 2015 г. 14:52
Я сделал небольшой тест с различными размерами буферов (с манипуляцией по штифтам низкого уровня):
На буфере 256 у меня есть
2459us простаиваемого времени
214,8US IRQ
= 8.034% время процессора

На буфере 16:
153,6
13,5US IRQ
= 8.079% времени процессора

Итак, победитель матча: Buffer 16 с лучшим качеством звука :)
Таким образом, в этом расчете не важно, каково время процессора для манипуляции с булавками, потому что речь идет о взаимосвязи между результатами. Таким образом, основное время процессора - это расчет самого звука в реальном времени.
Странная вещь: (я подозреваю это, должен проверить это снова): на PIC32MX250 @68 МГц почти тот же код (но без DMA для i2s!) быстрее.

Итак, в моем окончательном коде я подозреваю, что для каждого генератора понадобится 10-12% времени цикла процессора, так что в целом около 40-50% времени процессора, но мне нужен TFT, кодеры-ручки-путы, (USB) MIDI, и и и Более постоянные расчеты (не на высокой частоте в качестве кода OSC), такие как 8x ADSR, 8-12x LFO и DAC (12x) ауты для управления платой внешнего фильтра....

victor_pv
Вторник 08 сентября 2015 г., 17:03
Мадиас написал:Я сделал небольшой тест с различными размерами буферов (с манипуляцией по штифтам низкого уровня):
На буфере 256 у меня есть
2459us простаиваемого времени
214,8US IRQ
= 8.034% время процессора

На буфере 16:
153,6
13,5US IRQ
= 8.079% времени процессора

Итак, победитель матча: Buffer 16 с лучшим качеством звука :)
Таким образом, в этом расчете не важно, каково время процессора для манипуляции с булавками, потому что речь идет о взаимосвязи между результатами. Таким образом, основное время процессора - это расчет самого звука в реальном времени.
Странная вещь: (я подозреваю это, должен проверить это снова): на PIC32MX250 @68 МГц почти тот же код (но без DMA для i2s!) быстрее.

Итак, в моем окончательном коде я подозреваю, что для каждого генератора понадобится 10-12% времени цикла процессора, так что в целом около 40-50% времени процессора, но мне нужен TFT, кодеры-ручки-путы, (USB) MIDI, и и и Более постоянные расчеты (не на высокой частоте в качестве кода OSC), такие как 8x ADSR, 8-12x LFO и DAC (12x) ауты для управления платой внешнего фильтра....

Мадиас
Вторник 08 сентября 2015 г., 17:49
Да, светодиодная булавка включена в IRQ Start и OFT на END IRQ

victor_pv
Вторник 08 сентября 2015 г., 19:22
Мадиас написал:Да, светодиодная булавка включена в IRQ Start и OFT на END IRQ

Мадиас
Вторник 08 сентября 2015 г., 19:49
Freertos действительно мог бы по -настоящему друг с этим проектом, я рассмотрим включенные примеры
Есть ли что -нибудь, чтобы наблюдать с RTOS (ОК, вдали от использования своих собственных функций, таких как задержка)?
RTOS использует определенный аппаратный таймер для задач?
Я прочитаю все функции на http: // www.Freertos.org/a00019.HTML

Мадиас
Вторник 08 сентября 2015 г. 20:13
Хорошо, ответь на мой вопрос HW Timer Freertos использует Systick с 1 кГц

victor_pv
Ср. 09 сентября 2015 г., 3:59
Мадиас написал:Хорошо, ответь на мой вопрос HW Timer Freertos использует Systick с 1 кГц

Мадиас
Ср. 09 сентября 2015 г., 13:40
Хорошо, я читал ссылку на RTOS и посмотрел несколько примеров.
В папке библиотеки есть два RTO Libs: Freertos и Freertos821. Я думаю, что 821 - более новой, который я должен использовать? (К сожалению, я не нашел намека на форуме)
Howto DMA и RTOS-задачи (мое рассмотрение):
В DMA IRQ, который запускается, когда буфер пуст (я удалил наполовину пустую опцию), я должен установить обработчик/триггер в Trtos-Task (вызовите его: rtos_audioEngine)
Таким образом, RTOS_AUDINOENIENGINE Заполняется и заполняет буфер?

Должен ли я сделать это в DMA IRQ с:
xqueuesendfromisr
xqueuereceivefromisr ?
редактировать или
xsemaphoregivefromisr
xsemaphoretake
Таким образом, RTOS_AUDIOENGINE является первым приоритетом.
Остальные задачи должны быть: TFT (низкий приоритет), MIDI (средний-высокий), человеческий интерфейс (средний-низкий), модуляции ADSR, LFO (Middle)....

Мадиас
Ср. 09 сентября 2015 г., 19:52
Следующий вопрос ответил мне:
В текущей папке STM32F1 есть две библиотеки:
"Freertos" Это старый V7.0.1 и
"Freertos821" Это новейшая версия 8.21

Виктор: я нашел ваш пример игрока WAV в https: // github.com/vicopropv/arduino_stm ... Odule2.Ино
В этом примере вы используете COO вместо RTOS - почему?
редактировать: Хорошо, на первом образе, я чувствую

victor_pv
Чт 10 сентября 2015 г. 12:03 утра
Мадиас написал:Следующий вопрос ответил мне:
В текущей папке STM32F1 есть две библиотеки:
"Freertos" Это старый V7.0.1 и
"Freertos821" Это новейшая версия 8.21

Виктор: я нашел ваш пример игрока WAV в https: // github.com/vicopropv/arduino_stm ... Odule2.Ино
В этом примере вы используете COO вместо RTOS - почему?
редактировать: Хорошо, на первом образе, я чувствую

victor_pv
Чт 10 сентября 2015 г. 12:15 утра
Мадиас написал:Хорошо, я читал ссылку на RTOS и посмотрел несколько примеров.
В папке библиотеки есть два RTO Libs: Freertos и Freertos821. Я думаю, что 821 - более новой, который я должен использовать? (К сожалению, я не нашел намека на форуме)
Howto DMA и RTOS-задачи (мое рассмотрение):
В DMA IRQ, который запускается, когда буфер пуст (я удалил наполовину пустую опцию), я должен установить обработчик/триггер в Trtos-Task (вызовите его: rtos_audioEngine)
Таким образом, RTOS_AUDINOENIENGINE Заполняется и заполняет буфер?

Должен ли я сделать это в DMA IRQ с:
xqueuesendfromisr
xqueuereceivefromisr ?
редактировать или
xsemaphoregivefromisr
xsemaphoretake
Таким образом, RTOS_AUDIOENGINE является первым приоритетом.
Остальные задачи должны быть: TFT (низкий приоритет), MIDI (средний-высокий), человеческий интерфейс (средний-низкий), модуляции ADSR, LFO (Middle)....

Мадиас
Чт 10 сентября 2015 г. 9:03 утра
Дорогой Виктор,
Спасибо за ваши входные данные!
Я немного поиграю с COO и RTO, чтобы почувствовать себя «чувство» с ним.
В качестве следующего шага я разработаю блок-схему всех задач и OSC-Model. Некоторые вещи для меня расплывчаты, например, строительство LFO:
Я использую около 8-12 LFO (каждый голос (4) имеет 2-3 независимых LFO, так что есть LFO_A [4], LFO_B [4] и LFO_C [4].
Итак, я построил это на своей тиве с таймером. LFO очень просты: частота до 200 Гц (или ниже), они сканируют только через таблицу, например, Sine [256]. Поэтому я дал им все в Timer_isr (с для (byte voicenr = 0; Voicenr<= Max_voices; voicenr ++), потому что рутина всегда одинакова) . Для скорости я настраиваю переменную счетчика (0...256) и таблица запускает один шаг, если счетчик счетчика достигла значения. С RTOS было бы лучше придать функции LFO в отдельную задачу или я должен построить 4 задачи (для каждого голоса), и вместо переменной счетчика я настроил rtos_delay... много вещей, чтобы попробовать :)
Другое дело:
Я занял эту ветку, так что я буду продолжать публиковать: http: // www.STM32duino.com/viewtopic.PHP?F = 19&t = 533

Jbforrer
Пт 30 октября 2015 г., 17:07
Привет,

Ранее я подключил кодек Wolfson WM8751 с советом по обнаружению F4 для проекта SDR. Отлично работает, но это использовало библиотеки CMSIS и IDE на основе Eclipse.

Теперь стараюсь сейчас взаимодействовать с кодеком 320AIC23B с синей таблеткой, используя STM32Duino IDE.
I2C используется для настройки кодека ... это работает нормально, я.эн. Сигналы часов появляются ОК на прицеле, когда кодек инициализируется. У меня, кажется, есть некоторые проблемы, связанные с i2s.

В моей настройке аппаратное обеспечение Codec Master обеспечивает BitClock (PA5) и WS (PA3) для выводов STM32 I2S.
Похоже, PA5 может быть настроен как выход и остается низким, по крайней мере, в режиме рабов.
Мне не хватает чего -то, что нужно настроить, кроме ...

SPI.начинается лав (); // Инициализировать порт SPI_1 (STM32 - раб).
SPI.setbitOder (msbfirst); // Установить порядок бита SPI_1
SPI.setDatamode (spi_mode0); // Установить режим данных SPI_2 0
SPI.SetClockDivider (spi_clock_div16); // медленная скорость (72 /16 = 4.5 МГц SPI_1 скорость)
SPI.setDatasize (spi_cr1_dff); // Установление размера данных SPI на 16 -битный

Большое спасибо.

РЕДАКТИРОВАТЬ: Думаю, я нашел ответ ... STM32F103C8T не имеет i2s. Мне придется попробовать что -то вроде STM32F103VET6, которое как два i2s. Хотя можно приблизиться к эмуляции i2s с помощью умного использования SPI, время становится сложным ... True i2s полагается на непрерывные бичные потоки. Лучше всего использовать I2S DMA. Думал, что поделюсь этим лакомством.

tj_style
Чт, 05 ноября 2015 г., 20:16
Привет,

На первой странице упоминается, что PT8211 использует LSBJ (наименьший значительный бит оправдан) «японский входной формат» или некоторые люди SID - формат EIAJ.
У меня TDA1545A, вот таблица данных:
http: // www.nxp.com/documents/data_sheet/tda1545a_t.PDF

Являются ли DAC используют тот же формат, как Pt8211 ?
Потому что я не могу иметь рабочую конфигурацию для этого ЦАП.
звук производится, но с большим шумом.
У меня также есть TDA1543, IS Version DAC, и он отлично работает с помощью режима i2s_standard_phillips.

с уважением.
TJ

Мадиас
Пн, 09 ноября 2015 г., 22:25
Я быстро посмотрел в таблицу данных, и они должны быть почти в замене для PT8211 или TDA1543.
Две вещи, которые я могу порекомендовать:
1) Попробуйте только 8 бит (я купил в Китае немного TDA1543, и они полностью подделываются и работают только с 8-битными, попробовали это на нескольких системах и различных аудиоформатах)
2) Попробуйте разные аудио -форматы, к сожалению, я не могу вспомнить, где я установил бит для этого (просто возьмите быстрый взгляд во всех этих руководствах STM32 - I2S, это должно быть легко найти, возможно, я написал это в код...)

tj_style
Сб 14 ноября 2015 г., 13:18
Привет, Мадиас,

Да, это проблема оборудования. Первый TDA1545A, который я использовал, - это фальшивый.
Теперь я использую Ooriginal TDA1545A, отлично работает.
Осталось только 1 проблема для воспроизведения 24 -битных файлов, я думаю, мне нужно сначала преобразовать поток в 16 -битный.

Мадиас
Сб 14 ноября 2015 г. 20:44
Грустно слышать, что вы также купили фальшивый DAC TDA :( Я думаю, что Азия - это не место для их покупки (TDA).
Около 24 бит до 16 бит:
Почему бы не просто: stream >>= 8;

РЕЗЕКС
Ср 20 января 2016 г. 15:07
Приятно видеть, как работают чипсы eBay 14p.
Отличный проект.
Если вы можете помочь, пожалуйста, с предложением на подобном UDA1330ATS ЦАП ЦАП?
В таблице данных говорится, что WS должен измениться только на отрицательном краю BCK, что, конечно, не может быть точно так же с SPI, после передачи DIN; Взяв WS High/Low - может быть любое состояние часов?

Но ваш чип имеет одинаковое требование в сроках данных, и он работает!
Кроме того, «Японский LSB оправдан» - это потрясающая ясная формулировка - в отличие от UDA1330ats, сбивающей с толку путаницу. Мне в любом случае.

Это тот же протокол WS, да? Данные L/R передаются высокой скоростью, а затем можно сделать другие вещи до следующей передачи данных?
Я хочу использовать UDA1330ats на Atmega328 Pro Mini - нуждаются в более низких SPS около 8 км сб, поэтому интерполярный фильтр необходимы (10 -битные значения + фиктивные данные составлены до 16 бит).

Большое спасибо.
UDA1330atsfilterDac.PDF
(122.78 киб) скачано 65 раз

Rogerclark
Ср 20 января 2016 г. 8:37 вечера
Вы уверены, что не можете использовать SPI на падении.

SPI имеет несколько режимов и т. Д. Многие хотите дважды проверить, можете ли вы использовать его в конце концов

РЕЗЕКС
Ср 20 января 2016 г., 21:52
Что я хотел быть возможной проблемой, так это то, что CHS Select CS может быть принят низко с интервалом перед отправкой данных через MOSI.
На осциллографе вы видите 8 битов как взрыв синхронизации с часами для каждого байта. Затем разрыв, а затем другой взрыв и т. Д.
Но если WS должен быть высоким или низким, чтобы направить данные к правильной внутренней защелке ЦАП на краю падающих часов...

Неважно, вы, кажется, успешно использовали большой разрыв на данный момент во времени.
Я думаю, что теперь я могу понять, почему это так, потому что часы останавливались между каждым байтом. И защелка ЦАП не имеет знаний или заботы об этом. Ну, до тех пор, пока не несколько часов или дней между байтами. Изменение состояния WS все еще было на «краю» часов, когда STM32 возобновляется, чтобы отправить следующий взрыв SPI.

В вашем первом примере наброска опубликована. Я попытался вычислять SPI 4.Prescale 5 МГц и ваши 16 -битные слова (1 слева, 1 справа).
Требуется 1US, чтобы обновить положение таблицы, каналы переключения и т. Д. Остальное время - SPI.Transfer () 4 байта?

Так что для моего 8 кс / с, мне нужно удвоить эту скорость = 16 кГц spi clk.

Большое спасибо, много полезной информации из ваших сообщений.

Rogerclark
Ср 20 января 2016 г. 22:06
Аппаратное CS не работает правильно на STM32F103.

Ну, это не работает так, как обычно любое использование. Так что мы не используем это.

Вам придется написать код, чтобы установить и сбросить строку CS по мере необходимости.

КСТАТИ. Если у вас нет более одного устройства на SPI, разве вы не можете просто оставить CS постоянно.

STM32 имеет 2 канала SPI, поэтому, если у вас есть более одного устройства SPI, вы можете поместить один на SPI1 и один на SPI2 и установить CS на обоих времени

Мадиас
Пт 22 января 2016 г. 15:54
STM32F103 - действительно плохие устройства для i2s, вызванные «разделенным» делителем часов в F103. Я думаю, что я связался с этой проблемой здесь, на форуме. Так что вы не получите нечетного 44.1 кГц или 48 кГц (48 - еще лучше)

victor_pv
Вторник 03 января 2017 г. 6:00
Мадиас, ты когда -нибудь превращал код i2S в библиотеку?
Я возвращаюсь к работе над STM32 и только что заказал PT8211.
Я хочу очистить код игрока WAV и повернуть его, чтобы использовать один из них.

Grumpyoldpizza
Вторник 03 января 2017 г. 14:51
victor_pv написал:Мадиас, ты когда -нибудь превращал код i2S в библиотеку?
Я возвращаюсь к работе над STM32 и только что заказал PT8211.
Я хочу очистить код игрока WAV и повернуть его, чтобы использовать один из них.

victor_pv
Вторник 03 января 2017 г. 14:57
Grumpyoldpizza написал:victor_pv написал:Мадиас, ты когда -нибудь превращал код i2S в библиотеку?
Я возвращаюсь к работе над STM32 и только что заказал PT8211.
Я хочу очистить код игрока WAV и повернуть его, чтобы использовать один из них.

Grumpyoldpizza
Вторник 03 января 2017 г. 15:11
victor_pv написал:Grumpyoldpizza написал:victor_pv написал:Мадиас, ты когда -нибудь превращал код i2S в библиотеку?
Я возвращаюсь к работе над STM32 и только что заказал PT8211.
Я хочу очистить код игрока WAV и повернуть его, чтобы использовать один из них.

victor_pv
Солнце 08 января 2017 г., 19:03
Grumpyoldpizza написал:
STM32L4 имеет реализацию 2 слоя, один на стороне ядра, а затем наловой на стороне системы:

https: // github.com/grumpyoldpizza/ardui ... /src/i2s.час
https: // github.com/grumpyoldpizza/ardui ... RC/i2s.CPP


Интерфейс класса довольно прост. По сути, вам просто нужно немного приема/передачи на основе DMA, с обратным вызовом, когда будет выполнено передача/прием. Единственная неочевидная вещь в исходном интерфейсе-это то, что первое получение/передача связывает направление интерфейса I2S ...

Внутренняя реализация уровня системы является немного более вовлеченной для STM32L4, так как различные диапазоны напряжения и различные использование PLLSAI1/PLLSAI2 для STM32L476 и STM32L432/STM32L433 делают это несколько интересным.

Grumpyoldpizza
Вт 10 января 2017 г. 12:17
victor_pv написал: Спасибо, я посмотрел как на Arduino, так и на вашу реализацию. Вы используете драйверы STM для самого низкого уровня? или вы написали свой собственный?
Я посмотрю, у меня будет на предстоящей неделе время, чтобы прочитать, как работает периферийное устройство i2s в F1 и начать писать.
Мне придется спросить вас кое -что о функциях обратного вызова DMA, но я сделаю, когда начну работать над этим.

С другой стороны, я думаю, что аналогичный способ управления обратным вызовом должен работать для передачи SPI DMA в ядре F1, в настоящее время мы блокируем вместо обратных вызовов.

Мадиас
Чт 19 января 2017 г., 17:36
Дорогой Виктор, рад видеть тебя в ответ :)
...Но я действительно не в бизнесе, причина моей второй новорожденной дочери.
Как я помню, я не превратил код I2S в библиотеку. Все, что я помню, был разговор между нами, в конечном итоге не использовал RTOS, но с вашими примерами DMA, которые работали безупречно. Я не знаю библиотеку i2s-Zero, но я думаю, что это не на самом деле необходимо, потому что работа I2S DMA-это всего лишь несколько строк кода, поэтому я думаю, что лучше работать с «нашем» кодом.

victor_pv
Чт 19 января 2017 г., 17:56
Мадиас написал:Дорогой Виктор, рад видеть тебя в ответ :)
...Но я действительно не в бизнесе, причина моей второй новорожденной дочери.
Как я помню, я не превратил код I2S в библиотеку. Все, что я помню, был разговор между нами, в конечном итоге не использовал RTOS, но с вашими примерами DMA, которые работали безупречно. Я не знаю библиотеку i2s-Zero, но я думаю, что это не на самом деле необходимо, потому что работа I2S DMA-это всего лишь несколько строк кода, поэтому я думаю, что лучше работать с «нашем» кодом.

victor_pv
Сб 11 февраля 2017 г. 20:28
Grumpyoldpizza написал:victor_pv написал: Спасибо, я посмотрел как на Arduino, так и на вашу реализацию. Вы используете драйверы STM для самого низкого уровня? или вы написали свой собственный?
Я посмотрю, у меня будет на предстоящей неделе время, чтобы прочитать, как работает периферийное устройство i2s в F1 и начать писать.
Мне придется спросить вас кое -что о функциях обратного вызова DMA, но я сделаю, когда начну работать над этим.

С другой стороны, я думаю, что аналогичный способ управления обратным вызовом должен работать для передачи SPI DMA в ядре F1, в настоящее время мы блокируем вместо обратных вызовов.

victor_pv
Солнце 12 февраля 2017 г. 15:19
Grumpyoldpizza написал:victor_pv написал:Мадиас, ты когда -нибудь превращал код i2S в библиотеку?
Я возвращаюсь к работе над STM32 и только что заказал PT8211.
Я хочу очистить код игрока WAV и повернуть его, чтобы использовать один из них.

Grumpyoldpizza
Ср. 15 февраля 2017 г. 15:06
victor_pv написал:Grumpyoldpizza написал:victor_pv написал:Мадиас, ты когда -нибудь превращал код i2S в библиотеку?
Я возвращаюсь к работе над STM32 и только что заказал PT8211.
Я хочу очистить код игрока WAV и повернуть его, чтобы использовать один из них.

victor_pv
Ср. 15 февраля 2017 г. 16:58
Grumpyoldpizza написал:victor_pv написал:Grumpyoldpizza написал:
Arduinozero (Mkrzero) добавил класс I2S, который также поддерживается Arduinosound Libary:

https: // github.com/arduino/arduinocore- ... /src/i2s.час

https: // www.Ардуино.cc/en/reference/i2s
https: // www.Ардуино.cc/en/reference/arduinosound

Это может иметь смысл не изобретать там колесо и использовать, по крайней мере, интерфейс I2S в качестве базы. Я отказался от собственного доморощенного интерфейса и добавил этот класс i2S в код STM32L4. Была только одна модификация, необходимая для поддержки вывода MCK. Этот периферийный характер STM32 SPI/I2 отлично подойдет с этим интерфейсом класса. Не.беременный. что этот класс "i2s" - это не подход KitchenSink, а минимальная поддержка, чтобы получить наибольшее оборудование на другом конце интерфейса i2S для работы.

Grumpyoldpizza
Чт 16 февраля 2017 г. 13:32
API не идеален ;-)

Глядя на все это, кажется, что лучше реализовать переключение между i2s.написать (образец) и i2s.Напишите (данные, размер), так что первое нужно проверить, что весь DMA был закончен, прежде чем он может писать напрямую. Но снова писать напрямую - это плохое, потому что вы не можете предварительно. Предположим, вы хотите прочитать данные с SD -карты ... Я думаю, что SAI на STM32L4, возможно, имеет 16 буферированных образцов, используя перипериферийную часть I2S на STM32F1, у вас есть только 1 входной глубокий буфер.

Размер буфера. Вот что я сделал для uart.час:
void begin(unsigned long baudrate, uint16_t config); void begin(unsigned long baudrate, uint16_t config, uint8_t *buffer, size_t size);

victor_pv
Чт 16 февраля 2017 г. 14:51
Grumpyoldpizza написал:API не идеален ;-)

Глядя на все это, кажется, что лучше реализовать переключение между i2s.написать (образец) и i2s.Напишите (данные, размер), так что первое нужно проверить, что весь DMA был закончен, прежде чем он может писать напрямую. Но снова писать напрямую - это плохое, потому что вы не можете предварительно. Предположим, вы хотите прочитать данные с SD -карты ... Я думаю, что SAI на STM32L4, возможно, имеет 16 буферированных образцов, используя перипериферийную часть I2S на STM32F1, у вас есть только 1 входной глубокий буфер.

Размер буфера. Вот что я сделал для uart.час:
void begin(unsigned long baudrate, uint16_t config); void begin(unsigned long baudrate, uint16_t config, uint8_t *buffer, size_t size);

Grumpyoldpizza
Сб 25 февраля 2017 г. 1:52
Виктор, это заняло некоторое время, чтобы добраться до этого. Код теперь обновлен на GitHub.компонент. В итоге я использовал этот код:
size_t I2SClass::write(int32_t sample) { if (_state != I2S_STATE_TRANSMIT) { if (!((_state == I2S_STATE_READY) || (_state == I2S_STATE_TRANSMIT))) { return 0; } _state = I2S_STATE_TRANSMIT; } while (!write((const void*)&sample, (_width / 8))) { armv7m_core_yield(); } return 1; }

Chismicro
Чт 20 апреля 2017 г. 8:11
Есть хороший усилитель I2S от Adafruit:
https: // учиться.Адафрут.com/adafruit-max ... MP/PINOUTS

Можно использовать его с arduino Zero
https: // www.Ардуино.cc/en/turniory/ardu ... VePlayback

Я попробовал это с BluePill STM32F103, но это не сработало. Вероятно, время является более критическим, чем с другим ЦАП I2S, предложенным здесь в этой теме. #include #define DACSAMPLINGRATE_HZ 16000 #define TIMER_INTTERUPT_US ( 1000000UL / DACSAMPLINGRATE_HZ / 2 ) // division by 2 because of two channels #define WS PA3 #define BCK PA5 #define DATA PA7 #define testpin PC13 int sine[] = {0x800, 0x832, 0x864, 0x896, 0x8c8, 0x8fa, 0x92c, 0x95e, 0x98f, 0x9c0, 0x9f1, 0xa22, 0xa52, 0xa82, 0xab1, 0xae0, 0xb0f, 0xb3d, 0xb6b, 0xb98, 0xbc5, 0xbf1, 0xc1c, 0xc47, 0xc71, 0xc9a, 0xcc3, 0xceb, 0xd12, 0xd39, 0xd5f, 0xd83, 0xda7, 0xdca, 0xded, 0xe0e, 0xe2e, 0xe4e, 0xe6c, 0xe8a, 0xea6, 0xec1, 0xedc, 0xef5, 0xf0d, 0xf24, 0xf3a, 0xf4f, 0xf63, 0xf76, 0xf87, 0xf98, 0xfa7, 0xfb5, 0xfc2, 0xfcd, 0xfd8, 0xfe1, 0xfe9, 0xff0, 0xff5, 0xff9, 0xffd, 0xffe, 0xfff, 0xffe, 0xffd, 0xff9, 0xff5, 0xff0, 0xfe9, 0xfe1, 0xfd8, 0xfcd, 0xfc2, 0xfb5, 0xfa7, 0xf98, 0xf87, 0xf76, 0xf63, 0xf4f, 0xf3a, 0xf24, 0xf0d, 0xef5, 0xedc, 0xec1, 0xea6, 0xe8a, 0xe6c, 0xe4e, 0xe2e, 0xe0e, 0xded, 0xdca, 0xda7, 0xd83, 0xd5f, 0xd39, 0xd12, 0xceb, 0xcc3, 0xc9a, 0xc71, 0xc47, 0xc1c, 0xbf1, 0xbc5, 0xb98, 0xb6b, 0xb3d, 0xb0f, 0xae0, 0xab1, 0xa82, 0xa52, 0xa22, 0x9f1, 0x9c0, 0x98f, 0x95e, 0x92c, 0x8fa, 0x8c8, 0x896, 0x864, 0x832, 0x800, 0x7cd, 0x79b, 0x769, 0x737, 0x705, 0x6d3, 0x6a1, 0x670, 0x63f, 0x60e, 0x5dd, 0x5ad, 0x57d, 0x54e, 0x51f, 0x4f0, 0x4c2, 0x494, 0x467, 0x43a, 0x40e, 0x3e3, 0x3b8, 0x38e, 0x365, 0x33c, 0x314, 0x2ed, 0x2c6, 0x2a0, 0x27c, 0x258, 0x235, 0x212, 0x1f1, 0x1d1, 0x1b1, 0x193, 0x175, 0x159, 0x13e, 0x123, 0x10a, 0xf2, 0xdb, 0xc5, 0xb0, 0x9c, 0x89, 0x78, 0x67, 0x58, 0x4a, 0x3d, 0x32, 0x27, 0x1e, 0x16, 0xf, 0xa, 0x6, 0x2, 0x1, 0x0, 0x1, 0x2, 0x6, 0xa, 0xf, 0x16, 0x1e, 0x27, 0x32, 0x3d, 0x4a, 0x58, 0x67, 0x78, 0x89, 0x9c, 0xb0, 0xc5, 0xdb, 0xf2, 0x10a, 0x123, 0x13e, 0x159, 0x175, 0x193, 0x1b1, 0x1d1, 0x1f1, 0x212, 0x235, 0x258, 0x27c, 0x2a0, 0x2c6, 0x2ed, 0x314, 0x33c, 0x365, 0x38e, 0x3b8, 0x3e3, 0x40e, 0x43a, 0x467, 0x494, 0x4c2, 0x4f0, 0x51f, 0x54e, 0x57d, 0x5ad, 0x5dd, 0x60e, 0x63f, 0x670, 0x6a1, 0x6d3, 0x705, 0x737, 0x769, 0x79b, 0x7cd, }; HardwareTimer timer(3); #define PIN_PORT GPIOC // testpin #define PIN_PORT1 GPIOA // WS pin #define PIN_BIT 5 #define PIN_BIT1 3 #define SD_MODE_PIN PB1 void setup() { pinMode(SD_MODE_PIN, OUTPUT); digitalWrite(SD_MODE_PIN, LOW); // off Serial.begin(9600); delay (500); SPI.begin(); //Initialize the SPI_1 port. SPI.setBitOrder(MSBFIRST); // Set the SPI_1 bit order SPI.setDataMode(SPI_MODE0); //Set the SPI_2 data mode 0 //SPI.setClockDivider(SPI_CLOCK_DIV4); // speed (72 / 4 = 18 MHz SPI_1 speed) PT8211 up to 20MHZ clock //SPI.setClockDivider(SPI_CLOCK_DIV16); // speed (72 / 4 = 18 MHz SPI_1 speed) PT8211 up to 20MHZ clock SPI.setClockDivider(SPI_CLOCK_DIV128); // speed (72 / 4 = 18 MHz SPI_1 speed) PT8211 up to 20MHZ clock //SPI.setClockDivider(SPI_CLOCK_DIV256); // speed (72 / 4 = 18 MHz SPI_1 speed) PT8211 up to 20MHZ clock pinMode(WS, OUTPUT); //Set the Word Select pin (WS) as output. pinMode(testpin, OUTPUT); SPI.setDataSize (SPI_CR1_DFF); // setting SPI data size to 16Bit // timer3 setup timer.pause(); // Pause the timer while we're configuring it timer.setPeriod( TIMER_INTTERUPT_US ); // // Set up period in microseconds timer.setChannel1Mode(TIMER_OUTPUT_COMPARE); // Set up an interrupt on channel 1 timer.setCompare(TIMER_CH1, 1); // Interrupt 1 count after each update timer.attachCompare1Interrupt(timer3_irq); timer.refresh(); // Refresh the timer's count, prescale, and overflow timer.resume(); // Start the timer counting delay(1000); digitalWrite(SD_MODE_PIN, HIGH); // on while (1); } void loop() { } void timer3_irq(void) { static uint32_t channel = 0; static uint8_t index = 0; channel ^= 1; if (channel) { // digitalWrite(WS, LOW); //Select RIGHT Audio channel gpio_write_bit(PIN_PORT1, PIN_BIT1, LOW); SPI.write(sine[index++]); } else { // digitalWrite(WS, LOW); //Select LEFT Audio channel gpio_write_bit(PIN_PORT1, PIN_BIT1, HIGH); SPI.write(sine[index]); } } // http://www.stm32duino.com/viewtopic.php?f=18&t=519#p5195 /** I2S example code (modified by Matthias Diro: some sinus melody - 16bit transfer, setting up on timer3) Description: This I2S example creates a Sine waveform on the RIGHT Audio channel of PT8211 and a Sawtooth waveform on the LEFT Audio channel. This is a very simple how-to-use an external I2S DAC example (DAC = Digital to Analog Converter). Created on 27 Aug 2015 by Vassilis Serasidis email: [email protected] Connections between PT8211 DAC and the STM32F103C8T6 WS <--> PA3 BCK <--> PA5 <--> BOARD_SPI1_SCK_PIN DIN <--> PA7 <--> BOARD_SPI1_MOSI_PIN */

victor_pv
Чт 20 апреля 2017 г. 16:10
Chismicro написал:Есть хороший усилитель I2S от Adafruit:
https: // учиться.Адафрут.com/adafruit-max ... MP/PINOUTS

Можно использовать его с arduino Zero
https: // www.Ардуино.cc/en/turniory/ardu ... VePlayback

Я попробовал это с BluePill STM32F103, но это не сработало. Вероятно, время является более критическим, чем с другим ЦАП I2S, предложенным здесь в этой теме. #include #define DACSAMPLINGRATE_HZ 16000 #define TIMER_INTTERUPT_US ( 1000000UL / DACSAMPLINGRATE_HZ / 2 ) // division by 2 because of two channels #define WS PA3 #define BCK PA5 #define DATA PA7 #define testpin PC13 int sine[] = {0x800, 0x832, 0x864, 0x896, 0x8c8, 0x8fa, 0x92c, 0x95e, 0x98f, 0x9c0, 0x9f1, 0xa22, 0xa52, 0xa82, 0xab1, 0xae0, 0xb0f, 0xb3d, 0xb6b, 0xb98, 0xbc5, 0xbf1, 0xc1c, 0xc47, 0xc71, 0xc9a, 0xcc3, 0xceb, 0xd12, 0xd39, 0xd5f, 0xd83, 0xda7, 0xdca, 0xded, 0xe0e, 0xe2e, 0xe4e, 0xe6c, 0xe8a, 0xea6, 0xec1, 0xedc, 0xef5, 0xf0d, 0xf24, 0xf3a, 0xf4f, 0xf63, 0xf76, 0xf87, 0xf98, 0xfa7, 0xfb5, 0xfc2, 0xfcd, 0xfd8, 0xfe1, 0xfe9, 0xff0, 0xff5, 0xff9, 0xffd, 0xffe, 0xfff, 0xffe, 0xffd, 0xff9, 0xff5, 0xff0, 0xfe9, 0xfe1, 0xfd8, 0xfcd, 0xfc2, 0xfb5, 0xfa7, 0xf98, 0xf87, 0xf76, 0xf63, 0xf4f, 0xf3a, 0xf24, 0xf0d, 0xef5, 0xedc, 0xec1, 0xea6, 0xe8a, 0xe6c, 0xe4e, 0xe2e, 0xe0e, 0xded, 0xdca, 0xda7, 0xd83, 0xd5f, 0xd39, 0xd12, 0xceb, 0xcc3, 0xc9a, 0xc71, 0xc47, 0xc1c, 0xbf1, 0xbc5, 0xb98, 0xb6b, 0xb3d, 0xb0f, 0xae0, 0xab1, 0xa82, 0xa52, 0xa22, 0x9f1, 0x9c0, 0x98f, 0x95e, 0x92c, 0x8fa, 0x8c8, 0x896, 0x864, 0x832, 0x800, 0x7cd, 0x79b, 0x769, 0x737, 0x705, 0x6d3, 0x6a1, 0x670, 0x63f, 0x60e, 0x5dd, 0x5ad, 0x57d, 0x54e, 0x51f, 0x4f0, 0x4c2, 0x494, 0x467, 0x43a, 0x40e, 0x3e3, 0x3b8, 0x38e, 0x365, 0x33c, 0x314, 0x2ed, 0x2c6, 0x2a0, 0x27c, 0x258, 0x235, 0x212, 0x1f1, 0x1d1, 0x1b1, 0x193, 0x175, 0x159, 0x13e, 0x123, 0x10a, 0xf2, 0xdb, 0xc5, 0xb0, 0x9c, 0x89, 0x78, 0x67, 0x58, 0x4a, 0x3d, 0x32, 0x27, 0x1e, 0x16, 0xf, 0xa, 0x6, 0x2, 0x1, 0x0, 0x1, 0x2, 0x6, 0xa, 0xf, 0x16, 0x1e, 0x27, 0x32, 0x3d, 0x4a, 0x58, 0x67, 0x78, 0x89, 0x9c, 0xb0, 0xc5, 0xdb, 0xf2, 0x10a, 0x123, 0x13e, 0x159, 0x175, 0x193, 0x1b1, 0x1d1, 0x1f1, 0x212, 0x235, 0x258, 0x27c, 0x2a0, 0x2c6, 0x2ed, 0x314, 0x33c, 0x365, 0x38e, 0x3b8, 0x3e3, 0x40e, 0x43a, 0x467, 0x494, 0x4c2, 0x4f0, 0x51f, 0x54e, 0x57d, 0x5ad, 0x5dd, 0x60e, 0x63f, 0x670, 0x6a1, 0x6d3, 0x705, 0x737, 0x769, 0x79b, 0x7cd, }; HardwareTimer timer(3); #define PIN_PORT GPIOC // testpin #define PIN_PORT1 GPIOA // WS pin #define PIN_BIT 5 #define PIN_BIT1 3 #define SD_MODE_PIN PB1 void setup() { pinMode(SD_MODE_PIN, OUTPUT); digitalWrite(SD_MODE_PIN, LOW); // off Serial.begin(9600); delay (500); SPI.begin(); //Initialize the SPI_1 port. SPI.setBitOrder(MSBFIRST); // Set the SPI_1 bit order SPI.setDataMode(SPI_MODE0); //Set the SPI_2 data mode 0 //SPI.setClockDivider(SPI_CLOCK_DIV4); // speed (72 / 4 = 18 MHz SPI_1 speed) PT8211 up to 20MHZ clock //SPI.setClockDivider(SPI_CLOCK_DIV16); // speed (72 / 4 = 18 MHz SPI_1 speed) PT8211 up to 20MHZ clock SPI.setClockDivider(SPI_CLOCK_DIV128); // speed (72 / 4 = 18 MHz SPI_1 speed) PT8211 up to 20MHZ clock //SPI.setClockDivider(SPI_CLOCK_DIV256); // speed (72 / 4 = 18 MHz SPI_1 speed) PT8211 up to 20MHZ clock pinMode(WS, OUTPUT); //Set the Word Select pin (WS) as output. pinMode(testpin, OUTPUT); SPI.setDataSize (SPI_CR1_DFF); // setting SPI data size to 16Bit // timer3 setup timer.pause(); // Pause the timer while we're configuring it timer.setPeriod( TIMER_INTTERUPT_US ); // // Set up period in microseconds timer.setChannel1Mode(TIMER_OUTPUT_COMPARE); // Set up an interrupt on channel 1 timer.setCompare(TIMER_CH1, 1); // Interrupt 1 count after each update timer.attachCompare1Interrupt(timer3_irq); timer.refresh(); // Refresh the timer's count, prescale, and overflow timer.resume(); // Start the timer counting delay(1000); digitalWrite(SD_MODE_PIN, HIGH); // on while (1); } void loop() { } void timer3_irq(void) { static uint32_t channel = 0; static uint8_t index = 0; channel ^= 1; if (channel) { // digitalWrite(WS, LOW); //Select RIGHT Audio channel gpio_write_bit(PIN_PORT1, PIN_BIT1, LOW); SPI.write(sine[index++]); } else { // digitalWrite(WS, LOW); //Select LEFT Audio channel gpio_write_bit(PIN_PORT1, PIN_BIT1, HIGH); SPI.write(sine[index]); } } // http://www.stm32duino.com/viewtopic.php?f=18&t=519#p5195 /** I2S example code (modified by Matthias Diro: some sinus melody - 16bit transfer, setting up on timer3) Description: This I2S example creates a Sine waveform on the RIGHT Audio channel of PT8211 and a Sawtooth waveform on the LEFT Audio channel. This is a very simple how-to-use an external I2S DAC example (DAC = Digital to Analog Converter). Created on 27 Aug 2015 by Vassilis Serasidis email: [email protected] Connections between PT8211 DAC and the STM32F103C8T6 WS <--> PA3 BCK <--> PA5 <--> BOARD_SPI1_SCK_PIN DIN <--> PA7 <--> BOARD_SPI1_MOSI_PIN */

Chismicro
Пт 21 апреля 2017 г. 5:19 утра
MAX98357A, кажется, нуждается в довольно точном времени.
Время примера примера кода (TIMER TRIGGERS TRIGGERS SPI), по -видимому, недостаточно для этого чипа.
Последовательность битов должна запустить 1 бит задержку (относительно спецификаций I2S), что, кажется, мне нельзя сделать с DMA.

victor_pv
Пт 21 апреля 2017 г. 5:47
Chismicro написал:MAX98357A, кажется, нуждается в довольно точном времени.
Время примера примера кода (TIMER TRIGGERS TRIGGERS SPI), по -видимому, недостаточно для этого чипа.
Последовательность битов должна запустить 1 бит задержку (относительно спецификаций I2S), что, кажется, мне нельзя сделать с DMA.

Chismicro
Пт 21 апреля 2017 г., 20:00
РЕДАКТИРОВАТЬ: Похоже, MAX98357B поддерживает левый оправданный режим. Ну, да ... Но доска прорыва от Adafruit, к сожалению, версия «А» ... И у меня это есть ...
https: // Разработчик.Mbed.org/users/plugo/ ... -adafruit/

Хорошо, давайте откладываем проблему на несколько лет ..

victor_pv
Пт 21 апреля 2017 г., 20:24
Chismicro написал:РЕДАКТИРОВАТЬ: Похоже, MAX98357B поддерживает левый оправданный режим. Ну, да ... Но доска прорыва от Adafruit, к сожалению, версия «А» ... И у меня это есть ...
https: // Разработчик.Mbed.org/users/plugo/ ... -adafruit/

Хорошо, давайте откладываем проблему на несколько лет ..

Chismicro
Сб 22 апреля 2017 г. 7:33 утра
Или вы можете просто заказать плату RCT с eBay или AliexPress ;) Да, иногда я также склонен решать проблемы с программным обеспечением с помощью аппаратного обеспечения ;-)

Вот хороший, но это сделано для самообслуживания:
https: // www.PJRC.com/store/pt8211_kit.HTML

victor_pv
Сб 22 апреля 2017 г. 15:16
Chismicro написал:Или вы можете просто заказать плату RCT с eBay или AliexPress ;) Да, иногда я также склонен решать проблемы с программным обеспечением с помощью аппаратного обеспечения ;-)

Вот хороший, но это сделано для самообслуживания:
https: // www.PJRC.com/store/pt8211_kit.HTML

Phoebus1966
Пт 16 февраля 2018 г., 19:00
У есть вопрос в отношении ЦАП TP8211.

TP8211 тот же тип ЦАП, что и PCM61P?

У меня есть догадка, но я не мог подтвердить, что помимо факта, что у обоих есть часы слова, немного часов и один ввод последовательных данных, плюс, что оба сначала MSB.

PCM61P и сходные в своем роде имеют LE как Word Clock, затем CLK и данные.

victor_pv
Пт 16 февраля 2018 г., 19:07
У этого есть 18 -битный разрешение по сравнению с 16 битами в PT8211, поэтому они не одинаковы или работают одинаково.

Phoebus1966
Пт 16 февраля 2018 г., 22:52
Что касается «примера кода», я просто открою Arduino и начну набирать код, подключить мою плату Arm и нажмите на компиляцию/загрузку? Конечно, нет.

С Arduino IDE, имеющим настройки платы, мы все еще должны знать, какую плату выбрать.

Итак, какая плата должна выбрать среди множества вариантов?

Есть ли другие директивы, необходимые для выполнения компиляции и загрузки успешной?

Спасибо за помощь.

Phoebus1966
Пт 16 февраля 2018 г., 23:07
[victor_pv - Пт 16 февраля 2018 г., 19:07] - У этого есть 18 -битный разрешение по сравнению с 16 битами в PT8211, поэтому они не одинаковы или работают одинаково.
Спасибо за ответ.
Резолюция действительно отличается. Сэмплер Emax II, которым у меня есть 16-битный. Его схемы показывают PCM53 как выходные ЦАП для различных выходов. Однако места заняты ЦАП 1860 AD 1860, которые 18-битные. Биты ФРС ассоциируются как таковые, что 18-битный ЦАП ведет себя так же, как 16-битный ЦАП, когда дело доходит до получения результата.

Я должен был спросить, похож ли PT8211 похожим на PCM53, когда речь идет о 3 выводах последовательных данных LE, CLK и данных и полученного вывода.

victor_pv
Сб 17 февраля 2018 г. 1:18
Теперь я запутался, PCM53, который я могу найти в Google, представляет собой 16 -битный ЦАП, не похожий на PCM61, который является 18 -битным ЦАП, но PCM53 - параллельный ЦАП, поэтому я предполагаю, что это было опечатка.

Что касается PCM61, вы должны проверить таблицу данных каждого и решить для себя, соответствует ли он вашему применению.
Если ваш вопрос заключается в том, можете ли вы заменить один для другого без программного изменения, я бы предположил, что нет. PT8211 - это стерео ЦАП, и имеет CLK, Datain и WS (World Select), что заставляет входные данные перемещаться в один канал или другой. Он остается на высоком уровне для всего слова, а затем низко для всего следующего слова, и так далее. PCM61 - это ЦАП с одним каналом, и LE должен подниматься и вниз в конце каждого смены слова.

Мадиас
Пн, 05 марта 2018 г., 22:48
[Phoebus1966 - Пт 16 февраля 2018 г., 23:07] -
[victor_pv - Пт 16 февраля 2018 г., 19:07] - У этого есть 18 -битный разрешение по сравнению с 16 битами в PT8211, поэтому они не одинаковы или работают одинаково.
Спасибо за ответ.
Резолюция действительно отличается. Сэмплер Emax II, которым у меня есть 16-битный. Его схемы показывают PCM53 как выходные ЦАП для различных выходов. Однако места заняты ЦАП 1860 AD 1860, которые 18-битные. Биты ФРС ассоциируются как таковые, что 18-битный ЦАП ведет себя так же, как 16-битный ЦАП, когда дело доходит до получения результата.

Я должен был спросить, похож ли PT8211 похожим на PCM53, когда речь идет о 3 выводах последовательных данных LE, CLK и данных и полученного вывода.
Я не знаю, актуален ли ответ через месяц:
ЦАП EMAX II наверняка не i2s, но параллельны, потому что он был выпущен в конце 1980 -х годов, далеко за пределами «рождения» i2s :)
AD1860 оснащены «современным» протоколом, не уверен, что i2s или PCM (они оба тихо. Таким образом, должны быть разные изменения EMAX II, наверняка начались с PCM53, а затем с «современного» AD1860 - но они должны иметь совершенно разные схемы схемы. Как я помню, есть заметка STM для описания различных протоколов. (Я не могу найти это простым способом).

больше веселья с C ++, шаблонами и GPIO

32-битные таймеры

tone (), notone ()