STM32F103C8 Keil deneme surumunde calisacak CDC ornek

Başlatan z, 14 Haziran 2021, 11:58:02

z

STM32F103C8 Keil deneme surumunde calisacakn CDC ornek ariyorum.

Olabilir mi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mr.engineer

Hocam, USB CDC'yi kastediyorsanız Youtube'da örnek çok, cubeMx ile rahatça yapabilirsiniz. Ben de geçen sene Keil'de yapmıştım. Bir sorun çıkmadı.

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

e-zeki

@z kbyte sınırını aşmadıkça sorun yok hocam sadece usb zaten aşmıyor sınırı

mr.engineer

Kendi sitesinden ücretsiz indirmiştim bir sorun yaşamadım. Deneme dediğiniz ücretli sürümü kullanıyorsunuz heralde. Bence sıkıntı olmaz

z

Kodlarimi kendim yazdigim icin ST nin ivir zivirlarini (CubeMX\ HAL vs vs) hic kullanmadim.
Bu nedenle CDC'yi kendi basima becerebilecegimi sanmiyorum. Ote yandan CubeMX, HAL vs de yuklemedim. Yuklemeyi de pek dusunmuyorum.

Bu sartlarda klasor icinde proje dosyasini tikladigimda derleyip calistirabilecegim bir ornek kodun linkini verebilirmisiniz?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

Ben STM32F407 için sıfırdan USB kütüphanesi yazarken bu kütüphaneden ilham almıştım. Ben class işine hiç girmedim ama adamın kütüphanesinde HID ve CDC ile ilgili bölümler de var gibi gözüküyor.
Gökçe Tağlıoğlu

mr.engineer

USB yazmak zor mu? UART, I2C, ADC falan bunları register seviyesinde yazıyordum ama USB denemedim hiç. USB'de farklı modlar vardı bir de. Anladığım kadarıyla zor bir protokol

Tagli

Alıntı yapılan: mr.engineer - 14 Haziran 2021, 16:03:18USB yazmak zor mu?

Zor, ama aşırı zor değil. Dediğim gibi, class işine girmedim hiç, sadece endpoint'lere ham veri transferi yaptım. O yüzden class'lar ile gelen ek bir zorluk varsa bilemeyeceğim.

Sanırım en zor kısım, cihaz bilgisayara bağlandığında gerçekleşen enumeration kısmını atlatmak. USB 2.0 resmi dokümanını iyice okuyup anlamak gerekiyor. Çok fazla ayrıntı var.

Beni en çok zorlayan şey ise STM32F407'nin OTG_FS donanımı oldu. Aslında pek çok şeyi otomatik yapacak şekilde tasarlanmış, ancak şeffaflıktan uzak ve erişimi zor bir buffer sistemi var. Dokümanda bununla ilgili konular bence yeterince açık anlatılmamış. Özellikle bir yerde - adres atamasının anlatıldığı bölüm - yapılması gereken işlemler sıralanmış ancak sıralama, USB 2.0 resmi dokümanında anlatılanın tersi. "Yanlış yazmış salaklar, bu ayrıntı gözlerinden kaçmış." demiştim. Ancak cihaz bir türlü çalışmadı. Sonunda anladım ki yanlış yazmamışlar, donanım o adımları USB 2.0 resmi dokümanındakinin tersi şeklinde gerçekleştirince çalışacak şekilde tasarlanmış.

Geliştirme sürecinde çakma Saleae lojik analizörün çok faydasını gördüm. Bu çakma klon cihaz 24 MHz örnekleme yapabiliyor ve bu da USB FS için sınır değer. Haliyle sık sık verileri kaçırıyordu. Ama hani derler ya, "Körlerin ülkesinde şaşılar kral olur" diye, işte o misal, ne olup bittiğini iyi kötü görmemi sağladı. O olmasaydı bu işin altından kalkamazdım.

Henüz el atmadım ama dokümanından anladığım kadarıyla F103, F042, F072, F303 gibi modellerde olan FS Device isimli donanım daha az özelliğe sahip olsa da daha şeffaf bir şekilde çalışıyor ve sanırım programlanması daha kolay olurdu.

Bu arada USB kütüphanesini önce C'de yazdım. Sonra C++ ve FreeRTOS'a geçirdim. Son hali de çok içime sinmedi, daha epey bir elden geçirmem gerek ama sıra gelmedi bir türlü.
Gökçe Tağlıoğlu

z

Turkiye'de kendi kendimize herhangi bir USB cihaz gelistirmek icin gerekli alt yapiyi veren herhangi bir kurs bilen var mi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

@z hocam, bu işi HAL, Cube falan kullanmadan register'lar ile yapan bizim gibi delilerin sayısı 3-5'i geçmez. Herkes CubeMX'te proje oluşturup geçiyor. Gerçi ST'nin USB kodlarının sıkıntılı olduğunu, neredeyse tüm işi kesme içinde yaptıklarını (benim C'de yazdığım ilk kod da böyle idi) ve bununla da kalmayıp kesme içinde malloc() çağırdığını okumuştum bir yerlerde. Duyduklarım doğru mudur, hala öyle midir bilemeyeceğim.

Neyse, sonuçta USB kursuna da pek talep olacağını sanmıyorum. O yüzden, muhtemelen kurs da yoktur. "Müşteri buluruz, çok tutar" diyorsan belki bu işe girebiliriz beraber. Gerçi benim de eksiğim çok ama çalışır hallederim :)
Gökçe Tağlıoğlu

z

Ben de cok tirmalayarak ST nin bir orneginden yola cikip HID RAW data transferi yapan kodlarimi gelistirdim. Yillardir pek cok projede sorunsuz kullaniyorum.

Fakat bu projede bile bazi noktalarin ayaklari havada.

Neyse;

Mevcut HID rutinlerimi ve desriptorlerimi yeni projeye aynen ekleyip

Device Desriptorde Class Code=0x02, SubClass degerini 0x00 yaptim.
Interface Descriptorde Class Code=0x02 SubClass degerini 0x02 yaptim. (CDC + Abstract Control Model)

Bu haliyle derledigimde windows Device Manager'da uzerinde unlem olan USB Serial Device donanimi bulunuyor.

Bu simdilik iyi bir haber.

HID rutinlerimde interface descriptorden hemen sonra HID desriptor geliyordu.
Simdi bu kismi da degistirmem gerekecek.

Bu dokumani izliyorum. https://cscott.net/usb_dev/data/devclass/usbcdc11.pdf


 
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

Alıntı yapılan: z - 14 Haziran 2021, 19:06:50HID rutinlerimde interface descriptorden hemen sonra HID desriptor geliyordu.
Simdi bu kismi da degistirmem gerekecek.
Interface'den sonra descriptor'ların nasıl sıralanması gerektiğinin bir kuralı var sanırım. Benim projede HID olmadığı için doğrudan Endpoint descriptor'lar geliyordu. Hatırladığım kadarıyla HID'ların descriptor'ları sayıca çok ve biraz da karışıklar. Bunların kendi aralarındaki sıralamalarının belli bir kuralı var mı acaba?

Bu arada, bazı class'larda özel ek descriptor'lar olmayabiliyor sanırım. Mass Storage Device bu şekilde idi. Sadece 2 tane bulk endpoint yeterli oluyormuş.

Alıntı yapılan: z - 14 Haziran 2021, 19:06:50Device Desriptorde Class Code=0x02, SubClass degerini 0x00 yaptim.
Interface Descriptorde Class Code=0x02 SubClass degerini 0x02 yaptim. (CDC + Abstract Control Model)

Bildiğim kadarıyla Device Descriptor'da güncel uygulama class code'un 0x00 yapılıp class tanımlamasının sadece Interface Descriptor'da yapılması yönünde. Ben o şekilde yapıyorum. Benim Interface Descriptor'daki class code'um 0xff (vendor specific class) oluyor tabi.
Gökçe Tağlıoğlu

z

Evet hatirladim. Device Decriptorde class codu 0x00 yapinca da 0x02 deki gibi calisiyor.

USB rutinleri ile ilgilenmeyeli yillar yillar oldu. O zaman bir program indirmis ve USB hattan gidip gelen datalari yakaliyordum ve hata yakalamada cok isime yariyordu. PIC projede bir yerlere yazmisimdir ama hatirlamiyorum. 1 aylik deneme suresi vardi.

Bu amacla hangi programi kullaniyorsun?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

O tür bir program aradım ama ücretsiz olan bir şey bulamadım. Ayrıca genelde Linux üzerinde çalıştığım için seçenekler de azalıyor.

Windows tarafında "USB Sniffer" gibi bir ismi olan, ikonu da ünlü beyaz köpek (Snoopy) olan .exe dosyası şeklinde bir program vardı. Yıllar önce denk gelmiştim. Bir de WireShark'ın eklentileri ile USB gözlemlemek mümkün oluyordu galiba. Uğraşmış ama başaramamıştım. Nerede sorun çıktığını hatırlamıyorum.

Geliştirme sürecini zor da olsa tamamen klon Saleae analizörü ile atlattım. Kendi yazılımları USB FS analiz edebiliyor. Enumeration kısmını atlattıktan sonra pek ihtiyaç kalmıyor zaten. Örnekleme hızı 24 MHz değil de 50+ falan olsa USB FS için yeterli aslında.

Normalde bu iş için profesyonel cihazlar da var. Özellikle USB HS ve tabi USB 3+ için şart. Hattın arasına girip paketleri grafiksel olarak gösteriyorlar. Fiyatları epey uçuk ama ciddi bir iş için bence gerekliler.

Ekleme: Yukarıda bahsettiğim programın adı SnoopyPro imiş. Windows XP için yazılmış.
Gökçe Tağlıoğlu