#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