CAN Rx Tx hattında kopma olduğunda Peripheral'ı tekrar başlatmak

Başlatan isoment01, 27 Mart 2020, 22:59:38

isoment01

Stm32f4 kullanıyorum. 2 board arasında can hattı kurdum. While döngüsünde sürekli veri transmit edip interrupt ile okuyorum. İletişim sırasında Tx hattını kestiğimde iletişim tekrar başlaması için mcu yu resetlemem gerekiyor ki bunu istemiyorum. Bunun yerine aklımda Tx hattı koptuğunda bir error handler'a gitmek ve burada Can periphral'ı deinit & init yapmak fakat setup için Cube Mx kullanıyorum ve cube mx'de CAN bus NVIC'lerinde Tx, Rx ve SCE interruptı var burda SCE int'inin ne işe yaradığı hakkında fikrim yok. Konu hakkında hert ürlü mantıklı fikre açığım. Yardımlarınızı bekliyorum.

e-zeki

SCE interrupt canbus üzerinde oluşan hatalarda tetiklenen ana interrupt handler. Error_CallBack fonksiyonu da bu interrrupt üzerinden tetikleniyor olması lazım.
CanHandleTypedef struct'ının içinde bir error register'ı var (ESR) hata kodları da can kütüphanesinde biryerlerde açıklanıyordu oradan bakarak bus fault, transmit error hepsini görebilir oluşan hataya göre de SCE nin içinde ya da Error_CallBack ile aksiyon alabilirsiniz.

isoment01

Hocam aslında tam da dedıgınız seyı yaptım ama olmadı ınterrupta dusuremedım. Ya aslında maintainable bi can hattı kurmak istiyorum. Şimdi hatta nasıl zarar verebilirim ve nasıl tamir edebilirim diye dusunuyorum aklıma sadece rx tx hattını cıkarmak gelıyor hata senaryosu olarak. Rx i cıkarınca get_error de hata olusmmuyor. Geri taktıgımda zaten sistem calısmaya devam ediyor. Tx'i cıkarınca ise  parametre hatası alıyorum. Tekrar takınca hattı transmit fonksiyonu duzelmıyor hala error_handler'a düsüyor. Ben'de Tx takılınca hattın bunu anlayıp periphral'a de-init ve init yaptırmak CAN'i tekrar baslatmak ıstıyorum.

yedurgun

İşlemcinin CAN registerları hakkında pek bilgim yok ancak Texas ın tms320 serisi işlemcilerde bu iş için ABO(Auto Bus-On) Register ı var can_init kısmında 1 kere 1 yapınca hat koptuktan sonra tekrar geldiğinde CAN donanımı çalışmaya devam ediyor. Böyle bir register var mı diye bakabilirsiniz.

isoment01

Alıntı yapılan: yedurgun - 18 Mayıs 2020, 13:52:57İşlemcinin CAN registerları hakkında pek bilgim yok ancak Texas ın tms320 serisi işlemcilerde bu iş için ABO(Auto Bus-On) Register ı var can_init kısmında 1 kere 1 yapınca hat koptuktan sonra tekrar geldiğinde CAN donanımı çalışmaya devam ediyor. Böyle bir register var mı diye bakabilirsiniz.
hocam evet aynı işi stm32 tarafında da yapan register var hatta cubemx'de bunun için bir ayar bile konulmuş problem durumunda tekrar başlatıyor.

PhD

Alıntı yapılan: isoment01 - 18 Mayıs 2020, 14:00:28hocam evet aynı işi stm32 tarafında da yapan register var hatta cubemx'de bunun için bir ayar bile konulmuş problem durumunda tekrar başlatıyor.
Peki siz kullanmadınız mı bu registeri, sizde işe yaramadı mı?
...hiç...

isoment01

Alıntı yapılan: PhD - 18 Mayıs 2020, 14:43:03Peki siz kullanmadınız mı bu registeri, sizde işe yaramadı mı?
Hocam kullandım şu an çalışıyor. O zamanlar bilmiyordum şu an konuya hakimim.

PhD

Alıntı yapılan: isoment01 - 18 Mayıs 2020, 17:02:39Hocam kullandım şu an çalışıyor. O zamanlar bilmiyordum şu an konuya hakimim.
Şu anda problem çözüldü mü, tam anlayamadım kusura bakmayın o yüzden soruyorum? Yoksa hala problem devam ediyor mu?
...hiç...

isoment01

Alıntı yapılan: PhD - 18 Mayıs 2020, 21:39:57Şu anda problem çözüldü mü, tam anlayamadım kusura bakmayın o yüzden soruyorum? Yoksa hala problem devam ediyor mu?
Problem çözüldü hocam.

RaMu

Alıntı yapılan: isoment01 - 18 Mayıs 2020, 17:02:39Hocam kullandım şu an çalışıyor. O zamanlar bilmiyordum şu an konuya hakimim.
Genelde kendimiz sorup kendimiz sorun çözdüğümüzde nasıl çözdüğümüzü aylar geçmeden paylaşıyoruz,
ileride aynı sorunla karşılaşan olursa yol gösterici oluyor.

Küçük bir örnekle taçlandırıp paylaşırsan tadından yenmez.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

isoment01

Alıntı yapılan: RaMu - 19 Mayıs 2020, 20:18:46Genelde kendimiz sorup kendimiz sorun çözdüğümüzde nasıl çözdüğümüzü aylar geçmeden paylaşıyoruz,
ileride aynı sorunla karşılaşan olursa yol gösterici oluyor.

Küçük bir örnekle taçlandırıp paylaşırsan tadından yenmez.
STM32 için arkadaşlar registerları takip ederlerse TEC, REC registerları bulunmakta bu registerların değerleri hata durumunda  hatanın önemi göre değişen sayılarla artmakta ve son değerleri 255. "Tx error counter ve Rx error counter". LEC registeri ise her zaman son hatanın tipini belirtiyor. Alabildiği değerlere karşılık gelen hata tiplerini arkadaşlar datasheette görebilirler. "Last Error Counter" Ayrıca error passive flag ve error warning flaglerde hata sayıları belirli bir sınırı geçerse set oluyorlar. Bunların hepsi donanımsal olarak STM32'nin CAN iletişimde yapılıyor. Eger hatta hata giderildiyse bir şekilde bu değerler yavaş yavaş düşmeye başlıyor. CubeMx'de automotic bus off management'ı işaretlersek bus off hatasında sisteme kendisi reset atıyor bizim hiç uğraşmamıza gerek yok. Bus off haricinde farklı hatalarda da bu mekanizma reset atıyor mu hatırlamıyorum eğer hata senaryosu yaparlarsa bu tiki enable edip error counter registerları takip ederlerse resetleme anında değerler sıfıra inicektir. Sayet böyle bir durum yoksa HAL_CAN_ActivateNofication adlı fonksiyonda  Rx interruptının yanında diger flagleri eklerlerse o hata durumlarında kendileri Error interruptında manuel resetleme yapabilirler. Error İnterruptı enable etmek için cubemx'i yine kullanabilirler.