Forum Discussion
Altera_Forum
Honored Contributor
15 years agoHi,
I was success to make it transfer a character from DE2 board to PC, and I got correct a character on PC side. But when I transferred the character back from PC to DE2 board, I could not make it correctly. I always got the same data for different character data. Could anyone please help me with my code Here is my files
/*
* network.h
*
*/
# ifndef NETWORK_H_
# define NETWORK_H_
/* Assign IP: 192.168.1.44 IP Address for the DE2 */
# define Src_IP1 0xC0
# define Src_IP2 0xA8
# define Src_IP3 0x01
# define Src_IP4 0x2C
/* Assign IP: 192.168.1.30 IP Address for the PC */
# define Dest_IP1 0xC0
# define Dest_IP2 0xA8
# define Dest_IP3 0x01
# define Dest_IP4 0x1E
/* DE2 MAC Address */
# define Src_MAC1 0x01
# define Src_MAC2 0x60
# define Src_MAC3 0x6E
# define Src_MAC4 0x11
# define Src_MAC5 0x02
# define Src_MAC6 0x0F
/* PC MAC Address */
# define Dest_MAC1 0x00
# define Dest_MAC2 0x16
# define Dest_MAC3 0xD4
# define Dest_MAC4 0xBB
# define Dest_MAC5 0xCA
# define Dest_MAC6 0x91
# define payload 1 /* Send and receive one character */
/* Total Packet Length
* Frame Header, IP Header, UDP Header, Payload
* */
# define Packet_Len (payload + 0x2B)
# define UDP_Len (payload + 8)
# define UDP_Len_H ((UDP_Len & 0xFF00)>>8)
# define UDP_Len_L (UDP_Len & 0x00FF)
# define IP_Len (payload + 8 + 20)
# define IP_Len_H ((IP_Len & 0xFF00)>>8)
# define IP_Len_L (IP_Len & 0x00FF)
# define IP_Csum1 (0x0000C511 + (Src_IP1<<8)+Src_IP2+(Src_IP3<<8)+Src_IP4+(Dest_IP1<<8)+Dest_IP2+(Dest_IP3<<8)+(Dest_IP4)+(IP_Len_H<<8) + IP_Len_L)
# define IP_Csum2 ((IP_Csum1&0x0000FFFF)+(IP_Csum1>>16))
# define IP_Csum3 (0x0000FFFF - IP_Csum2)
# define IP_Csum4 ((IP_Csum3 & 0xFF00)>>8)
# define IP_Csum5 ((IP_Csum3 & 0x00FF))
# endif /* NETWORK_H_ */
/*
* main.c
*
*/
# include "basic_io.h"
# include "network.h"
# include "LCD.h"
# include "DM9000A.C"
# include "DM9000A.H"
# include <string.h>
# include <ctype.h>
unsigned char PC_MAC_ADDR = { 0x00, 0x16, 0xD4, 0xBB, 0xCA, 0x91 };
unsigned char DE2_MAC_ADDR = { 0x01, 0x60, 0x6E, 0x11, 0x02, 0x0F };
unsigned int receive_status, receive_len, i, packet_num;
unsigned char receive_buffer;
# define UDP_PACKET_PAYLOAD_OFFSET 42
unsigned char ARP_Packet = {
/* Ethernet MAC header 14 bytes,
* first 6 bytes for Destination MAC address
* second 6 bytes for SOURCE MAC address
* last 2 bytes for Ethernet types (ARP = 0806)
*/
Dest_MAC1, Dest_MAC2, Dest_MAC3, Dest_MAC4, Dest_MAC5, Dest_MAC6,
Src_MAC1, Src_MAC2, Src_MAC3, Src_MAC4, Src_MAC5, Src_MAC6,
0x08, 0x06,
/* ARP Header,
*
*/
0x00, 0x01, // Hardware Ethernet 0x0001
0x08, 0x00, // Protocol IP 0x0800
0x06, // Hardware size 6
0x04, // Protocol size 4
0x00, 0x02, // Reply
Src_MAC1, Src_MAC2, Src_MAC3, Src_MAC4, Src_MAC5, Src_MAC6,
Src_IP1, Src_IP2, Src_IP3, Src_IP4,
Dest_MAC1, Dest_MAC2, Dest_MAC3, Dest_MAC4, Dest_MAC5, Dest_MAC6,
Dest_IP1, Dest_IP2, Dest_IP3, Dest_IP4
};
unsigned char UDP_Packet = {
/* Ethernet MAC header 14 bytes,
* first 6 bytes for Destination MAC address
* second 6 bytes for SOURCE MAC address
* last 2 bytes for Ethernet types (IP = 0800)
*/
Dest_MAC1, Dest_MAC2, Dest_MAC3, Dest_MAC4, Dest_MAC5, Dest_MAC6,
Src_MAC1, Src_MAC2, Src_MAC3, Src_MAC4, Src_MAC5, Src_MAC6,
0x08, 0x00,
/* IP Header, 20 bytes
* 4 bits for version
* 4 bits for header length
* 8 bits for type of service
* 16 bits for total length of packet
* 16 bits for identification
* 3 bits for flag, 13 bits for fragment offset
* 8 bits for time to live
* 8 bit for protocol
* 16 bit for header checksum
* 32 bits for source IP
* 32 bits for destination IP
*/
0x45,
0x00,
IP_Len_H, IP_Len_L,
0x00, 0x00,
0x00, 0x00,
0x80, 0x11, // UDP Type
IP_Csum4, IP_Csum5,
Src_IP1, Src_IP2, Src_IP3, Src_IP4,
Dest_IP1, Dest_IP2, Dest_IP3, Dest_IP4,
0x04, 0x00, 0x04, 0x00, // Port 1024
UDP_Len_H, UDP_Len_L,
0x00, 0x00,
/* UDP data,
* Data take one byte.
*/
0x41 // Character A
};
void ethernet_interrupt_handler() {
int i = 0;
unsigned char mac_addr;
receive_status = ReceivePacket(receive_buffer, &receive_len);
if (receive_status == DMFE_SUCCESS) {
/* Display the whole packet receive */
printf("\n\nReceive Packet Length = %d", receive_len);
for(i = 0; i < receive_len;i++) {
if (i%8==0) printf("\n");
printf("0x%.2X,", receive_buffer);
}
printf("\n");
/* Get the source address from the packet */
for(i = 6 ; i < 12; i++)
{
mac_addr = receive_buffer;
}
/* Compare the mac address to the PC MAC address */
if (memcmp(mac_addr, PC_MAC_ADDR, 6) == 0)
{
if (receive_len >= 14) {
// A real Ethernet packet
if (receive_buffer == 8 && receive_buffer == 6){
// An ARP Packet
TransmitPacket(ARP_Packet, sizeof(ARP_Packet));
/* Clear the DM9000A ISR: PRS, PTS, ROS, ROOS 4 bits, by RW/C1 */
iow(ISR, 0x3F);
/* Re-enable DM9000A interrupts */
iow(IMR, INTR_set);
//DM9000_init(SRC_MAC_ADDR);
}
else
{
if (receive_buffer == 8 && receive_buffer == 0 &&
receive_len >= 34)
{
// An IP packet
if (receive_buffer == 0x11)
{
// A UDP packet
if (receive_len >= UDP_PACKET_PAYLOAD_OFFSET)
{
char request = (receive_buffer + UDP_PACKET_PAYLOAD_OFFSET);
printf("Receive message: %c\n",request);
}
}
else
{
printf("Received non-UDP packet\n");
}
}
else
{
printf("Received non-IP packet\n");
}
}
}
else
{
printf("Malformed Ethernet packet\n");
}
}
}
else
{
printf("Error receiving packet\n");
}
/* Clear the DM9000A ISR: PRS, PTS, ROS, ROOS 4 bits, by RW/C1 */
iow(ISR, 0x3F);
/* Re-enable DM9000A interrupts */
iow(IMR, INTR_set);
//DM9000_init(SRC_MAC_ADDR);
}
int main()
{
LCD_Init();
LCD_Show_Text("TEAM-SYNTHESIS");
LCD_Line2();
LCD_Show_Text("Ethernet Testing");
printf("Network Transfer: Team-Synthesis (c) 2011.\n");
DM9000_init(); // Initialize the DM9000A.
alt_irq_register( DM9000A_IRQ, NULL, (void*)ethernet_interrupt_handler );
while (1)
{
TransmitPacket(UDP_Packet,sizeof(UDP_Packet));
usleep(500000);
}
return 0;
}
Here is my receiving data (always the same for different character data) Receive Packet Length = 64 0x01,0x60,0x6E,0x11,0x02,0x0F,0x00,0x16, 0xD4,0xBB,0xCA,0x91,0x08,0x00,0x45,0x00, 0x00,0x2D,0x10,0xC7,0x00,0x00,0x80,0x11, 0xA6,0x5E,0xC0,0xA8,0x01,0x1E,0xC0,0xA8, 0x01,0x2C,0x04,0x00,0x04,0x00,0x00,0x19, 0x88,0xAE,0x2F,0x31,0x39,0x32,0x2E,0x31, 0x36,0x38,0x2E,0x31,0x2E,0x34,0x34,0x20, 0x3A,0x20,0x54,0x00,0x2A,0x58,0x79,0x24, Receive message: /