Jump to content
Sign in to follow this  
megavolt3101

Помогите с LIN шиной STM8S

Recommended Posts

Здравствуйте уважаемые форумчане. Пытаюсь связать два микроконтроллера по шине LIN. В качестве мастера выбрал контроллер STM8S103F3P6 (Его Usart умеет только LIN MASTER). В качестве ведомого выбрал STM8S208RBT6 (У него 2 Усарта, один из которых умеет быть ведомым LIN) Собрал на двух макетных платах. LIN трансивер TJA1020 Прием и передача работают нормально. Но как дошло дело до защиты от потери линии связи, тут возникли проблемы. После обрыва линии связи и ее восстановления связь возобновляется. Но вот после короткого замыкания шины LIN ведомое (SLAVE) устройство намертво виснет. Точнее виснет в обработчике прерывания от USART3. Я пытался принудительно очистить флаг приема по узарту (UART3_FLAG_RXNE) и флаг приема хедер байта (UART3_FLAG_LHDF). А также скидывал флаг брэйк байта (UART3_FLAG_LBDF). Ничего не помогает программа не возвращается из прерывания по приему от USART_3. Но зато если в этот момент с ведущего устройства снова подать команду, то работоспособность ведомого устройства восстанавливается. Тоже самое помогает, если в обработчике прерывания по USART_3 принудительно подать рандомную команду на передачу. То есть, так как линия одна, она сама свою же команду и принимает, получается. Вроде все нормально, но как то коробит такой колхозный способ защиты от короткого замыкания шины. Подскажите, может я забываю еще какой нибудь скинуть флаг при случае коротыша на линии LIN или есть еще каrой нибудь правильный способ обойти защиту от потери связи после кратковременного замыкания на шине. Надеюсь тут есть люди, которые что-то делали с шиной LIN ?

