/*
GPIO端口的设置。
PB12--->Flash_CS=1 屏蔽
PB13--->SPI2_SCK
PB14--->SPI2_MISO
PB15--->SPI2_MOSI
PD2---—>NET_INT
PG6---->NET_RST
PG7---->NRF_CS=1 屏蔽
PG8---->NET_CS
*/
void ENC28J60_SPI_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE ); //SPI2时钟使能 36M
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE );//PORTB,D,G时钟使能
//GPIOB
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure); //GPIOB初始化
GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //输出高电平
//Flash_CS=1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOB,&GPIO_InitStructure); //GPIOB初始化
GPIO_SetBits(GPIOB,GPIO_Pin_12); //输出高电平
//GPIOD.2-->NET_INT 中断输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOD,&GPIO_InitStructure); //GPIOD初始化
GPIO_SetBits(GPIOD,GPIO_Pin_2); //输出高电平
//GPIOG7-->FLASH_CS=1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG,&GPIO_InitStructure);
GPIO_SetBits(GPIOG,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8);
//SPI2--->36MHz
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主机模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //数据宽度为一个字节
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟CLK空闲的时候为低电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //第1个上升沿采集数据
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件管理从设备
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; // 36MHz/256=140.625KHz,低速的
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //传输的时候高位在前
SPI_InitStructure.SPI_CRCPolynomial = 7; //多项式校验
SPI_Init(SPI2,&SPI_InitStructure);
//使能SPI2
SPI_Cmd(SPI2,ENABLE);
SPI2_ReadWriteByte(0xFF);//启动传输
}
u8 ENC28J60_Init(u8 *macaddr)
{
u16 rety=0;
//设置相应的寄存器
ENC28J60_Hardware_Reset(); //硬件复位
// ENC28J60_Software_Reset(); //软件复位
ENC28J60_Write_Opcode_Reg(ENC28J60_SOFT_RESET,0,ENC28J60_SOFT_RESET); //发送复位命令
delay_ms(10);
while( !(ENC28J60_Read_Reg(ESTAT)&ESTAT_CLKRDY)&&rety<500 ) //读取ESTAT寄存器中的CLKRDY位是否置1
{
rety++;
delay_ms(1);
}
if(rety>=500) //复位总是失败?????
{
return(1); //失败
}
红 {MOD}部分总是返回1.。。?为啥呢???有时候jtag仿真,可以,但是下载代码的时候就死循环了、、、、
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
遇到同样的问题,学习了,谢谢分享!
一周热门 更多>