Yeni Wireless&Wired Ethernetli Projemin Prototip Çalışması

Başlatan haydarpasamikro, 10 Şubat 2013, 22:46:11

haydarpasamikro

LPC1343 tabanlı, RN-131C wifi modulu, ENC28J60 ethernet PHY. Program ve Debug için JTAG, SWD ve comport alternatifleri için konnektörleri. Dijital optik giriş-çıkışlar, harici eepromlar, vs.. işte. Ancak mikro yu lpc800 serisi M0+ SO20 pakete çevirmek düşüncesindeyim. Hem manuel montajı daha kolay. En azından benim prototip geliştirmelerim için. Ucuzda olacaktır. Maliyet önemli.

[IMG]http://img703.imageshack.us/img703/83/dsc1312r.jpg[/img]

Uploaded with ImageShack.us


[IMG]http://img35.imageshack.us/img35/3870/dsc1315z.jpg[/img]

Uploaded with ImageShack.us


[IMG]http://img138.imageshack.us/img138/8548/dsc1322db.jpg[/img]

Uploaded with ImageShack.us


Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

emrahmrcn

Elinize sağlık, Wifi Modulu nerden ve kaç paraya tedarik edebildiniz ?
Benim yaradılışımda bir ayrıcalık varsa o da TÜRK olmamdır. M.K ATATÜRK

Erhan YILMAZ


haydarpasamikro

#3
2 adet Wifi modülünü direct Microchip üzerinden aldık. Ancak önce gümrüğe takıldı. Numune deyince kurtardık. Şu an Microchip firması Rowing Networks ü satın aldığı için böyle direk veya bir Microchip distb. ile alınabilir. Biz seri üretime geçince Farnel ile alacağız.
Zaten tüm ürünleri de Farnel in sağlayıcısı Yıldırım Elkt. üzerinden aloyoruz. Biraz pahalı oluyor ancak gümrük ile uğraşmıyoruz.
RN-131 modülü UART ile verilen komutlarla ayarlanıyor. Aynı zamanda data aktarımı yapılıyor. Çok verimli çalışıyor. Daha önce Wiznet im bir modülünü denemiştim. Ancak testlerde randıman alamamıştım.

TEKSDATA Yazılım ve Otomasyon. Tekstil için Online Loom Monitoring ve Tekstil Yönetim ve Entegrasyon. Biraz da reklam oldu artık napalım.

Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Burak B

Enc28J60 için stack olarak ne kullanıyorsunuz ? Birde Yoğun trafik altında test ettiniz mi ? Bazı durumlarda cevap vermeyi kestiğine şahit olmuştum. Sizde de aynı sorun var mı diye merak ettim. lwIP 1.4.0 ile test etmiştim.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

haydarpasamikro

ENC28J60 ı ATmel AT89C51CC03 ile kendi hazırladığım fonksiyonlarla kontrol ediyorum. Yani Stack ler benim. Zaten ENC28J60 OSI fiziksel katmanı hallettiği için bana buffer ına yükleyeceğim veriyi hazırlamak düşüyor. Bu veri içerisinde:

Ethernet MAC frame, IP katmanı verisi, UDP data katmanı, ARP ve ICMP ping istekleri ve cevaplarını kendi oluşturduğum fonksiyonlarla hallediyorum.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Burak B

Anladım LPC1343 ile kontrol ettiğinizi sandım. Interrupt ile mi kullanıyorsunuz ?
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

haydarpasamikro

#7
Biliyoruz ki Microchip ENC28J60 ın yayınlanmış birçok ERRATA sı var. Bir kere bunları çok iyi takip edip silikon versiyonunu kıyaslamak gerekiyor. Şu an dediğiniz doğrudur. Ancak yazılımsal önlemlerle tüm sorunlar aşılabiliyor. Örnek vermek gerekirse ben bir buffer da kuyruktaki datayı göndermeden önce errata da ki yönlendirildiği gibi program satırlarını yazıp ilgili register lardaki bayrakları sıfırlamak, incelemek vs. işlemleri yapıyorum.
Bu arabirimin olduğu yüzlerce cihazlarımız 24 saat 3 vardiya çalışan birçok fabrikalarda sorunsuz çalışmaktadır. Benim evimdeki modem bile daha çok kitlenebiliyor.

