enc28j60初始化总是不成功?请教、、、、

2019-10-16 00:48发布

/*
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仿真,可以,但是下载代码的时候就死循环了、、、、


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。