ENC28J60网络模块驱动代码

本文档提供了ENC28J60网络模块的驱动代码实现,包括初始化、读写寄存器、数据传输等功能。代码详细解释了如何设置SPI接口、初始化ENC28J60、读写MAC/MII寄存器、处理接收和发送数据包的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "spi.h"
#include "delay.h"
#include "timerx.h"
#include <stdio.h>
#include "enc28j60.h"  
////////////////////////////////////////////////////////////////////////////////// 
//ENC28J60驱动代码           
//////////////////////////////////////////////////////////////////////////////////

static u8 ENC28J60BANK;
static u32 NextPacketPtr;


//复位ENC28J60
//包括SPI初始化/IO初始化等
void ENC28J60_Reset(void)
{
 RCC->APB2ENR|=1<<3;     //使能PORTB时钟     
  RCC->APB2ENR|=1<<5;  //使能PORTD时钟
  RCC->APB2ENR|=1<<8;  //使能PORTG时钟
 GPIOD->CRL&=0XFFFFF0FF;
 GPIOD->CRL|=0X00000300; //PD2 推挽     
 GPIOD->ODR|=1<<2;     //PD2上拉    
 //这里PG7和PB12拉高,是为了防止NRF24L01和SPI FLASH影响.
 //因为他们共用一个SPI口.
 GPIOB->CRH&=0XFFF0FFFF;
 GPIOB->CRH|=0X00030000; //PB12 推挽     
 GPIOB->ODR|=1<<12;      //PB12上拉
 GPIOG->CRL&=0X00FFFFFF;
 GPIOG->CRL|=0X33000000; //PG6/7 推挽     
 GPIOG->CRH&=0XFFFFFFF0;
 GPIOG->CRH|=0X00000003; //PG8 推挽     
 GPIOG->ODR|=7<<6;     //PG6/7/8 上拉
  SPI2_Init();   //初始化SPI2
 //针对ENC28J60的特点(SCK空闲为低电平)修改SPI的设置
  SPI2->CR1&=~(1<<6);  //SPI设备失能
 SPI2->CR1&=~(1<<1);  //空闲模式下SCK为0 CPOL=0
 SPI2->CR1&=~(1<<0);  //数据采样从第1个时间边沿开始,CPHA=0 
 SPI2->CR1|=1<<6;   //SPI设备使能

 SPI2_SetSpeed(SPI_SPEED_4); //SPI2 SCK频率为36M/4=9Mhz
  TIM6_Int_Init(1000,719);//100Khz计数频率,计数到1000为10ms
 ENC28J60_RST=0;   //复位ENC28J60
 delay_ms(10); 
 ENC28J60_RST=1;   //复位结束       
 delay_ms(10); 
}
//读取ENC28J60寄存器(带操作码)
//op:操作码
//addr:寄存器地址/参数
//返回值:读到的数据
u8 ENC28J60_Read_Op(u8 op,u8 addr)
{
 u8 dat=0; 
 ENC28J60_CS=0; 
 dat=op|(addr&ADDR_MASK);
 SPI2_ReadWriteByte(dat);
 dat=SPI2_ReadWriteByte(0xFF);
 //如果是读取MAC/MII寄存器,则第二次读到的数据才是正确的,见手册29页
  if(addr&0x80)dat=SPI2_ReadWriteByte(0xFF);
 ENC28J60_CS=1;
 return dat;
}
//读取ENC28J60寄存器(带操作码)
//op:操作码
//addr:寄存器地址
//data:参数
void ENC28J60_Write_Op(u8 op,u8 addr,u8 data)
{
 u8 dat = 0;    
 ENC28J60_CS=0;     
 dat=op|(addr&ADDR_MASK);
 SPI2_ReadWriteByte(dat);  
 SPI2_ReadWrit

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值