mesaj birleştirme:: 12 Şubat 2013, 19:16:51

Resimdekiler yeni tasarım olacak ve LPC1343 e göre geliştirilecek. Yani elveda Atmel. Elveda AT89C51CC03.

mesaj birleştirme:: 12 Şubat 2013, 19:57:24

İnterrupt olayından ziyade gelen buffer kuyruğunda bekleyen paket sayıcının(EPKTCNT) değeri ön planda. Malum errata lar..
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Burak B

"... a healthy dose of paranoia leads to better systems." Jack Ganssle

magnetron

haydarpaşa hocam projenizden dolayı tebrik ederim

benim de yapmaya çalıştığım şey kendi tasarladığım PLC yi PC ye ethernet üzerinden bağlamak
PLC nin CPU olarak için OLIMEXin bir STM32F4 boardını kullanıyorum

bu boarddan PC ye UDP bir "text" mesajı göndermek için 2 ay uğraştım
sonuçta birbirine cross kabloyla bağlayınca gitti ancak mesaj

adsl modem router arada olunca bir türlü gönderememiştim

şimdi sizin mesajınızı görünce ,
OLIMEX boardda ARP protokolü olmadığı için gitmediğini düşünüyorum
arada router varken ARP ve ICMP protokolleri yazmak gerekiyor herhalde ( UDP için )
acaba bu protokoller için yararlandığınız örnekler var mı ?
yardımcı olabilir misiniz ?
teşekkür

haydarpasamikro

Ethernet Frame de giden gelen paket adres bilgisi MAC adresdir. Ancak IP paketleri IP adresleri ile haberleşir. Bu sebeple eğer gönderen, IP sini bildiği aygıta data gönderebilmesi için MAC adresini sorması gerekir. Bunu da ARP ile yapar. Karşı tarafta buna cevaben ReARP cevabı dönerek MAC adresini söyler. Bilgisayarlar ağdaki kayıtlı dinamik adresleri periyodik olarak tablolarından boşaltır. Yapacağınız devre, ethernet ile PC haberleşmesi yapacaksa PC den gelen ARP isteklerine cevap verebilmelidir.
ICMP ise ping olayıdır. Yani karşı tarafın varlığını anlamak için kullanılır. Cevap olarak REply yaparsınız.
ARP olsun ICMP olsun mutlaka bu protokolleri yazılımınız yürütebilmeli. Çünkü PC den devrenize bu isteklerde bulunulacaktır. Ayrıca dinamik IP adresleme kullanıyorsanız DHCP protokolünü de yürütebilmelisiniz. Yani devreniz IP sini karşı taraftan mı talep edecek?

Konuya giriş için ARP, RARP, ICMP request ve reply protokolleri frame yapılarını inceleyiniz. İsterseniz kendi örneklerimi de yayınlayabilirim.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

OG

Alıntı Yapİsterseniz kendi örneklerimi de yayınlayabilirim.
Yani lütfen. Forumda başka bir amaç mı var...
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

haydarpasamikro

Sizin kullandığınız mikro STM ve bunun kendi dahili ethernet birimi var değil mi? Benim geliştirdiğim uygulama ENC28J60 için?

mesaj birleştirme:: 12 Şubat 2013, 23:35:17

Fikir vermesi açısından ARP Request, Reply, ICMP Ping, reply, UDP paket haberleşme fonksiyonlarım..
Umarım faydalı olur..

