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>
复制代码转载
|