OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9417|回复: 6

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

[复制链接]

23

主题

81

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2013-10-28
在线时间
0 小时
发表于 2014-10-31 23:50:17 | 显示全部楼层 |阅读模式
5金钱
/*
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); //失败
  }
红色部分总是返回1.。。?为啥呢???有时候jtag仿真,可以,但是下载代码的时候就死循环了、、、、


最佳答案

查看完整内容[请看2#楼]

 /* 硬件复位 */ void ENC28J60_Hardware_Reset(void) { ENC28J60_SPI_Init();   //SPI初始化 delay_ms(10);  //这里一定要加的,不然难以初始化成功 SPI2_Set_Speed(SPI_BaudRatePrescaler_4); //SPI2 SCK频率为36M/4=9Mhz   TIM6_Int_Init(1000,719);      //100Khz计数频率,计数到1000为10ms NET_RST=0;      //复位 delay_ms(10); NET_RST=1;   &n ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

23

主题

81

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2013-10-28
在线时间
0 小时
 楼主| 发表于 2014-10-31 23:50:18 | 显示全部楼层
 /*
硬件复位
*/
void ENC28J60_Hardware_Reset(void)
{
ENC28J60_SPI_Init();   //SPI初始化
delay_ms(10);  //这里一定要加的,不然难以初始化成功
SPI2_Set_Speed(SPI_BaudRatePrescaler_4); //SPI2 SCK频率为36M/4=9Mhz
  TIM6_Int_Init(1000,719);      //100Khz计数频率,计数到1000为10ms

NET_RST=0;      //复位
delay_ms(10);
NET_RST=1;      //复位结束
delay_ms(10); //至少要经过50us-300us才可以才可以操作寄存器
}
加了红色的代码就马上初始化成功了,不知道为啥、、、
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-1 21:51:06 | 显示全部楼层
回复【2楼】STM32初学菜鸟:
---------------------------------
学习下
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-9-25
在线时间
0 小时
发表于 2014-11-29 11:18:24 | 显示全部楼层
回复【2楼】STM32初学菜鸟:
---------------------------------
遇到同样的问题,学习了,谢谢分享!
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2015-6-3
在线时间
8 小时
发表于 2015-11-9 21:00:13 | 显示全部楼层
学习了!亲测有效!
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2019-11-6
在线时间
1 小时
发表于 2019-11-6 13:15:55 | 显示全部楼层
请问你们用的是半双工模式还是全双工模式
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2020-11-3
在线时间
5 小时
发表于 2020-11-6 14:38:45 | 显示全部楼层
得用全双工
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 18:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表