STM32F103C8'e ethernet çipi bağlamak

Başlatan z, 17 Eylül 2016, 18:33:38

PROTECH_

Alıntı yapılan: z - 30 Eylül 2016, 02:22:49
Tamam ENC28J60 kötü bir çip.


Hocam ben enc28j60 kullandım, Microchip'in kendi TCP/IP Stack library si ile.
8-bit bir 18f26k22(64Mhz) de Mcu uygulaması olarak gayet güzel performansı vardı.
SPI bus hızı düşük olursa problem yaşanıyor(asgari 10Mb miydi 1Mb miydi hatırlayamadım.). Bildiğim tek problemi bu.

Belki dışarıdan library yazılması açısından pek efektif olmayabilir, ama performansı fena sayılmaz.
En azından ben problem yaşamadım.

Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

hgs

Alıntı yapılan: gerbay - 30 Eylül 2016, 11:06:34
peki z bizi dinlediği için mi seçti o çipi? bizi o şekilde itham ediyorsun. bu konudaki görüşün nedir?

Ben ne itham edeceğim ortada her sey. Ben önermedim yazdın. Konunun 2. mesajında senin önerin enc.

Başka bir sürü zor şey önerdiğinde dikkate almıyor z orasını zaten biliyoruz. Kafasında var olanın peşinde. Ona uygun öneri gelince kabul ediyor atlıyor hemen ugrasıyor. Uzak bir öneri gelse kabul etmez.

Macli bir mcu kullan denemez. Denemez çünkü, bu 103c8 için bir sürü kod yazmış. Başka bir mcuya geçse o eski yazdıklarının çoğunu tekrar yazması gerekecek. En azından elden geçirmesi gerekecektir.

Burak B

Alıntı yapılan: hgs - 30 Eylül 2016, 11:56:07
Macli bir mcu kullan denemez. Denemez çünkü, bu 103c8 için bir sürü kod yazmış. Başka bir mcuya geçse o eski yazdıklarının çoğunu tekrar yazması gerekecek. En azından elden geçirmesi gerekecektir.

Yazılım Mühendisliğinin "Yazılım Kalitesi" konusundaki "Kalite Ölçüm" konuları nelerdir bakalım;



Dikkat ederseniz "Portability" çok yanlız bir arkadaş ve çok önemlidir. Portability olmazsa -maintanable- bir kod yazdım demek yanlış olur. ASM ile bile yazsanız bunu bir interface ile portable hale getirmeniz önemlidir. Böylece gerektiğinde farklı MCU' lar için bu fonksiyonlar yenilenebilir.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

#258
Arkadaşlar nerden başlayım bilemiyorum.

Amatör biri olarak ST'den çip önerisinde bulunmuştum ve kriterlerim Timer/PWM/ADC/sayısı, fiyat ve düşük pin sayısına göre zaten belirlemiştim.

STM32F103C8 önerisi hoşuma gitti. Kriterlerimin hepsine uyuyordu. Şimdi F103C8 in bir büyüğüne bile geçmem. Her işimi görüyorum.

STM32F103C8 konforundan şimdilik çok çok memnunum.

Ethernet çipi için istediğim öneride ilk isimlerden birisi ENC28J60 idi.

Kit resmi de verilmişti. Aurdunio için üretilen SD kart okuyucuyu sorunsuz ST kitimle de kullandığım için resmi verilen ENC28J60 kitine hemen kanım kaynadı. Aurdunio ile web server uygulaması falan yapanların projeleri internette görmüştüm tamam Aurdunio kütüphanesi ile bu iş oluyorsa ben de hayli hayli yaparım dedim.

@hgs'inin önerisini sırf seri iletişim yapıyor diye direk eledim.  Hatta bazı şeylerin hazır olduğunu bu yüzden daha yüzeysel kod yazmam gerektiği zannına kapıldım (öylemi bilmiyorum).

wireless önerilere doğrudan kulağımı tıkadım (laptoptaki wireles şifreleri aklıma geldi) Ulan bu şifreleme algoritmalarını nerde bulacağım da kodlayacağım çok uzun iş diye aklımdan geçirdim.