//------------------------------------------------------------------------------------------------- 
void MAC_SendARPRequest(void){
	unsigned char i = 0;

		for(i = 0; i < 6; i++){
			ARPPacket.header.eth.destMacAddr[i] = 0xFF;					//Broadcast
			ARPPacket.header.eth.srcMacAddr[i] = property.ModuleMACAddr[i]; 		
		}

		ARPPacket.header.eth.type = ETHTYPE_ARP;			//ARP Ethernet Type
		
		ARPPacket.header.arp.hwtype = 1; 					//hardware type = ethernet
		ARPPacket.header.arp.protocol = ETHTYPE_IP;			//Protocol = IP
		ARPPacket.header.arp.hwlen = 6;						//Ethernet address 6 byte
		ARPPacket.header.arp.protolen = 4;					//IP len 4 byte
		ARPPacket.header.arp.opcode = ARP_OPCODE_REQUEST;	//Request ARP

		for(i = 0; i < 6; i++){
			ARPPacket.header.arp.srcMacAddr[i] = property.ModuleMACAddr[i];
		}
		for(i = 0; i < 4; i++){
			ARPPacket.header.arp.srcIPAddr[i] = property.ModuleIPAddr[i];
		}
		for(i = 0; i < 6; i++){
			ARPPacket.header.arp.destMacAddr[i] = 0;		//unknown
		}
		for(i = 0; i < 4; i++){
			ARPPacket.header.arp.destIPAddr[i] = property.ServerIPAddr[i];
		}

		for(i = 0; i < ARP_TRAILER_LEN; i++){		
			ARPPacket.trailer[i] = i + 'a';
		}

		ARPPacket.fcs = MAC_CalculateFCS(sizeof(struct stARPPacket) - 4, &ARPPacket.header.eth.destMacAddr[0]);	// -4 means no FCS included

		MAC_Write(sizeof(struct stARPPacket) - 4, &ARPPacket.header.eth.destMacAddr[0]);
}
//------------------------------------------------------------------------------------------------- 
void MAC_SendARPReply(void){
	unsigned char i = 0;

		for(i = 0; i < 6; i++){
			ARPPacket.header.eth.destMacAddr[i] = ARPRxPacket.header.eth.srcMacAddr[i];
			ARPPacket.header.eth.srcMacAddr[i] = property.ModuleMACAddr[i];			 		
		}

		ARPPacket.header.eth.type = ETHTYPE_ARP;			//ARP Ethernet Type

		ARPPacket.header.arp.hwtype = 1; 					//hardware type = ethernet
		ARPPacket.header.arp.protocol = ETHTYPE_IP;			//Protocol = IP
		ARPPacket.header.arp.hwlen = 6;						//Ethernet address 6 byte
		ARPPacket.header.arp.protolen = 4;					//IP len 4 byte
		ARPPacket.header.arp.opcode = ARP_OPCODE_REPLY;		//Reply ARP

		for(i = 0; i < 6; i++){
			ARPPacket.header.arp.srcMacAddr[i] = property.ModuleMACAddr[i];
		}
		for(i = 0; i < 4; i++){
			ARPPacket.header.arp.srcIPAddr[i] = property.ModuleIPAddr[i];
		}
		for(i = 0; i < 6; i++){
			ARPPacket.header.arp.destMacAddr[i] = ARPRxPacket.header.eth.srcMacAddr[i];
		}
		for(i = 0; i < 4; i++){
			ARPPacket.header.arp.destIPAddr[i] = ARPRxPacket.header.arp.srcIPAddr[i];
		}

		for(i = 0; i < ARP_TRAILER_LEN; i++){		
			ARPPacket.trailer[i] = i + 'a';
		}

		ARPPacket.fcs = MAC_CalculateFCS(sizeof(struct stARPPacket) - 4, &ARPPacket.header.eth.destMacAddr[0]);	// -4 means no FCS included

		MAC_Write(sizeof(struct stARPPacket) - 4, &ARPPacket.header.eth.destMacAddr[0]);
}
//------------------------------------------------------------------------------------------------- 
void MAC_Process_ARPReply(void){
	unsigned char i = 0;
			
		for(i = 0; i < 6; i++){
			if(property.ServerMACAddr[i] != ARPRxPacket.header.arp.srcMacAddr[i]){
			 	property.ServerMACAddr[i] = ARPRxPacket.header.arp.srcMacAddr[i];
			 	EEPROM_WriteByte(EEPROM_SERVERMAC_0_ADR + i, property.ServerMACAddr[i]);
			}
		}

		ARPStatus = ARPON;

		if(ModuleStatus == POWEROFF){
			RCCToPC_Power_On_Msg();
		}
}
//------------------------------------------------------------------------------------------------- 
void MAC_SendICMPRequest(void){
	unsigned char i = 0;	
		
		for(i = 0; i < 6; i++){
			ICMPPacket.header.eth.destMacAddr[i] = property.ServerMACAddr[i];
			ICMPPacket.header.eth.srcMacAddr[i] = property.ModuleMACAddr[i];
		}

		ICMPPacket.header.eth.type = ETHTYPE_IP;			//IP Ethernet Type

	   	ICMPPacket.header.ip.vhl = 0x45;
		ICMPPacket.header.ip.tos = 0x00;
		ICMPPacket.header.ip.len = ICMP_IP_LEN; 
		ICMPPacket.header.ip.ipid = 0x0000;
		ICMPPacket.header.ip.ipoffset = 0x0000;
		ICMPPacket.header.ip.ttl = 64;
	   	ICMPPacket.header.ip.proto = IP_PROTO_ICMP;
		ICMPPacket.header.ip.ipchksum = 0x0000; //warning! must be zero before calc

		for(i = 0; i < 4; i++){
			ICMPPacket.header.ip.srcIPAddr[i] = property.ModuleIPAddr[i];
			ICMPPacket.header.ip.destIPAddr[i] = property.ServerIPAddr[i]; 
		}

		ICMPPacket.header.icmp.type = ICMP_TYPE_ECHOREQUEST;
		ICMPPacket.header.icmp.icode = 0x00;
		ICMPPacket.header.icmp.icmpchksum = 0x0000; //warning! must be zero before calc
		ICMPPacket.header.icmp.id = 0x0000;
		ICMPPacket.header.icmp.seqno = 0x0000;

		ICMPPacket.header.ip.ipchksum = MAC_CalculateCRC(IP_HEADER_LEN, &ICMPPacket.header.ip.vhl);
		ICMPPacket.header.icmp.icmpchksum = MAC_CalculateCRC(ICMP_LEN, &ICMPPacket.header.icmp.type); 

		for(i = 0; i < ICMP_TRAILER_LEN; i++){		
			ICMPPacket.trailer[i] = i + 1;
		}

		ICMPPacket.fcs = MAC_CalculateFCS(sizeof(struct stICMPPacket) - 4, &ICMPPacket.header.eth.destMacAddr[0]);	// -4 means no FCS included

		MAC_Write(sizeof(struct stICMPPacket) - 4, &ICMPPacket.header.eth.destMacAddr[0]);
				
}
//------------------------------------------------------------------------------------------------- 
void MAC_SendICMPReply(void){
	unsigned char i = 0;	
		
		for(i = 0; i < 6; i++){
			ICMPPacket.header.eth.destMacAddr[i] = ICMPRxPacket.header.eth.srcMacAddr[i];
			ICMPPacket.header.eth.srcMacAddr[i] = property.ModuleMACAddr[i];
		}

		ICMPPacket.header.eth.type = ETHTYPE_IP;			//IP Ethernet Type

	   	ICMPPacket.header.ip.vhl = 0x45;
		ICMPPacket.header.ip.tos = 0x00;
		ICMPPacket.header.ip.len = ICMP_IP_LEN; 
		ICMPPacket.header.ip.ipid = 0x0000;
		ICMPPacket.header.ip.ipoffset = 0x0000;
		ICMPPacket.header.ip.ttl = 64;
	   	ICMPPacket.header.ip.proto = IP_PROTO_ICMP;
		ICMPPacket.header.ip.ipchksum = 0x0000; //warning! must be zero before calc

		for(i = 0; i < 4; i++){
			ICMPPacket.header.ip.srcIPAddr[i] = property.ModuleIPAddr[i];
			ICMPPacket.header.ip.destIPAddr[i] = ICMPRxPacket.header.ip.srcIPAddr[i]; 
		}

		ICMPPacket.header.icmp.type = ICMP_TYPE_ECHOREPLY;
		ICMPPacket.header.icmp.icode = 0x00;
		ICMPPacket.header.icmp.icmpchksum = 0x0000; //warning! must be zero before calc
		ICMPPacket.header.icmp.id = ICMPRxPacket.header.icmp.id;
		ICMPPacket.header.icmp.seqno = ICMPRxPacket.header.icmp.seqno;

		ICMPPacket.header.ip.ipchksum = MAC_CalculateCRC(IP_HEADER_LEN, &ICMPPacket.header.ip.vhl);
		ICMPPacket.header.icmp.icmpchksum = MAC_CalculateCRC(ICMP_LEN, &ICMPPacket.header.icmp.type); 

		for(i = 0; i < ICMP_TRAILER_LEN; i++){		
			ICMPPacket.trailer[i] = ICMPRxPacket.trailer[i];
		}

		ICMPPacket.fcs = MAC_CalculateFCS(sizeof(struct stICMPPacket) - 4, &ICMPPacket.header.eth.destMacAddr[0]);	// -4 means no FCS included			

		MAC_Write(sizeof(struct stICMPPacket) - 4, &ICMPPacket.header.eth.destMacAddr[0]);	
		
}
//------------------------------------------------------------------------------------------------- 
void MAC_Pseudo(void){
	unsigned char i = 0;

		for(i = 0; i < 4; i ++){
			Pseudo.srcIPAddr[i] = UDPPacket.header.ip.srcIPAddr[i];
			Pseudo.destIPAddr[i] = UDPPacket.header.ip.destIPAddr[i];
		}

		Pseudo.psdnull = 0x00;
		Pseudo.proto = UDPPacket.header.ip.proto;		 
		Pseudo.len1 =  UDPPacket.header.udp.udpLen;
		Pseudo.srcPort = UDPPacket.header.udp.srcPort;
		Pseudo.destPort = UDPPacket.header.udp.destPort;
		Pseudo.len2 = UDPPacket.header.udp.udpLen;
		Pseudo.psdchksum = UDPPacket.header.udp.udpchksum;
		
		
		for(i = 0; i < UDP_DATA_LEN_24; i ++){
			Pseudo.psddata[i] = UDPPacket.udpdata[i];
		} 
}
//------------------------------------------------------------------------------------------------- 
void MAC_SendUDPPacket(void){
	unsigned char i = 0;	 	
	unsigned char count;

		count = GetRccToPCMACMsgPackCount(MACTxMessage[0][1]);	

		for(i = 0; i < 6; i++){
			UDPPacket.header.eth.destMacAddr[i] = property.ServerMACAddr[i];
			UDPPacket.header.eth.srcMacAddr[i] = property.ModuleMACAddr[i];
		}

		UDPPacket.header.eth.type = ETHTYPE_IP;			//IP Ethernet Type

		UDPPacket.header.ip.vhl = 0x45;
		UDPPacket.header.ip.tos = 0x00;
		
		if(count == 1){
			UDPPacket.header.ip.len = UDP_IP_LEN_8; 
		}else{
			UDPPacket.header.ip.len = UDP_IP_LEN_16; 
		}

		UDPPacket.header.ip.ipid = 0x0000;
		UDPPacket.header.ip.ipoffset = 0x0000;
		UDPPacket.header.ip.ttl = 64;
	   	UDPPacket.header.ip.proto = IP_PROTO_UDP;
		UDPPacket.header.ip.ipchksum = 0x0000; //warning! must be zero before calc
		
		for(i = 0; i < 4; i++){
			UDPPacket.header.ip.srcIPAddr[i] = property.ModuleIPAddr[i];
			UDPPacket.header.ip.destIPAddr[i] = property.ServerIPAddr[i]; 
		}

		UDPPacket.header.udp.srcPort = property.ModulePortNo;
		UDPPacket.header.udp.destPort = property.ServerPortNo;

		if(count == 1){
			UDPPacket.header.udp.udpLen = UDP_LEN_8;
		}else{
			UDPPacket.header.udp.udpLen = UDP_LEN_16;
		}

		UDPPacket.header.udp.udpchksum = 0x0000; //warning! must be zero before calc 

		for(i = 0; i < 8; i ++){	//UDP_DATA_LEN
			UDPPacket.udpdata[i] = MACTxMessage[0][i];
			UDPPacket.udpdata[i+8] = MACTxMessage[1][i];
			UDPPacket.udpdata[i+16] = MACTxMessage[2][i];
		} 		

		UDPPacket.udpdata[8] = (0x80 | ModuleID);
		UDPPacket.udpdata[16] = (ModuleID);	 
			

		MAC_Pseudo();

		UDPPacket.header.ip.ipchksum = MAC_CalculateCRC(IP_HEADER_LEN, &UDPPacket.header.ip.vhl);

		if(count == 1){
			UDPPacket.header.udp.udpchksum = MAC_CalculateCRC(sizeof(struct stPseudo) - 16, &Pseudo.srcIPAddr[0]);
		}else{
			UDPPacket.header.udp.udpchksum = MAC_CalculateCRC(sizeof(struct stPseudo) - 8, &Pseudo.srcIPAddr[0]);
		} 

		UDPPacket.fcs = MAC_CalculateFCS(sizeof(struct stUDPPacket) - 4, &UDPPacket.header.eth.destMacAddr[0]);	// -4 means no FCS included

		if(count == 1){
			MAC_Write(sizeof(struct stUDPPacket) - (16 + 4), &UDPPacket.header.eth.destMacAddr[0]);	// 24 max data len - 8= 16 + 4(fcs)
		}else{
			MAC_Write(sizeof(struct stUDPPacket) - (8 + 4), &UDPPacket.header.eth.destMacAddr[0]); 	// 24 max data len - 16= 8 + 4(fcs)	
		}
} 
//------------------------------------------------------------------------------------------------- 
void MAC_ProcessARPRxPacket(void){
		
		MemCopyString(&MACRxBuffer[0], &ARPRxPacket.header.eth.destMacAddr[0], MACRxDataLen);	  	


		if(ARPRxPacket.header.arp.opcode == ARP_OPCODE_REQUEST){
			if(	(ARPRxPacket.header.arp.destIPAddr[0] == property.ModuleIPAddr[0]) && 
				(ARPRxPacket.header.arp.destIPAddr[1] == property.ModuleIPAddr[1]) &&
				(ARPRxPacket.header.arp.destIPAddr[2] == property.ModuleIPAddr[2]) && 
				(ARPRxPacket.header.arp.destIPAddr[3] == property.ModuleIPAddr[3])){
					MAC_SendARPReply();					
			}
		}else{
			if(ARPRxPacket.header.arp.opcode == ARP_OPCODE_REPLY){
		   		MAC_Process_ARPReply();
			}
		}

		//Reply
		//RARP Req
		//RARP Reply	

}
//------------------------------------------------------------------------------------------------- 
void MAC_ProcessICMPRxPacket(void){
		
		MemCopyString(&MACRxBuffer[0], &ICMPRxPacket.header.eth.destMacAddr[0], MACRxDataLen);

		if(ICMPRxPacket.header.icmp.type == ICMP_TYPE_ECHOREQUEST){	  					 
			MAC_SendICMPReply();   		
		}else{
			if(ICMPRxPacket.header.icmp.type == ICMP_TYPE_DESTUNREACH){	  					 	
		   		if(ICMPRxPacket.header.icmp.icode == ICMP_CODE_PORTUNREACH){
					PortLostStatus = 1;
				}	  					 	
			}else{
				if(ICMPRxPacket.header.icmp.type == ICMP_TYPE_ECHOREPLY){
					ICMPStatus = 1;					  					 	
				}
			}
		} 	
		
		
			
		//Echo Reply		
		//Time exceeded	  
}
[hr][size=1][color=silver]mesaj birleştirme:: [time]1360705287[/time][/color][/size][hr]
Başlık Bilgileri ise..

