STM32 Virtual Comport Hakkında.

Başlatan Emre_Tuncay_, 19 Aralık 2020, 13:02:55

Emre_Tuncay_

Bir projede virtual comport kullanmak istiyorum. Mikrodenetleyici olarak stm32 kullanıyorum. Terminal programlarına veri gönderme veri alma işlerini yaptım.

Ama ben ilk olarak virtual comport'u uart gibi kullanabileceği sanıyordum en azından bilgisayarda bir port açılıcak sanki bir usb/ttl dönüştürücü bağlanmış gibi çalışacak sanıyordum ama öyle değilmiş. MCU'ya reset attığımda veya kod attığımda o comport bir daha açılamıyor tekrar açılması için usb kablosunu çıkarıp takmak gerekiyor. Bu durumla karşılaşan bir çok insan olmuş internette.

Virtual comport ile tecrübesi olan var mı? Virtual comport'u sanki bir usb/ttl dönüştürücü gibi kullanma ihtimalim var mı? Bunu tecrübe den varsa bilgilendirebilir mi.

Tagli

Açıkçası STM32 üzerinde Virtual COMM Port deneyimim yok, ama normalde ben de senin düşündüğün gibi olmasını beklerdim. Bir cihaz resetlendiği zaman, USB host ile olan bağlantısı kopmalı, ve sistemi yeniden ayağa kaldırırken de bu bağlantıyı yeniden kurmalı. Yani, fiziksel olarak tak çıkar işlemi aynen yazılımsal olarak da yapılabilmeli. Düzgün tasarlanmış bir USB cihazının bu şekilde çalışması beklenir.

ST'nin kendi uC tarafındaki firmware'de ve bilgisayar tarafındaki aygıt sürücüsünde bir hata yapmış olmasına çok ihtimal vermiyorum (ama imkansız da değil tabi). Belki donanımda bir hata vardır. Bilgisayardaki USB host, bir cihazın takıp çıkarıldığını D+ veya D- hatlarındaki pullup dirençleri ile algılar. Bunu da STM32 içindeki yazılım kontrol eder. Bazı modellerde pullup dirençleri dahilidir, bazılarında ise haricen bağlanır ve bir GPIO bacağı ile kontrol edilir.

Kullandığın donanım (kart ve işlemci) nedir? Bir ihtimal acaba bir Blue Pill kullanıyor olabilir misin? Bunların bazı modellerinde bahsettiğim pullup direncinin olması gereken 1.5k yerine hatalı olarak 10k dizildiğini okumuştum, hatta galiba bendekiler de öyle idi. Bu durum acaba bir şeyleri bozuyor olabilir mi?

Bir de söz konusu cihaz USB portundan mı besleniyor yoksa kendi harici beslemesi var mı?
Gökçe Tağlıoğlu

Emre_Tuncay_

#2
@Tagli Bluepill kullanıyorum ama aynı uygulamayı stm32f407 discovery ile de denedim. Discovery ile ile çalışırken kablo tak çıkar yapmama gerek kalmamıştı terminal programını aç kapat yapınca düzeliyordu.
Cihazı 2. bir usb portuna bağlı stlink ile besliyorum.

Tagli

STM32F407'de pullup dirençleri dahili olarak işlemcinin içinde gömülü, o yüzden onun çalışıyor olması yukarıda bahsettiğim şüpheyi doğruluyor gibi.

Bence ilk kontrol edeceğin şey o direnç olmalı. Eğer hatalı değerde ise değiştir. Burada bu konudan bahsetmiş.
Gökçe Tağlıoğlu

z



STM32F103C8 USB tasarimlarimda D+ hattina 1K5 direnc ekliyor bu direnci de bir port pinine bagliyorum.

USB init rutinimde bu port pinini H yapip PCnin dikkatini cekiyorum.

Dolayisi ile bahsettiginiz problemleri asla yasamiyorum.

Bluepill kullanacagimda yaptigim ilk is D+ hattina bagli direnci sokmek oluyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

Evet doğru. Benim aklımdan çıkmış. Blue Pill'in tek sorunu hatalı direnç değeri değil. Bu direnç zaten bir GPIO pinine değil doğrudan 3.3 V hattında bağlanmış. Bu da sadece doğrudan USB'den beslendiği zaman doğru çalışacağı anlamına gelir. @z 'nin de dediği gibi, o direnci söküp eğer mümkünse 1.5k direnç ile bir GPIO pinine bağlantı yapmalısın. Yazılımda da bu pini sürecek bir sistem olmalı.
Gökçe Tağlıoğlu

Emre_Tuncay_

Geri dönüşlerinizi için teşekkürler.
Şimdi usb haberleşmesini detaylı bilmeyen biri olarak anlamak adına tekrar soracağım.
USB D+ pinine bir direnç takıyorsunuz bu direncide bir gpio ile sürüyorsunuz ki bilgisayar bir com port açsın bu sayede port hep açık kalıyor.

Ben ise bilgisayarın port açması için bu işi kabloyu tak çıkar yaparak yapıyorum anladığım kadarıyla bu şekilde tekrar bağlanabiliyorum.

z

