查看: 545|回复: 0
打印 上一主题 下一主题

ENC28J60写操作

[复制链接]
跳转到指定楼层
沙发
发表于 2015-10-8 08:10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ENC28J60写操作
       ENC28J60的寄存器操作时ENC28J60初始化,发送以太网数据和接收以太网数据的基础。通过ENC28J60进行以太网发送数据操作,本质上为操作硬件缓冲区的发送缓冲区部分。每次发送时总是从发送缓冲区的起始地址开始填充数据,数据填充的结束地址和数据的输入长度有关。操作完发送缓冲区的大小之后可向发送缓冲区填充数据,即调用ENC28J60_WRITE_BUF_MEM操作码,接着置位ECON1中的 ECON1_TXRTS位启动发送,并使用等待法不断查询是否发送完毕。基本的思路还是和SPI或UART发送数据相似,即填充数据,启动发送,查询发送完成。写操作的输入参数为数据包的长度len和数据包指针packet,该参数正好和uIP的网络层操作函数相对应。若是LwIP协议,输入参数将会是pBuf这种自定义数据结构,需要经过适当的修改才应用于lwIP协议栈。
<font size="3">void enc28j60PacketSend(unsigned int len, unsigned char* packet)
{
       /* 查询发送逻辑复位位 */
       while((enc28j60Read(ECON1) & ECON1_TXRTS)!= 0);

  /* 设置发送缓冲区起始地址 */   
       enc28j60Write(EWRPTL, TXSTART_INIT & 0xFF);
       enc28j60Write(EWRPTH, TXSTART_INIT >> 8);

       /* 设置发送缓冲区结束地址 该值对应发送数据包长度 */  
       enc28j60Write(ETXNDL, (TXSTART_INIT + len) & 0xFF);
       enc28j60Write(ETXNDH, (TXSTART_INIT + len) >>8);

       /* 发送之前发送控制包格式字 */
       enc28j60WriteOp(ENC28J60_WRITE_BUF_MEM, 0, 0x00);

       /* 通过ENC28J60发送数据包 */
       enc28j60WriteBuffer(len, packet);

       /* 开始发送 */
       enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_TXRTS);

  /* 复位发送逻辑的问题 */
       if( (enc28j60Read(EIR) & EIR_TXERIF) )
       {
              enc28j60SetBank(ECON1);
    enc28j60WriteOp(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_TXRTS);
  }
}</font>
复制代码转载

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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