En azından nasıl olabileceği hakkında fikir verir..

//-------------------------------------------------------------------------------------------------
//Ethernet Header & Defs --------------
struct stEthHeader{
		unsigned char destMacAddr[6];
		unsigned char srcMacAddr[6];
		unsigned int type;
};
#define ETH_HEADER_LEN		14
#define ETHTYPE_IP  		0x0800
#define ETHTYPE_IP_HIGH		0x08
#define ETHTYPE_IP_LOW		0x00
#define ETHTYPE_ARP 		0x0806
#define ETHTYPE_ARP_HIGH	0x08
#define ETHTYPE_ARP_LOW		0x06

#define ETHTYPE_OFFSET			12		//starting from 0 ethernet type 12-13. byte
#define IP_PROTOCOL_OFFSET		23		//starting from 0 ip protocol 23.byte
#define DESTMAC_ADDRESS_OFFSET	0
#define DESTIP_ADDRESS_OFFSET	30

//ARP Header & Defs -------------------
struct stARPHeader{
		unsigned int 	hwtype;
		unsigned int 	protocol;
		unsigned char 	hwlen; 		
		unsigned char	protolen;
		unsigned int	opcode;
		unsigned char	srcMacAddr[6];
		unsigned char	srcIPAddr[4];
		unsigned char	destMacAddr[6];
		unsigned char	destIPAddr[4];
}; 
#define ARP_HEADER_LEN		28		
#define ARP_OPCODE_REQUEST  1
#define ARP_OPCODE_REPLY    2
 