#7
Bluepill tarafinda islerin sarpa sardigini anladiginda bu port pinini low yapip 100ms kadar sonra tekrar high yaparsan PC tarafi kabloyu sokulup takilmis diye anlar.

Yok MCU'ya yeni software attiysan zaten program kosmaya baslayip usb init yapmaya kalktiginda gene dedigim senaryo gerceklesir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

@Emre_Tuncay_ , durumu Com Port'tan bağımsız olarak düşün. Anlattıklarım tüm USB cihazlar için geçerli.

USB Host bir cihaz takıldığını nereden anlıyor? Bunun standartta tanımlanmış yöntemi (Low speed hariç) D+ hattında 1.5k direnç ile pullup yapmak. Host bunu gördüğü zaman yeni bir cihaz olduğunu anlıyor ve cihazı sorgulamaya başlıyor. Benzer şekilde, eğer bu pullup ortadan kalkarsa Host, cihazın söküldüğü sonucuna varıyor.

Bu durumda, dışarıdan beslenen bir cihaz bu bahsetmiş olduğun pullup pinini yönetmek zorunda. Bu aynı zamanda cihaza fiziksel olarak sökülmeden yazılımsal olarak sökülüp takılma imkanı sunuyor. Yani cihaz bilgisayara takılıyken yazılımsal olarak kendini sökebilir veya geri takabilir. Yapması gereken şey direnci bağlamak veya sökmek.

Önceki mesajımda dediğim gibi, OTG_FS donanımına sahip modeller (F407 gibi) bunu kendi içinde yapıyor. İlgili direnç işlemcinin içine gömülü. Ancak FS_Device donanımına sahip F103 gibi modellerde bu direnç yok, haricen bağlanması ve kontrol edilmesi gerek. Yani GPIO - Direnç - D+ şekilden bağlanmalı. Sen pini 1 yaptığın zaman 3.3 volta pullup yapmış gibi olacaksın.

Eğer cihazın kendi beslemesi yoksa ve doğrudan USB Host üzerinden besleniyorsa buna gerek olmayabilir. Direnci doğrudan 3.3 - Direnç - D+ şeklinde bağlayabilirsin. Bu durumda yazılımsal olarak söküp takma imkanın yok. Blue Pill'de de böyle yapılmış. Bu sebeple sen resetlesen bile o direnç sürekli olarak bağlı ve bilgisayar sökülüp takılmayı göremiyor.
Gökçe Tağlıoğlu

Emre_Tuncay_

Cevaplarınız sayesinde işi şimdi anladım. Birde stm32f103 ve f407 yi bu gözle bakarak denedim. Dediğiniz gibi çalışıyorlar. Ben bu gözle bakmamıştım. USB'den bağımsız sanki peer to peer haberleşme gibi düşündüğümden anlamam zorlaşmıştı.

Teşekkürler.

magnetron

merhaba

küçük bir soru sorayım

STM32F10x_StdPeriph_Examples

SPL de USB örnekleri hangi alt klasörde oluyor

Emre_Tuncay_

@magnetron

Ben cubeide kullanarak proje oluşturdum stdperiph kütüphanelerini kullanmadım. Örnek projede kullanmadım açıkcası ilgili driver'ları inceleyerek kullanmam gereken fonksiyonları kullandım.

e-zeki

Alıntı yapılan: z - 19 Aralık 2020, 13:53:21(Resim gizlendi görmek için tıklayın.)

STM32F103C8 USB tasarimlarimda D+ hattina 1K5 direnc ekliyor bu direnci de bir port pinine bagliyorum.

USB init rutinimde bu port pinini H yapip PCnin dikkatini cekiyorum.


Hocam Bu söylediğiniz F4 serisinde olan USB VBUS özelliğiyle aynı şey değil mi?

magnetron

Alıntı yapılan: Emre_Tuncay_ - 19 Aralık 2020, 16:19:32@magnetron

Ben cubeide kullanarak proje oluşturdum stdperiph kütüphanelerini kullanmadım. Örnek projede kullanmadım açıkcası ilgili driver'ları inceleyerek kullanmam gereken fonksiyonları kullandım.


hocam yararlandığınız videoları kaynakları paylaşır mısınız ? teşekkür

Emre_Tuncay_

#14
Alıntı yapılan: magnetron - 20 Aralık 2020, 11:56:54hocam yararlandığınız videoları kaynakları paylaşır mısınız ? teşekkür
https://www.youtube.com/watch?v=pC16Aon4crk
https://orkanmurat.wordpress.com/2018/06/15/stm32f4-ve-stm32cubemx-ile-usb-cdc-haberlesmesi/
https://www.youtube.com/watch?v=YZjnCOun1wU&t=491s

Yukarıdaki linklerde benim yazdığım kodun aynısını yazıyorlar incelemeniz faydalı olacaktır. Bir de Fırat Deveci'nin sitesinde paylaştığı yazı ve video genel anlamda iyi onu da incelemenizi öneririm. Linki aşağıda.

https://www.firatdeveci.com/stm32-virtual-com-port-uygulamasi/

Benzer bir uygulama yapacaksanız buradan sorarsanız bildiğim kadarıyla yardımcı olurum. İyi çalışmalar.