Gittigidiyor'da  çok makul fiyattan satıldığını da görünce balıklama atladım.

Neyse

@gerbay

Deneme amaçlı olarak uzun dataları 256 byte parçalara bölen UDP kodumu yazdım. Bunu 512 B paketlere çevireceğim.

Wireshark ile izleyerek parçalanmış paketlerin MF biti eşliğinde çıktığını görüyorum fakat bir süre sonra birleştirme için zaman aşımı oldu mesajı görüyorum.

Alıntı YapÖrneğin 512 byte dataları UDP ile 2 paket halinde yollamak istersem

1. IP paket headerda Fragment Offset=0x0000 ve MF=1
2. IP paket headerda Fragment Offset=0x0020 ve MF=0 yapmayacak mıyım?

İlk 256 byte gitti.

İkinci 256 byte için sonraki indexim 256/8=32 yani 0x20 olmalı diye düşündüm.

------------------

Gerbay sabah sana kızmış olarak uyandım.

Rüyamda Müteahhit imişim. Bina yapıyorum senle de ortakmışım sen satış işleri ile ilgileniyorsun. Müşteri geliyor ve apartman dairesi almak istiyor, hemen seni telefonla arıyorum şu numaralı daireyi ayır onu satıyorum diyorum.

Sende  ya ben IP blokların hepsini sattıydım, bahsettiğin daire de o bloklarda  diyorsun.

Ulen hesabıma bu dairelerin parasını da yatırmadı paraları hiç ediyor bu nasıl ortak diye yataktan kızgın şekilde fırladım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Eeee? Sorumun cevabı nerde?

Alıntı YapDeneme amaçlı olarak uzun dataları 256 byte parçalara bölen UDP kodumu yazdım. Bunu 512 B paketlere çevireceğim.

Wireshark ile izleyerek parçalanmış paketlerin MF biti eşliğinde çıktığını görüyorum fakat bir süre sonra birleştirme için zaman aşımı oldu mesajı görüyorum.

Alıntı
Örneğin 512 byte dataları UDP ile 2 paket halinde yollamak istersem

1. IP paket headerda Fragment Offset=0x0000 ve MF=1
2. IP paket headerda Fragment Offset=0x0020 ve MF=0 yapmayacak mıyım?

İlk 256 byte gitti.

İkinci 256 byte için sonraki indexim 256/8=32 yani 0x20 olmalı diye düşündüm.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Hocam sanki bazı şeyler esnetilmiş.

Mesela 60 Bytedan daha kısa paket olmaz deniyor bu yüzden çipin küçük paketleri 60 byte tamamla bitini aktif ettim.

Daha sonra wireshark da baktım kısa paketler dolaşıyor bahsettiğim biti kaldırdım bende 60 bytten dan kısa paketler yollamaya başladım ve sorun yok.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

एक होना

IP bloklarından güneye bakan 73 cü kat da daireniz var mı ? :)

z

Hepsini satmış paraların da üstüne konmuş.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

एक होना

Helal olsun. Gunun birinde Pestil gonderir.

z

Hercules programı ile fragmentation yapılmamış data transferi yapabiliyorum. Çok büyük dataları parçalara bölüm yolladığımda Wireshackdan paketlerin usulune uygun gittiğini görüyorum fakat Hercules yakalamıyor.

Herkules ile 1024 Byte'dan daha uzun data yollamaya kalktığımda sadece ilk 1024'ü yolluyor.

Acaba Hercules 1024 byte'dan fazla data mı yollayamıyor yoksa 1024 paketi aldığımda karşıdan aldım sonrakini yolla türünce bir cevap mı bekliyor?

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

Burak B

Osinato' yu kullanın. Hercules' e çok güvenmeyin. Hatta kendi socket kodunuzu yazmanız daha iyidir.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

#266
Alıntı YapHatta kendi socket kodunuzu yazmanız daha iyidir.

Güzel fikir.


mesaj birleştirme:: 01 Ekim 2016, 14:52:13

