Перейти к содержанию

    

van_de_luxe

Участник
  • Публикаций

    14
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Трансивер nanoLOC

    Привет Начал заниматься MN5375V1 - nanoPAN 5375 - nanoLOC PWR Module У кого-нибудь есть описание протокола, примеры исходников? Очень тяжело и не понятно где искать документацию. На сайте производителя какие-то коровы на картинках и ничего полезного..
  2. Цитата(Timmy @ Oct 18 2017, 11:10) - не нужно каждый раз перезаписывать M0AR и NDTR, они помнят значение с предыдущей записи. - RX канал DMA можно настроить на кольцевой режим и больше вообще не трогать - в DMA_TX_STREAM->CR надо писать через "=" все флаги, а не один флаг через "|=", чтобы исключить операцию чтения периферийного регистра. В результате имеем, что для запуска пакета в 3 байта нужно выполнить лишь одну запись в DMA_TX_STREAM->CR. И эту запись можно выполнить в ответ на DRDY от АЦП, используя таймер и ещё один DMA канал, вообще без участия процессора, которому останется только данные из кольцевого буфера не спеша подбирать. Хотя я так не пробовал, может и не получится. перезаписывать нужно. M0AR помнит предыдущее значение, но мне не нужно принимать данные туда же, тем более в кольцевом режиме. Мне нужно их в память складировать если M0AR был 0x20000000 и перекачали 3 байта, он и останется 0x200000000, а не увеличится до 0x20000003. Изменяется скорее всего значения какого-то внутреннего регистра. Это я проверял NDTR уменьшается с каждым перекачанным байтом и его однозначно нужно заново выставлять С CR согласен итого минус одна операция Я правильно понял, что таймер вы предлагаете так использовать: Заранее сформировать значение CR завести DRDY на ногу счетчика таймера и активировать событие таймера для соотв. ему DMA. DMA таймера при этом настроить на режим память-память (вот тут сомнения будет ли он тогда запросы от таймера видеть) Получится так Заранее настраиваем DMA, кроме включения активируем таймер таймер срабатывает, пинает свой поток DMA, который делает запись в регистр CR и включает DMA SPI ждем прерывания RX transfer complete
  3. Цитата(arhiv6 @ Oct 17 2017, 19:08) А что вы подразумеваете под "200 нс на настройку DMA"? Это же делается один раз... А что за микроконтроллер используете? stm32f407, SCLK 168M Код //поток RX if(DMA_RX_STREAM->CR & DMA_SxCR_EN){     DMA_RX_STREAM->CR &= ~DMA_SxCR_EN;     while(DMA_RX_STREAM->CR & DMA_SxCR_EN){}; } DMA->DMA_RX_IFCR = DMA_RX_CL_ALL;    //очистка всех перываний DMA_RX_STREAM->M0AR = (uint32_t)pCurrBuffRx; DMA_RX_STREAM->NDTR = 3; DMA_RX_STREAM->CR |= DMA_SxCR_EN;                        //вкл потока //поток TX if(DMA_TX_STREAM->CR & DMA_SxCR_EN){     DMA_TX_STREAM->CR &= ~DMA_SxCR_EN;     while(DMA_TX_STREAM->CR & DMA_SxCR_EN){}; } DMA->DMA_TX_IFCR = DMA_TX_CL_ALL;            //очистка всех перываний DMA_TX_STREAM->M0AR = (uint32_t)&Mem4Tx; DMA_TX_STREAM->NDTR = 3; CS_ACTIVE(); DMA_TX_STREAM->CR |= DMA_SxCR_EN;                        //вкл потока __ADS_1672_RREF_DMA_TX_STREAM->CR |= DMA_SxCR_EN;        //вкл потока и этот код повторяется 2 раза, т.к. у меня 2 АЦП работают синхронно Цитата(Lmx2315 @ Oct 17 2017, 22:46) ..если данные постоянно идут - то надо по DMA писать по очереди в два буфера и обрабатывать их по очереди, причём обычно в настройках DMA уже продумано чтобы оно прыгало с одного буфера на другой , что у вас за микроконтроллер? если бы они шли постоянно, проблем бы не было. Между порциями данный есть пауза, в ней и вся проблема, ее нужно обрабатывать Цитата(arhiv6 @ Oct 17 2017, 23:18) Это если настроить DMA в режиме память->память. Вам нужно после импульса DR прочитать из SPI 4-ре байта в память? Если у вас STM32, попробуйте по прерыванию GPIO ножки, к которой подключен DR запускать чтение по SPI. А DMA настройте на режим периферия->память, с инкрементом указателя памяти и режимом цикличности + работу DMA по событию выставления SPI-ем флага "буфер приёмника не пуст" (RXNE) + включаете прерывания DMA по событию завершения половины обмена и по окончании обмена (HTIE и TCIE). И делайте всю обработку в этих прерываниях, когда в памяти накопится достаточно данных (а буфер можно выделить большой - сколько памяти хватит). Это уже вам сэкономит время. Не уверен, что так точно можно сделать, но вот как ещё можно доработать: если есть свободный таймер и второй канал DMA то можно не тратить время на обработку прерывания GPIO. Таймер настраиваем на подсчёт импульсов на ножке DR (считать будем до одного, т.е. обрабатывать каждый сигнал DR), этот сигнал запускает второй канал DMA, настроенное в режиме память->периферия для копирования в spi четырёх байт без циклического режима. А так как в SPI при записи происходит одновременно чтение, то получится после импульса DR копирование четырёх байт в память первым каналом DMA. Т.е. контроллер вообще может ничего не делать, только периодически отлавливая прерывания HTIF и TCIF от первого канала DMA. В любом режиме DMA может работать непрерывно, генерируя запросы к периферии и ожидая от нее готовности данных. В режиме SPI мастера после настройки и запуска SPI после каждого байта DMA пинает SPI, чтобы тот сгенерировал клок для очередного байта. И пинать будет до тех пор, пока NTDR>0, непрерывно. Прочитать нужно 3 байта По поводу прерываний - я так и делаю. EXTI->старт SPI-DMA->прерывание по окончанию транзакции DMA->и к началу. Времени на это не хватает, написал выше В режиме мастера SPI молотит свой клок без остановки! на какой размер DMA настроили, столько он и зафигачит непрерывным потоком. Если совсем быть точным, то я настраиваю для SPI и TX и RX. в TX подсовываю 3 пустых байта, как раз для того, чтобы SPI сгенерил клок (ножку TX вообще не настраиваю). А данные снимаю в прерывании rx_transfer_complete. После окончания приема и до следующего EXTI SPI должен молчать А вот с таймером мысль интересная, нужно посмотреть его возможности.. но сомневаюсь, что таймер способен запустить чужой DMA. То, что можно через DMA в таймер данные для генерации PWM подсовывать - это да Еще есть мысль использовать таймер в качестве сигнала CLK. Тогда можно будет настроить DMA и SPI на 100500 байт и запуском/остановкой таймера, то бишь клока регулировать процесс приема данных
  4. Цитата(XVR @ Oct 17 2017, 19:06) Гм, вы настраиваете DMA на каждую передачу? Неудивительно, что не успевает. А внешняя FPGA должна будет вам собирать байты по SPI и выдавать пачками в МК с буферизацией? Т.е. вы хотите сделать внешний буфер на FPGA потому что не смогли настроить нормально внутренний (DMA) в МК? А как его нужно настраивать? поделитесь секретом Если его настроить скажем сразу на 30 байт, он их все сразу и перекачает, непрерывно, а данные-то в АЦП по DR готовы. А приостанавливать и запускать работу DMA/SPI после каждых 3 байт это не сильно быстрее (и гемор там с SPI есть, что его за 1 байт до окончания нужно тормозить, чтобы корректно остановился), чем его настроить заново. Там и настройки то - адреса и размер указать, интерфейс запустить.
  5. Цитата(_pv @ Oct 17 2017, 17:03) контроллер не справляется это если spi ногодрыганием изображать что-ли? пересылкой данных должно дма заниматься никак процессор не трогая вообще, а у любых кортексовМ особенно с FPU для работы с флоат (хотя опять же ЗАЧЕМ?), и частотой под сотню МГц будет почти пара сотен тактов на каждый отсчёт АЦП, тут не то что ножкой дернуть по порогу, тут ФФТ можно успеть сделать. между двумя стробами DataReady 1600 нс переход в обработчик прерывания занимает около 200 нс еще около 200 нс на настройку DMA на чистую передачу данных на 20 МГц тратится 24*(1/20М)=1200 нс Одна неверная операция и начинаем терять данные В реальности, работая по прерываниям+DMA я пропускаю 1 отсчет из двух, т.к. настройка DMA и отладочный ногодрыг съедают еще пару сотен нс Цитата(magnum16 @ Oct 17 2017, 15:43) Я бы посоветовал Altera MAX 10. Примеры есть на https://marsohod.org/ , например. Стандартный программатор USB blaster называется. В этих ПЛИС есть встроенная память для прошивки или в них вообще прошивка как таковая это конфигурирование внутренней структуры, которая сохраняется без питания?
  6. Цитата(Flip-fl0p @ Oct 17 2017, 14:50) Если хотите применять ПЛИС тогда есть ли вообще смысл в МК ? Над этим я тоже думал, может и уберу
  7. Цитата(XVR @ Oct 17 2017, 14:21) Вы считаете, что если МК не успевает забрать данные по последовательному интерфейсу, то он успеет забрать те же данные по параллельному? Боюсь вас разочаровать, но просто 'передать данные на микроконтроллер' не сработает - нужно как то уменьшить их объем Почему же не сработает? скорость передачи будет минимум в 8 раз больше, а это освободит время на другие задачи. Да и обработка там не сложная (напряжение посчитать и с порогами сравнить), ее я в ПЛИС хочу сделать. В МК есть проблема с временем реакции на внешнее прерывание, ПЛИС должна справиться быстрее. Проблема не с объемом данных, а с задержками начала обмена
  8. Приветствую Решаю задачку получения данных с АЦП ADS1672 с частотой 625ksps. Контроллер с такой частотой данных уже не справляется (или справляется, но на пределе, что все время занимает работа с АЦП). Хочу перенести часть нагрузки на внешнюю ПЛИС, а именно чтение данных(3 байта в доп. коде) по SPI (на скорости 20, а в перспективе 30 Мбит/с), конвертирование данных в напряжение (float), подергать ножками в случае превышения порогов по напряжению, передать данные на микроконтроллер по к.н. параллельному интерфейсу Когда-то щупал FPGA, даже на verilog светодиодами поморгал, но сейчас в голове ничего не осталось. Подскажите какую ПЛИС можно выбрать для этих задач, сколько она примерно будет стоить, на чем лучше разрабатывать ПО (видел графические генераторы кода, verilog, vhdl.. , среды разработки), какой дешевый программатор к ним прикупить, и подскажите хороший источник примеров/исходников
  9. PIC16 XC8 запись во flash программ

    Нашел ошибку, вот правильный код, если кому понадобится Кодvoid UnlockSequence() {     PMCON2 = 0x55;     PMCON2 = 0xAA;     WR = 1;     NOP();     NOP(); } void WriteRowFlash(uint16_t adr){     uint8_t StatusGIE = GIE;     GIE = 0;     CFGS = 0;     PMADR = adr;     FREE = 0;     LWLO = 1;     WREN = 1;     PMDAT = 0xaaaa;     LWLO = 0;     UnlockSequence();     WREN = 0;     GIE = StatusGIE; }
  10. PIC16 XC8 запись во flash программ

    Контроллер PIC16LF1709 Компилятор XC8 Необходимо в контроллере хранить калибровочные поправки в возможностью изменения. Чтение и стирание памяти сделать получилось, делал как описано в даташите Кодuint16_t ReadWordFlash(uint16_t adr){     PMADR = adr;     CFGS = 0;     RD = 1;     NOP();     NOP();     return PMDAT; } void EraseRowFlash(uint16_t adr){     uint8_t StatusGIE = GIE;     GIE = 0;     PMADR = adr;     CFGS = 0;     FREE = 1;     WREN = 1;     //unlock sequense     PMCON2 = 0x55;     PMCON2 = 0xAA;     //start erase     WR = 1;     //wait     NOP();     NOP();     //wait ~2ms operation     WREN = 0;     GIE = StatusGIE; } А вот с записью проблемы. Делал по тому же даташиту, но в результате в памяти никаких изменений. (код сократил до записи в память 1 слова) Кодvoid WriteRowFlash(uint16_t adr){     uint8_t StatusGIE = GIE;     GIE = 0;     CFGS = 0;     PMADR = adr;     FREE = 0;     LWLO = 1;     WREN = 1;     PMDAT = 0xaaaa;     LWLO = 0;     //unlock sequense     PMCON2 = 0x55;     PMCON2 = 0xAA;     //wait     NOP();     NOP();         WREN = 0;     GIE = StatusGIE; } Подскажите, что делаю не правильно
  11. SPI slave

    ___Sergey___, выложи плиз конечный вариант. Я сейчас только начинаю с ПЛИС работать и тоже нужно spi slave реализовать
  12. Startup.S для stm32

    Компилю на Eclipse проект для платы STM32L-Discovery (взятый и адаптированный из TrueStudio) все бы ничего, да только выдает ошибку: Кодite/bin/../lib/gcc/arm-none-eabi/4.5.2/../../../../arm-none-eabi/lib/thumb2\libc.a(lib_a-init.o): In function `__libc_init_array': init.c:(.text+0x38): undefined reference to `_init' collect2: ld returned 1 exit status cs-make: *** [STM32L_Test_debug2.elf] Error 1[Libraries/CMSIS/CM3/DeviceSupport/ST/STM32L1xx/startup/TrueSTUDIO/startup_stm32l1xx_md.o] Error 1 у меня был еще 1 проект для другой платы, я сравнил sturtup файлы этих проектов и в том, который работает не было строчки Код... /* Call static constructors */    bl __libc_init_array ... т.е. файл выглядел такКод... LoopFillZerobss:   ldr   r3, = _ebss   cmp   r2, r3   bcc   FillZerobss /* Call the clock system intitialization function.*/   bl  SystemInit   /* Call the application's entry point.*/   bl    main   bx    lr     .size  Reset_Handler, .-Reset_Handler ... я убрал эту строчку и все отлично скомпилировалось, но программа работает не так как нужно В общем, вопрос такой что это за конструктор и что он делает в startup файле? может мне нужно его как то задействовать?
  13. Нужно чтото вроде cmx618 http://www.cmlmicro.com/products/twoway/cmx608_618.htm Проблема в том, что их заказать или трудно или очень долго. Хотелось бы еще варианты подыскать, которые чаще используют и легче добыть
  14. Задачка: кодирование-передача-раскодирование речи скорость передачи не более 8кБит/с Как я понимаю, нужен кодек с частотой семплирования от 8кГц