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

Oleg_IT

Свой
  • Постов

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

  • Посещение

Сообщения, опубликованные Oleg_IT


  1. Так не получается. Проект генерю из STM32CubeMx. Пока работаю только с датчиком температуры, подключены SO, SCK и CS. Если конфигурить SPI как Full-Duplex Master то программа виснет на чтении данных, если как Receive Only Msster то данные идут, но не полностью.

    SPI сконфигурю с DMA, когда наступает момент чтения температуры вызываю функции

        uint16_t Temp; // Значение измеренной температуры
    …………………………………………………
        HAL_GPIO_WritePin(GPIOA,CS_Termo_Pin,GPIO_PIN_RESET);
        HAL_SPI_Receive_DMA(&hspi1,(uint8_t*)&Temp,2);

    По окончанию работы DMA вызывается прерывание со статусом HAL_DMA_STATE_READY_MEM0, поднимаю пин CS

        HAL_GPIO_WritePin(GPIOA,CS_Termo_Pin,GPIO_PIN_SET);

     

    Но по осциллографу вижу, что CS отключает датчик температуры ровно посередине второго байта. Соответственно первый байт приходит, видно он меняется, второго байта нет. Почему так может быть? В какой момент отключать CS?

     

    Как правильно работать с несколькими девайсами ни одном SPI? Нужно и одно чтение и одна запись и Full-Duplex Master для третьего девайса.

     

  2. Есть готовый модуль с STM32F417, на нём стоит NAND. Как я понимаю, программа туда и записывается. Нужно сохранить несколько байт настроечной информации, периодически она может меняться. Как записать/считать данные и как выбрать адреса куда записывать в NAND, что бы там ни чего не испортить?

     

  3. Программу собрал на STM32CubeMX с ETH и LWIP, установки по умолчанию.

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

    АЦП заполняет буфер через DMA по циклу, генерятся прерывания HAL_DMA_STATE_READY_MEM0, HAL_DMA_STATE_READY_HALF_MEM0, в обработчике прерывания АЦП ставлю флаг и в главном цикле соответствующий буфер нужно передать по изернет. Cube ставит только инициализацию LwIP (MX_LWIP_Init();), а всё остальное, как я понимаю, нужно самому прописывать. Нашел только функции MX_LWIP_Process() и HAL_ETH_TransmitFrame(…). Также вижу инициализацию DMA для отправки и приёма данных своими внутренними буферами Tx_Buff и Rx_Buff.

    Индикация на изернет разъеме есть, зелёный слева, жёлтый мигающий справа.

    Как создать соединение? Средствами API LwIP? Как подставить в DMA для изернет свои буфера?

    В тех примерах, которые мне доступны на мои вопросы ответов не нахожу.

     

  4. STM32F417. Есть два дивайса, датчик температуры и управляемый резистор, из первого нужно только читать данные, во второй только писать, выводы MOSI, MISO развожу по соответствующим девайсам, CS понятно разные. SPI2 назначать как Full-Duplex Master?

     

  5. может ножку кварца не назначили для работы ?

    что за МК ?

    Да, именно не назначил. Разобрался, спасибо. МК STM32F417ZGT.

     

    А по Ethernet ни чего не можете подсказать.

     

    drozel. Этот МК у меня далеко не первый. А программу использую как хороший инструмент конфигурирования и сборки нужных библиотек и не важно *.lib там или *.c

  6. Установил STM32CubeMX. Всё вроде бы нормально, генерится, компилируются, но три вопроса остались.

    1. Не могу изменить частоту кварца HSI, по умолчанию 16 МГц, а на модуле 25.

    2. ARM должен работать с железкой по параллельному интерфейсу, 8 выводов GPIO могут быть и Input и Output. Но задать инициализацию выводов получается только на одно направление. Второе придётся руками дописывать?

    3 Где в модуле Ethernet задавать IP адрес, маску, адрес шлюза, DNS?

     

  7. А что вы будете делать когда чудо закончится и в какой-то момент все само работать перестанет, опечалитесь? :)

    Ручками буду работать, тем более, что на AVR UDP я полностью сделал, так что опыт есть. Хочется время сэкономить на таких вещах.

  8. забавно что вы как разработчик продукта нас спрашиваете как он работает6))))

    очевидно в 4 версии файл - драйвер мак уровня под ваш процессор был и чудом подошел к физике и ее подключению.

     

    Библиотека уже работает с этим мак драйвером

    Я разработчик продукта? Какого? Я про библиотеку изернет стека говорю от Keil, я её не разрабатывал:)

    Ну если такое чудо случилось, то я счастлив.

    В установленном пакете много чего про TCP есть. Как я понимаю там копать.

  9. Драйвер физики нужно дорабатывать. Могу предложить только то, чем пользуюсь сам на F407VET6. Для RTL8201CP. Да, и мой Вам совет - включайте все ручками. Вот в штатном драйвере инициализация ног явно попутана или как минимум требует доработки.

    А как в четвёртой версии изернет без доработки работает, я просто подключил библиотеку.

    Все остальное буду ручками делать, но изернетовский стек самому как то не хочется делать

  10. Дождался я макетки с целевым ARM STM32F417. Keil V4 не поддерживает этот процессор, поставил Keil V5.15, загрузил паки. Начал формировать проект и полезли проблемы.

    1. Включаю изернет, SPI пишет несовместимый, не установлено (Additional software components required),… На их сайте нашёл только описание библиотек, как загрузить не вижу.

    2. Не найду как включить АЦП.

    3. На плате физический уровень изернета реализован на RTL8201BL. В списке Manage … такого нет. В версии 4 выбора вообще нет, просто библиотека изернет без всяких уточнений.

     

    Загрузил паки для LPC. Моего старенького LPC2478 там нет. Перестали поддерживать или я чего не вижу?

     

  11. Вах!:) По EMAC не прав конечно, вот он какой есть, файлик этот LPC24_EMAC.c.

     

    Осознать бы, где чего смотреть. LPC24_EMAC.c из примера взято, собственно вся моя программа из примеров собрана, сам только собрал проект из ... двух проектов LEDClient и ADC.

    По поводу успевает ли приёмная сторона, период посылок 0.02 с (~45Гц), компьютер 3,4 ГГц 16Гб ОЗУ, думаю справляется. Но как я понимаю, если даже не справляется, то просто передача должна остановится, ошибки по памяти быть не должно.

    Как то она не предсказуемо падает, иногда минуты не работает, а иногда 10-15 минут работает. Поставил контроль выделяемой памяти, если адрес в очередном цикле меняется, то это фиксируется. Перед падением часто адрес менялся, но в пределах двух килобайт.

  12. Была подобная ситуация. Заряжал АЦП на однотактное преобразование, по завершении вычитывал и запускал опять на преобразоваеие. В итоге получалось, что АЦП подвисал через разные промежутки времени от секунд до минут. Из ситуации вышел следующим образом. Зарядил АЦП на циклическое преобразование, а результат вычитывал по флагу завершения. Это помогло. Может и у Вас нечто сходное?

    Скорей всего не та ситуация, осциллографом вижу что и таймер и АЦП продолжают работать, нет именно передачи.

     

    По поводу _EMAC_. Там же всё в библиотеке, исходников стека у меня нет.

  13. Посмотрел я шарком, ни чего интересного, просто нет очередной посылки, сервер пытается несколько раз достучатся до клиента, но безуспешно и всё останавливается.

    Если ставлю низкую скорость оцифровки программа всё равно вылетает, но позже, несколько минут работает.

     

    Еще может драйвер мак уровня поглядеть? Может там что-то мешает и данные застревают где-то на пересылках?
    А где и как его смотреть?
  14. А почему нельзя использовать ПВХ трубку по диаметру чуть меньше диаметра трубы ?

    Чуть меньше это уже не изолирование внутренней поверхности трубы, а просто одеть эту ПВХ на то, что идёт внутри.

     

    По поводу Киевского дядьки от zltigo. Вы же говорили о возможной реализации и я о том же, материал после термообработке может быть не только мягким, но и твёрдым.

     

    Вижу для себя два решения от halfdoom "тонкостенной пластмассовой вставки", но если подобрать по диаметру не получится то лак.

  15. Померил период обращения к функции main_TcpNet, максимум 6.5мкс,

     

    АЦП когда молотит, оно это делает в прерывании или по ДМА? Может реально на работу стека ресурса не остается?

     

    АЦП работает по прерыванию. Привожу код инициализации таймеров и АЦП.

    U32 ADCInit( U32 ADC_Clk )
    {
    /* Enable CLOCK into ADC controller */
    PCONP |= (1 << 12);
    
    AD0CR = ( 0x01 << NumCh ) | 	/* SEL=1,select channel 0~7 on ADC0 */
    	( N_ADC << 8 ) |  /* CLKDIV = Fpclk / 4000000 - 1 */ 
    	( 0 << 16 ) | 		/* BURST = 1, BURST */
    	( 0 << 17 ) |		  /* CLKS = 0, 11 clocks/10 bits */
    	( 1 << 21 ) |		  /* PDN = 1, normal operation */
    	( 0 << 22 ) |		  /* TEST1:0 = 00 */
    	( 4 << 24 ) |		  /* MAT0.1 */
    	( 1 << 27 );		/* EDGE = 0 (CAP/MAT singal falling,trigger A/D conversion) */ 
    
    /* If POLLING, no need to do the following */
    AD0INTEN = 0x100 | (0x01 << NumCh);		/* Enable interrupts */
    return (U32)install_irq( ADC0_INT, (void *)ADC0, HIGHEST_PRIORITY );
    }
    
    /*--------------------------- init ------------------------------------------*/
    unsigned int SetTimer9 = 0x0000400;
    //unsigned int SetTimer9 = 0x0000000ED;
    static void init(void)
    {
    PCONP	 |=  0x40001000;				   /* Enable for ADC Ethernet block */
    PINSEL1   |= 0x00054000;					/* Enable ADC&DAC Pins */
    
    T1MCR = (3 << 0);// /*| (1 << 3)*/ | (1 << 4);
    T1MR0 = TCNT - 1;
    //	install_irq( TIMER1_INT, (void *)Timer1, HIGHEST_PRIORITY );
    
    //	T0MCR = (1 << 3) | (1 << 4);  // MR1: Interrupt Reset
    T0MCR = (1 << 4);  // MR1: Reset
    T0MR1 = SetTimer9;
    T0EMR = (1 << 1) |	 // MAT0.1  P1[29]
    		(1 << 6)  // Set the corresponding External Match bit/output to 1 (MATn.m pin is 
    					// HIGH if pinned out).
    	   ;
    //	install_irq( TIMER0_INT, (void *)Timer0, 1);//HIGHEST_PRIORITY );
    
    ADCInit( ADC_CLK );
    }

    N_ADC расчётное и равно 512.

    TCNT - 1 такое что бы период таймера был 10 мс

    Таймер 1 работает на timer_tick.

  16. Забудьте. Материал расширяющийся возможен, но реализация из него чуда желаемого Вами - невозможна, ибо тонкостенная мягкая расширяющаяся трубка просто начнет складываться внутри трубы. Механика, блин :)

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

×
×
  • Создать...