Прилагаю инициализацию для мастер устройства 
UART1_Init( 9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_LINBreakDetectionConfig( UART1_LINBREAKDETECTIONLENGTH_11BITS);
UART1_ITConfig( UART1_IT_RXNE_OR, ENABLE);
UART1_LINCmd( ENABLE);
enableInterrupts();

И для Ведомого устройства
UART3_Init( 9600, UART3_WORDLENGTH_8D, UART3_STOPBITS_1, UART3_PARITY_NO, UART3_MODE_TXRX_ENABLE);
UART3_LINConfig( UART3_LIN_MODE_SLAVE, UART3_LIN_AUTOSYNC_ENABLE,UART3_LIN_DIVUP_LBRR1);
UART3_LINBreakDetectionConfig( UART3_LINBREAKDETECTIONLENGTH_11BITS);
UART3_ITConfig( UART3_IT_RXNE_OR, ENABLE);
UART3_ITConfig( UART3_IT_LBDF, ENABLE);
UART3_ITConfig( UART3_IT_LHDF, ENABLE);
UART3_LINCmd( ENABLE);
enableInterrupts();

А также обработчик прерывания для ведомого устройства
//Обработчик прерывания для UART3.
INTERRUPT_HANDLER( UART3_RX_IRQHandler, 21)
{
if( UART3_GetFlagStatus( UART3_FLAG_LHDF)){recUART3_Header=UART3_ReceiveData8(); UART3_ClearFlag(UART3_FLAG_LHDF);}
if( UART3_GetFlagStatus( UART3_FLAG_RXNE)){recUART3_Data=UART3_ReceiveData8(); UART3_ClearFlag(UART3_FLAG_RXNE);}
if( UART3_GetFlagStatus( UART3_FLAG_LBDF)){ UART3_ClearFlag( UART3_FLAG_LBDF);}
if( UART3_GetFlagStatus(UART3_FLAG_OR_LHE)){UART3_SendData8(0x00);UART3_ClearFlag(UART3_FLAG_OR_LHE);}// Отправляю пустую команду через USART_3
}

Edited by megavolt3101

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Сообщения

    • Ответил: только что vt5 коллектором на базу vt6. r6 68k
    • Однажды долго не мог разобраться в странно себя ведущем Свене, оказалось был обрыв земляной дорожки у разъёма трансформатора, обрыв учинил сам владелец, когда подключал трансформатор после ремонта платы, разъём в плате китайцы не осадили до упора, вот он и сел оборвав дорожку, две остальные дорожки тоже отстали, но не оборвались.
    • Максимум параллельно  0,1 добавить электролит на 10uF. Смысла нет ставить больше , сам подумай.
    • Всем доброго времени суток! Есть китайский LED драйвер стабильного тока на 300 мА 75-108 вольт, (почти) без пульсаций. Но оказалось, что этого тока - многовато. Схема: Номиналы резисторов написаны внутри них. Резистор с маркировкой 3R30 напаян кустарно.  Вопросы: 1. Главное: как снизить ток до 200 или 250 мА? 2. Не распаян конденсатор, нарисованный красным. Есть ли в нём смысл? 3. Немного смущает, что на выходе только один выпрямительный диод. Есть ли смысл поставить туда мост? Может так уйдут мелкие пульсации, которые присутствуют на выходе? 4. Микросхема очень мелкая, 6-ногая, на крышке маркировка 2ACC9, гуглом не смог найти, что это. Можно ли отыскать её полное намиенование?   Спасибо.
    • Действительно имеется. Какая зависимость линейная, квадратичная, или ВЧХ построена самостоятельно, а може вообще векторное управление.  Есть тормозной резистор, нет, есть фильтр в звене постоянного тока или нет. Если тормозной (он же резистор слива, он же разгрузочный, итд) не установлен, то в данном режиме он был бы как бы совсем нелишним. Многие почему-то называют резистор тормозным. На деле он нередко подключается при всевожможных возмущенеиях и провалах момента нагрузки. Если ВЧХ построена таким образом, что выходное напряжение при 30 Гц почти не отличается от выходного напряжения при 50Гц, а это в настройках сделать легко, то панихидку по частотнику можно и не дождаться, зато двигателю это может не подойти. Её величество практика = она все знает.
    • Не может трансформатор сгореть вместе с предохранителем. Ну разве что вместо предохранителя гвоздь стоял... А если был такой жуткий "перепад" и по времени и по величине, что аж выгорел и трансформатор и предохранитель и 2050, то видимо там целых деталей осталось гораздо меньше, чем убитых.

  • Наборы Dupont проводов, папа и мама

  • Similar Content

    • By 9Klima
      Здравствуйте обитатели форума, вернулся к кодингу и на форум после лет 12 паузы.
      взялся за STM8 перед тем как штурмовть стм32 там уже получил по лбу когда-то и откотился.
      суть вопроса сконфигурировал второй таймер. второй канал на кристале STM8S103F3  как ШИМ1 всё класно работает гордость за не напрасно потраченное время на дробления  RM0016.
      наступил момент написания библиотеки для удобности обращения с шимом и тут началась эпопея:
      Сначала как посчитать что загрузить чтобы получить желаемую частоту, потом проверка всё на осциллограммах и тут на меня приходит озарение что наверное что то не так, временные интервалы до частоты 122Hz рросчитываются и совпадают.
      А после просто треш : тактовая частота HSI 16 000 000 без делителей прямо на вход таймера.
      PSCR =0;  ARR=65535;   Fout=244Hz
      PSCR =1;  ARR=65535;   Fout=121Hz
      PSCR =2;  ARR=65535;   Fout=60Hz
      PSCR =3;  ARR=65535;   Fout=30Hz
      PSCR =4;  ARR=65535;   Fout=15Hz
      PSCR =5;  ARR=65535;   Fout=7,59Hz
      PSCR =6;  ARR=65535;   Fout=3,8Hz
      PSCR =7;  ARR=65535;   Fout=1,91Hz
      PSCR =8;  ARR=65535;   Fout=0,98Hz
      Вроде всё гармонично но по факту както у меня не сошлось с расчётами. Там где должно быть 80 там 60. Я понимаю что встроенный генератор не блещет стабтильностью но всё равно что-то с расчётами не так либо я вообще не знаю что делаю не так.
      Fout= Fтактирования/([PSCR]+1)/([ARR]+1) тз сих выходит:
      PSCR =8;  ARR=65535;   Fout=???Hz
      16 000 0000/9/65536/=27Hz
      Что не так? где лыжи не едут?
      чувствую нужно срочно заказать частотомер для измерения до чёрто знаков дабы  невроз не лечить.
       
       
       
    • By n_angelo
      По приходящему на ножку A1 импульсу настроено прерывание. Прерывание должно отработать один раз и должно делать следующее: пауза 7 секунд, потом на 1,5 секунды открыть реле. Во время прерывания светодиод на плате гаснет и загорается в такт секундам. Код отрабатывает верно за исключением того, что прерывание отрабатывает 2 раза. Т.е. подали импульс, заморгал светодиод в течении 7ми секунд, потом щёлкнуло реле (открылось), затем опять щёлкнуло (закрылось), потом всё повторяется еще раз (7+1,5). В режиме дебага работает нормально. Пробовал отключать реагирование на прерывания во время его отработки:
      disableInterruupts(); ... enableInterruupts(); но не помогает.
      STM8S103F3P6
      Код прерывания
      Код в main.c
       
    • Guest User1324
      By Guest User1324
      Здравствуйте, помогите подключить USB-флешку к STM32F103RCT6, нужна дополнить принципиальную схему. Если есть возможность нарисовать.
    • By n_angelo
      Привет, знатоки. Написал свою первую программу для контроллера STM8L152C6T6 (STM8L-Discovery). Это, собственно, моя первая программа для контроллеров вообще. Я многого не знаю и не понимаю. Возможно ваш ответ на мой вопрос будет банален.
      Используемая периферия: DAC, DMA, TIM4, CLK, GPIO
      Задача у программы такая:
      В EEPROM зашит один период синусоиды с дискретизацией 44100Гц. Период занимает ровно 101 байт, что по сути должно быть равно 2,29мс (1/44100*101). В коде программы только конфигурация периферии, одно прерывание на кнопке и пустой бесконечный цикл, который ничего не делает. Всю работу выполняет таймер, который настроен выдавать запрос к DMA на каждые 1/44100 (ядро тактируется 2мГц, таймер считает до 45). В свою очередь DMA забирает из EEPROM по одному байту на каждый запрос от таймера и передаёт его в DAC. Далее DAC выводит бесконечную синусоиду на ногу PF0. Прерывание на кнопке запускает весь этот механизм и зажигает светодиод.
      Проблема:
      Измеряя ногу PF0 осциллографом было замечено, что период синусоиды занимает около ≈4мс. Фото под катом.
      Меня это расстроило. Экспериментально выяснилось, что стоит только вписать в бесконечный цикл какую-нибудь проверку, например, [если значение текущего байта синусоиды = 0xFF, то зажечь светодиод, если 0x00, то потушить], то осциллограф показывает правильный тайминг в 2(с копейками)мс. В принципе в теле цикла может быть что угодно, кроме пустоты, и тайминг налаживается.
      Я не могу отдебажить дизассемблер, т.к. его не знаю. Это у меня в планах. Но я очень хочу понять, что происходит и почему пустой цикл рушит тайминг.
      Спасибо.
       
       
       
       
    • By n_angelo
      Привет. Хочу узнать ваше мнение. Я новичок в embedded. Можно сказать, что пришел с веба. Малость Python, JS, C. Меня, конечно, предупреждали начать с AVR, но я уверенный в себе решил сразу залезть на STM32. Вынашивая идею для проекта, параллельно курив Reference Manual и Data Sheet по STM32, я понял что его будет слишком жирно для проекта. Я перескочил на STM8L. И тут меня начал огорчать мир embedded. При переходе между stm8 и stm32 нужно менять IDE (TrueStudio на STVD). Во избежание таких курьёзов я пересаживаюсь на IAR. В процессе подключения родной библиотеки от ST, понимаю что библиотека от IAR для того же самого STM8L152C6T6 дико отличается (макросы, структуры). Привет веб-разработка. Как такое могло произойти, что под один и тот же контроллер ST даёт одну библиотеку, а IAR другую. И нигде в уроках тебя не предупредят об этом. Ну, ребят, у меня всего одна жизнь. Вы уже договоритесь там между собой? Придите к единому стандарту. Или они так решили новичков завендерлочить? Моё мнение (не претендует на правильное): пробираясь сквозь тернии популярной архитектуры ARM, инфраструктуры, инструментария, забываешь про бизнес-логику устройств. А еще просто пропасть между "я ничего не понимаю" и "господи, я зажег светодиод". Речь не о копипастерах с уроков, а действительно понимая что ты делаешь, в каком регистре, что меняешь. Это путь в 2000 (а то и больше) страниц на английском перечитанных по несколько раз, чтобы отоложилось. И в конце тебя ждут разные версии одной и той же библиотки в разных IDE. И сидишь вдупляешь... ну почему... я же в правильный регистр кладу правильную маску... ох, наболело. Такое ощущение что не для людей это всё делали, не для людей.
      Ваше мнение?
×
×
  • Create New...