//IP Header & Defs --------------------
struct stIPHeader{
		unsigned char	vhl;
		unsigned char	tos;
		unsigned int	len;
		unsigned int	ipid;
		unsigned int	ipoffset;
		unsigned char	ttl;
		unsigned char	proto;
		unsigned int	ipchksum;
		unsigned char	srcIPAddr[4];	
		unsigned char	destIPAddr[4];
};	 
#define IP_HEADER_LEN   20
#define IP_PROTO_ICMP   1
#define IP_PROTO_UDP    17

//ICMP Header & Defs ------------------
struct stICMPHeader{
		unsigned char	type;
		unsigned char	icode;
		unsigned int	icmpchksum;
		unsigned int	id;
		unsigned int	seqno;
};	
#define ICMP_HEADER_LEN 8
#define ICMP_TYPE_ECHOREPLY     0
#define ICMP_TYPE_ECHOREQUEST   8
#define ICMP_TYPE_DESTUNREACH   3
#define ICMP_CODE_PORTUNREACH   3

//UDP Header & Defs -------------------
struct stUDPHeader{
		unsigned int srcPort;
		unsigned int destPort;
		unsigned int udpLen;
		unsigned int udpchksum;
};
#define UDP_HEADER_LEN  8 

//Ethernet/ARP Header -----------------
struct stEthARPHeader{
		struct stEthHeader	eth;
		struct stARPHeader	arp;
};
//ARP Packet --------------------------
#define ARP_TRAILER_LEN		18	//MIN Ethernet(64) - FCS(4) - ETH_HEADER_LEN(14) - ARP_HEADER_LEN(28) = 18
struct stARPPacket{
		struct stEthARPHeader	header;
		unsigned char trailer[ARP_TRAILER_LEN];
		unsigned long fcs;
};
struct stARPPacket xdata ARPPacket;	
struct stARPPacket xdata ARPRxPacket;