Delphi ile UDP den 4096 tane A harfi yollayıp ne olup bittiğini Wireshack ile izleyebilirsiniz.

Form üzerine bir buton ve UDP eklemeniz yeterli.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, StdCtrls;

type
  TForm1 = class(TForm)
    UDP: TIdUDPClient;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Buffer: array [0..4095] of byte;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
begin
  for i:=0 to 4095 do Buffer[i]:=$41;
  udp.Host := '95.0.177.1';
  udp.Port := $0001;
  udp.SendBuffer(Buffer,4096);
end;

end.



mesaj birleştirme:: 01 Ekim 2016, 15:14:54

İyiki de sormuşum.

UDP ile büyük data yollarken her defasında IP Paket içinde UDP paket hazırlayıp fragment ofset ve boylarını ve dataları yerleştiriyordum.

Meğersem alakası yokmuş.

İlk pakette IP paket + UDP paket
Diğerlerinde sadece Ip paket ve Data



mesaj birleştirme:: 01 Ekim 2016, 15:44:11

UDP ile 4096 Byte veri yollandığında

---------------------------------------

1. Paket  IP + UDP

IP len=1500
IP flag=0x2000 (Fragment dahil=0)
UDP Len=4104
UDP Data=1500-28=1472 Byte    (IP Header (20)+ UDP Headr(8) 28 byte)
Total UDP Data = 2104 - 8 = 4096
---------------------------------------

2. Paket  IP + Data

IP len=1500
IP flag=0x20B9 (Fragment=185)
Data=1500-20=1480 Byte

---------------------------------------

3. Paket  IP + UDP

IP len=1164
IP flag=0x0179  (Fragment=377)
Data=1164-20=1144 Byte

Şimdi bakalım.   1472 + 1480 + 1144 = 4096

Bu kadar anlaşılır örneği google'da bulamadım. Varsa da iyi aramak lazım.

Yalnız rama yazılacağı adresler biraz sıkıntılı. Yada burdaki hesabı ben beceremedim.

Adreslerin lineer arada boşluk olmamasını beklerdim.

1. paket alındığında 0000...1471 adreslerine yazılacak.
2. paketin başlangıç adresi  185*8=1480   
3. paketin başlangıç adresi  377*8 = 3016

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

z

#267
TCPde veri iletimi aşamalarının hikayesini kim anlatır?

Kabaca wiki, veri iletimini başlatma, veri iletimi ve sonlandırma aşamalarına değinmiş ama  Sequence  ve Ackowledgment numaraları ile biraz kafam karışık.




mesaj birleştirme:: 02 Ekim 2016, 14:27:42

Şu anki varsayımımda ENC çipli servere sadece 1 client bağlanıyor kabulünü yapacağım.

Bu şartlarda kodu yazabilmem lazım.

Fakat bunun için Seq ve Ack numaralarını iyi anlamak gerekiyor.

Yokmu yardımcı olacak?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#268
Explorerdan kendi IP mi yazıp yollayınca

Bana SYN , Sequence Num ve ACK Num geliyor.
Gelen Seq. Num  değerini 1 artırıp gidecek ACK olarak, Kendi Seq numaramı da gidecek Seq No olarak SYN/ACK flagları ile yolluyorum.

Bana ACK gelmesi lazım fakat bir süre sonra tekrar SYN geliyor.

TCP header, IP header boylarını doğru set ediyorum, Check sumları doğru hesaplıyorum Winshark bunlarda sorun da bildirmiyor?

Sorun hakkında fikriniz varmı?

-------------------------------------------

Explorer 49282 nolu porttan benim 80 nolu portuma TCP istekde bulunuyor ancak yukarıdaki sorun oluyor.

MCU'ma 80 nolu porttan gönderilmeyen TCP isteklerine cevap verme dersem hiç 80 nolu portdan bana istek gelmiyor.

Bu arada IP mask  vs ile hiç ilgim olmadı. Yanlış yoldamıyım?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

MC_Skywalker

Http yi 80 den istersin sma web server sana, ayrılmış herhangi bir porttan geri dönüş yapar