OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6093|回复: 3

用DMA来操作SPI,实现驱动ENC28J60的问题

[复制链接]

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2013-12-25 16:08:31 | 显示全部楼层 |阅读模式
用SPI实现驱动ENC28J60。这个我已经弄好了,tcp/ip已经调试通了。udp通信刚弄出来。关键是通信感觉有些慢。
不知道大侠们有用DMA来操作SPI驱动ENC28J60的例程没。给个例程给小弟,不胜感激啊。
原子哥是不是又要出黑科技了呀。^_^...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-25 21:06:39 | 显示全部楼层
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2013-12-31 10:33:58 | 显示全部楼层
udp发送的不能超过220个,郁闷了。大家帮看下:怎么改可以发送1000个。
// you can send a max of 220 bytes of data
void make_udp_send(unsigned  int srcport, unsigned  int dstport, char* data, unsigned char datalen)
{
   unsigned char i = 0;
   unsigned  int ck;

   //u8 err;

   //make_eth(buf);
   if((stateSend==0)||(stateStop==0))return;
   
   //if(stateSend==0)return;

   while (i < 6)
   {
      sendbuf[ETH_DST_MAC + i] = mac_dstaddr;
      sendbuf[ETH_SRC_MAC + i] = mac_addr;
      i++;
   }
   i=0;
   


   if (datalen > 220)
   {
      datalen = 220;
   }
   // total length field in the IP header must be set:
   sendbuf[IP_TOTLEN_H_P] = 0;
   sendbuf[IP_TOTLEN_L_P] = IP_HEADER_LEN + UDP_HEADER_LEN + datalen;
   //make_dstip(buf);

   sendbuf[12] = 0x08;
   sendbuf[13] = 0x00;
   sendbuf[14] = 0x45;
   sendbuf[15] = 0x00;


   sendbuf[20] = 0x00;
   sendbuf[21] = 0x00;
   sendbuf[22] = 0x40;
   sendbuf[23] = 0x11;

   i = 0;
   while (i < 4)
   {
      sendbuf[IP_DST_P + i] = dstip;
      sendbuf[IP_SRC_P + i] = myip;
      i++;
   }
   i = 0;
   fill_ip_hdr_checksum(sendbuf);

   sendbuf[UDP_SRC_PORT_H_P] = srcport >> 8;
   sendbuf[UDP_SRC_PORT_L_P] = srcport & 0xff;
   sendbuf[UDP_DST_PORT_H_P] = dstport >> 8;
   sendbuf[UDP_DST_PORT_L_P] = dstport & 0xff;
   // source port does not matter and is what the sender used.
   // calculte the udp length:
   sendbuf[UDP_LEN_H_P] = 0;
   sendbuf[UDP_LEN_L_P] = UDP_HEADER_LEN + datalen;
   // zero the checksum
   sendbuf[UDP_CHECKSUM_H_P] = 0;
   sendbuf[UDP_CHECKSUM_L_P] = 0;
   // copy the data:
   while (i < datalen)
   {
      sendbuf[UDP_DATA_P + i] = data;
      i++;
   }
   ck = checksum(&sendbuf[IP_SRC_P], 16 + datalen, 1);
   sendbuf[UDP_CHECKSUM_H_P] = ck >> 8;
   sendbuf[UDP_CHECKSUM_L_P] = ck & 0xff;

//   OSMutexPend(Mutex_TEST, 0, &err);  // 等待信号量

   enc28j60PacketSend(UDP_HEADER_LEN +
      IP_HEADER_LEN +
      ETH_HEADER_LEN +
      datalen,
      sendbuf);

   //OSMutexPost(Mutex_TEST);  // 释放信号量 
}
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2013-12-31 10:36:30 | 显示全部楼层
我修改成如下了,还是不能发送1000个。呜呜呜:
// you can send a max of 220 bytes of data
void make_udp_send(unsigned  int srcport, unsigned  int dstport, char* data, unsigned int datalen)
{
   unsigned int i = 0;
   unsigned int ck;

   //u8 err;

   //make_eth(buf);
   if((stateSend==0)||(stateStop==0))return;
   
   //if(stateSend==0)return;

   while (i < 6)
   {
      sendbuf[ETH_DST_MAC + i] = mac_dstaddr;
      sendbuf[ETH_SRC_MAC + i] = mac_addr;
      i++;
   }
   i=0;
   


   if (datalen > 1200)
   {
      datalen = 1200;
   }
   // total length field in the IP header must be set:
   sendbuf[IP_TOTLEN_H_P] = (datalen + IP_HEADER_LEN + UDP_HEADER_LEN)/65536;
   sendbuf[IP_TOTLEN_L_P] = (datalen + IP_HEADER_LEN + UDP_HEADER_LEN)%65536;
   //make_dstip(buf);

   sendbuf[12] = 0x08;
   sendbuf[13] = 0x00;
   sendbuf[14] = 0x45;
   sendbuf[15] = 0x00;


   sendbuf[20] = 0x00;
   sendbuf[21] = 0x00;
   sendbuf[22] = 0x40;
   sendbuf[23] = 0x11;

   i = 0;
   while (i < 4)
   {
      sendbuf[IP_DST_P + i] = dstip;
      sendbuf[IP_SRC_P + i] = myip;
      i++;
   }
   i = 0;
   fill_ip_hdr_checksum(sendbuf);

   sendbuf[UDP_SRC_PORT_H_P] = srcport >> 8;
   sendbuf[UDP_SRC_PORT_L_P] = srcport & 0xff;
   sendbuf[UDP_DST_PORT_H_P] = dstport >> 8;
   sendbuf[UDP_DST_PORT_L_P] = dstport & 0xff;
   // source port does not matter and is what the sender used.
   // calculte the udp length:
   sendbuf[UDP_LEN_H_P] = (datalen+UDP_HEADER_LEN)/65536;
   sendbuf[UDP_LEN_L_P] = (datalen+UDP_HEADER_LEN)%65536;
   // zero the checksum
   sendbuf[UDP_CHECKSUM_H_P] = 0;
   sendbuf[UDP_CHECKSUM_L_P] = 0;
   // copy the data:
   while (i < datalen)
   {
      sendbuf[UDP_DATA_P + i] = data;
      i++;
   }
   ck = checksum(&sendbuf[IP_SRC_P], 16 + datalen, 1);
   sendbuf[UDP_CHECKSUM_H_P] = ck >> 8;
   sendbuf[UDP_CHECKSUM_L_P] = ck & 0xff;

//   OSMutexPend(Mutex_TEST, 0, &err);  // 等待信号量

   enc28j60PacketSend(datalen+UDP_HEADER_LEN + IP_HEADER_LEN + ETH_HEADER_LEN,sendbuf);

   //OSMutexPost(Mutex_TEST);  // 释放信号量 
}
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 06:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表