//The Ethernet/IP/ICMP headers --------
struct stIPICMPHeader{
		struct stEthHeader	eth;
		struct stIPHeader	ip;
		struct stICMPHeader	icmp;
};
//ICMPPacket --------------------------
#define ICMP_TRAILER_LEN	32
#define ICMP_IP_LEN			(IP_HEADER_LEN + ICMP_HEADER_LEN + ICMP_TRAILER_LEN)
#define ICMP_LEN			(ICMP_HEADER_LEN + ICMP_TRAILER_LEN) 
struct stICMPPacket{
		struct stIPICMPHeader header;
		unsigned char trailer[ICMP_TRAILER_LEN];
		unsigned long fcs;
};
struct stICMPPacket xdata ICMPPacket;
struct stICMPPacket xdata ICMPRxPacket;

//Ethernet/IP/UDP headers -------------
#define UDP_DATA_LEN_8		8
#define UDP_DATA_LEN_16		16
#define UDP_DATA_LEN_24		24
#define UDP_IP_LEN_8		(IP_HEADER_LEN + UDP_HEADER_LEN + UDP_DATA_LEN_8)
#define UDP_IP_LEN_16		(IP_HEADER_LEN + UDP_HEADER_LEN + UDP_DATA_LEN_16)
#define UDP_IP_LEN_24		(IP_HEADER_LEN + UDP_HEADER_LEN + UDP_DATA_LEN_24)
#define UDP_LEN_8			(UDP_HEADER_LEN + UDP_DATA_LEN_8)
#define UDP_LEN_16			(UDP_HEADER_LEN + UDP_DATA_LEN_16)
#define UDP_LEN_24			(UDP_HEADER_LEN + UDP_DATA_LEN_24)
 
