因仑“3+1”工程特种兵精英论坛

标题: ENC28J60写操作 [打印本页]

作者: 张衍波    时间: 2015-10-8 08:10
标题: ENC28J60写操作
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>
复制代码转载






欢迎光临 因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4