Fpga'de calisan koda ek olarak bilgisayarda da calisan bir yazilima ihtiyac var. Ftdi ciplerinin kontrol edilebildigi iki kutuphane mevcut: D2XX kutuphanesi ve libftdi kutuphanesi. Bunlardan ilki ftdi'in hazirladigi kutuphane ve acik kaynak kodlu degil. Fakat dokumantasyonu guzel. Libftdi ise acik kaynak kodlu ama dokumantasyonu kotu. Onceleri libftdi kullaniyordum. Bu defa dokumantasyonu daha iyi oldugu icin d2xx kullanmaya niyetlendim ama ubuntuda kutuphaneyi yuklemeyi beceremedim. Libftdi ise ubuntunun "repository"lerinde var ve cok kolay yukleniyor. Herhangi bir paket programiyla (synaptic, aptitude vs..) yuklenebiliyor. Lbftdi fonksiyonlari hakkinda bilgi sahibi olunabilecek belki de tek yer kutuphanenin dokumantasyon web sitesi. http://www.intra2net.com/en/developer/libftdi/documentation/index.html adresindeki sitede her fonksiyonla ilgili kisa aciklamalar var. Ayrica kutuphaneyi kurduktan sonra /usr/share/doc/libftdi-dev/examples klasoru altinda 5-6 tane ornek kod var. Orneklerden simple.c ve serial_read.c kodlari cok yardimci oldu.
Program deneme programi oldugu icin faydali bir seyler yazmaya calismadim. Program 100 kere donen bir dongu icinde once klavyeden girilen sayiyi yolluyor, sonra fpgaden gelecek datayi bekliyor. Data geldiginde ise o degeri ekrana basiyor.
Program 3 esas kisma ayrilabilir: baslangic, yazma ve okuma. Su an yazilimi anlattigim icin yazma ve okuma tanimlarini yazilimin bakis acisindan yaziyorum. Ornegin cikis dedigim yazilimdan fpga'e giden demek.
Baslangic kisminin buyuk kismini ftdi'in bilgisayara kurdugu examples klasorundeki simple.c programindan yararlanarak yaptim. Iletisim hizini, data bicimini buradan belirliyoruz. Fpga'deki program 19200 baud, 1+8+1 bit (start+data+stop) seklinde oldugu icin yazilimi da ayni ayarlarda calistiriyorum.
Yazma kismi basit. Fpga, gelecek data icin surekli hazir oldugu icin bilgisayardan data yollama isi cabuk bitti. Tek yapilmasi gereken ftdi_write_data fonksiyonunu cagirmak.
Okumak en zor ve libftdi'yi ogrenmeyi gerektiren kisim. Dokumantasyonda okuma fonksiyonu hakkinda 1 satir aciklama yapilmis. Aciklamada fonksiyon cagirildiginda data alana kadar bekliyor mu yoksa data yoksa devam ediyor mu bahsedilmiyor. D2XX kutuphanesinin dokumantasyonunda bu durumdan acikca bahsediliyor ve iki durum icin de fonksiyonun nasil kullanilacagi anlatiliyor. Samples klasorundeki serial_read.c programina baktigimda data yoksa beklemedigini anladim. Fonksiyon dogru sekilde okudugu data sayisini dondugu icin, dondugu deger 0'dan farkli olana kadar dongu icinde cagirdim.
Programi test ederken dikkatimi ceken bir sey oldu. Ftdi cipinin icinde buffer var. Eger fpga'den data yollama sirasinda 1'den fazla data yollarasaniz, bilgisayar tarafindan okunmayanlar cipin icindeki buffera kaydediliyor ve bir sonraki okuma sirasinda yollaniyor. Yazdigim programi her defasinda 1 byte okuyacak sekilde yazdim. Ola ki fpga'den bilgisayara 2 byte yollandi, bu durumda bir sonraki okuma fpga o sirada ne gonderirse gondersin bir onceki seferde ne okuduysa onu gonderiyor. Bu ozelligi yollama ozelligi icin debounce filtresi olmadigi zaman farkettim.
Bir sonraki asamada VCM (Virtual COM Port) suruculerini kullanarak ayni isi yapmaya calisacagim.
Program kodlari buradan indirilebilir.
Hiç yorum yok:
Yorum Gönder