struct stIPUDPHeader{
		struct stEthHeader	eth;
		struct stIPHeader	ip;
		struct stUDPHeader	udp;
};
//UDP Packet --------------------------
struct stUDPPacket{
		struct stIPUDPHeader	header;
		unsigned char	udpdata[UDP_DATA_LEN_24];
		unsigned long	fcs;
};
struct stUDPPacket xdata UDPPacket;
struct stUDPPacket xdata UDPRxPacket;

//Pseudo UDP --------------------------
struct stPseudo{
		unsigned char	srcIPAddr[4];	
		unsigned char	destIPAddr[4];
		unsigned char	psdnull;
		unsigned char	proto;
		unsigned int 	len1;
		unsigned int 	srcPort;
		unsigned int 	destPort;
		unsigned int 	len2;
		unsigned int	psdchksum;
		unsigned char	psddata[UDP_DATA_LEN_24];
};
struct stPseudo xdata Pseudo;
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

magnetron

haydarpaşa hocam ,

benim boardda ( OLIMEX STM32-E407 ) ethernet var
OLIMEXin demo uIP stack yükledim webserver olarak çalışıyor ama uIP çok komplex

bana TCP - IP lazım değil zaten
bana lazım olan UDP protokolüyle birkaçyüz byte gönderip almak

ben UDP paket oluşturup boarddan PC ye gönderdim ama
aradaki adsl routeri çıkarıp cross kablo kullanınca oldu ancak

adsl router varken herhalde boarda ARP isteği geliyordu ben de cevap vermediğim için
haberleşme olamıyordu

sizden ricam

ARP isteği geldiğini nasıl anlarım ?
bir ARP cevap nasıl oluşturulur ?

boarddan dışarı ARP isteği yollamak gerekir mi ?
onu nasıl yollarım ?

ICMP gerekli mi ?

ENC kısmı lazım değil çünkü low level ethernet software hazır zaten orda sorun yok

teşekkür

NOT : mesajınızı şimdi gördüm - örnekler için teşekkür

haydarpasamikro

#14
Eğer UDP kısmını hallettiyseniz gerisi kolay. Yukarıdaki fonksiyonlarıma bakın. ARP ile ilgili Request gönderme ve Reply yapma fonksiyonları.
Ayrıca ICMP kesin lazım. Çünkü Windows ARP ardından Ping(ICMP Resuest) de bulunabiliyor.
Windows haberleştiği ağ aygıtlarının adreslerini  geçici olarak bir tabloda tutar 5 dakika sonra(mesela) boşaltır. Bu sebeple belli süre sonra tekrar haberleşecekse ARP ve akabinde Ping atacaktır. Sonra paket haberleşmesi olur.
Ancak şunu da unutmayın: Eğer Windows firewall ayarlarında ICMP engellenebilir. Pasif hale gelmeli ki bu paketler süzülmesin.

Access point, Modem router da tabloyu boşaltabilir. Bu sebepler kısa aralıklarla(2dk gibi) UDP broadcast mesajı gönderin ki tablodan atılmasın cihazınızın adres bilgisi.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi