OpenEdv-开源电子网

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

W5500的SPI设置

[复制链接]

27

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-7-20
在线时间
117 小时
发表于 2018-8-23 17:06:13 | 显示全部楼层 |阅读模式
5金钱
楼主移植的是W5500官方给的w5500.c socket.c wizchip_conf.c,然后自己配置的是SPI接口,程序写好了,然后下一步测试,在这里面出了问题[mw_shl_code=c,true]        reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte);        //注册读写函数
       
        if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1)
        {
                 printf("WIZCHIP Initialized fail.\r\n");  //初始化失败
                 while(1);
        }
       
        do{
                 if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1){
                                printf("Unknown PHY Link stauts.\r\n");     //未知PHY链接状态
                 }
        }while(tmp == PHY_LINK_OFF);
        network_init();[/mw_shl_code]


就是在do while中循环,建立不了PHY连接,初步判断应该是SPI配置错了或者硬件问题,目前硬件是这样的PB12->CS,PB13->SCK,PB14->MISO,PB15->MOSI。芯片是F429VGT6,然后想问一下我的SPI哪里出了问题,或者我可能哪里出错了,
SPI.c的代码如下(HAL库)
[mw_shl_code=c,true]/**
  ******************************************************************************


  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
//#include "main.h"
#include "spi.h"

/**
  * @brief  使能SPI时钟
  * @retval None
  */
SPI_HandleTypeDef SPI_InitStruct;  //句柄


static void SPI_RCC_Configuration(void)
{
        __HAL_RCC_GPIOB_CLK_ENABLE();            //开启GPIOB时钟
        __HAL_RCC_SPI2_CLK_ENABLE();                         //开启SPI2时钟
}
/**
  * @brief  配置指定SPI的引脚
  * @retval None
  */
static void SPI_GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        //PB12->CS,PB13->SCK,PB14->MISO,PB15->MOSI                                                          
        GPIO_InitStruct.Pin =  GPIO_PIN_13 | GPIO_PIN_14|GPIO_PIN_15;
        GPIO_InitStruct.Speed = GPIO_SPEED_FAST;                                   //GPIO_Speed_50MHz,快速
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;                                 //复用推挽输出
        GPIO_InitStruct.Pull=GPIO_PULLUP;                                 //上拉       
        GPIO_InitStruct.Alternate=GPIO_AF5_SPI2;                //复用为SPI2
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
        //初始化片选输出引脚
        GPIO_InitStruct.Pin = GPIO_PIN_12;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);        //PE12置1  

}
/**
  * @brief  根据外部SPI设备配置SPI相关参数
  * @retval None
  */
void SPI_Configuration(void)
{
       

        SPI_RCC_Configuration();
        SPI_GPIO_Configuration();
       
        SPI_InitStruct.Instance=SPI2;            
        SPI_InitStruct.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;  //定义波特率预分频的值
        SPI_InitStruct.Init.Direction= SPI_DIRECTION_2LINES;                                   //设置SPI单向或者双向的数据模式:SPI设置为双线模式
        SPI_InitStruct.Init.Mode = SPI_MODE_MASTER;                                                        //设置SPI工作模式,设置为主模式
        SPI_InitStruct.Init.DataSize = SPI_DATASIZE_8BIT;                                        //设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStruct.Init.CLKPolarity = SPI_POLARITY_HIGH;                                        //串行同步时钟的空闲状态为高电平
        SPI_InitStruct.Init.CLKPhase = SPI_PHASE_2EDGE;                                                //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
        SPI_InitStruct.Init.NSS = SPI_NSS_SOFT;                                                                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI_InitStruct.Init.FirstBit = SPI_FIRSTBIT_MSB;                                        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        SPI_InitStruct.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;                //关闭硬件CRC校验
        SPI_InitStruct.Init.CRCPolynomial = 7;                                                      //CRC值计算的多项值
        SPI_InitStruct.Init.TIMode=SPI_TIMODE_DISABLE;               //关闭TI模式
        HAL_SPI_Init(&SPI_InitStruct);
       
        //SPI_SSOutputCmd(SPI2, ENABLE);   //使能选择的SPI端口SS输出
        __HAL_SPI_ENABLE(&SPI_InitStruct);                                //开启SPI
        SPI_WriteByte(0xFF);                                //启动传输
       
}
/**
  * @brief  写1字节数据到SPI总线
  * @param  TxData 写到总线的数据
  * @retval None
  */
/*
void SPI_WriteByte(uint8_t TxData)
{                                 
        while((SPI2->SR&SPI_I2S_FLAG_TXE)==0);        //等待发送区空                  
        SPI2->DR=TxData;                                                                                           //发送一个byte
        while((SPI2->SR&SPI_I2S_FLAG_RXNE)==0); //等待接收完一个byte  
        SPI2->DR;               
}

*/


//SPI5 写一个字节 (写字节)
//TxData:要写入的字节
//返回值:读取到的字节
void SPI_WriteByte(uint8_t TxData)
{       
        /*       
        while((SPI2->SR&SPI_FLAG_TXE)==0);        //等待发送区空                  
        SPI2->DR=TxData;
        //发送一个byte
        while((SPI2->SR&SPI_FLAG_RXNE)==0); //等待接收完一个byte  
        SPI2->DR;
  */
    u8 Rxdata;
    HAL_SPI_TransmitReceive(&SPI_InitStruct,&TxData,&Rxdata,1, 1000);   
        //return Rxdata;                              //返回收到的数据               
}

//读字节
uint8_t SPI_ReadByte(void)
{       
/*        
        while((SPI2->SR&SPI_FLAG_TXE)==0);        //等待发送区空                          
        SPI2->DR=0xFF;                                                                                                   //发送一个空数据产生输入数据的时钟
        while((SPI2->SR&SPI_FLAG_RXNE)==0); //等待接收完一个byte  
        return SPI2->DR;         
*/   
        u8 Rxdata;
        u8 TxData=0xFF;
    HAL_SPI_TransmitReceive(&SPI_InitStruct,&TxData,&Rxdata,1, 1000);     
        return Rxdata;                              //返回收到的数据               
}



/**
  * @brief  从SPI总线读取1字节数据
  * @retval 读到的数据
  */
/*
uint8_t SPI_ReadByte(void)
{                         
        while((SPI2->SR&SPI_I2S_FLAG_TXE)==0);        //等待发送区空                          
        SPI2->DR=0xFF;                                                                                                   //发送一个空数据产生输入数据的时钟
        while((SPI2->SR&SPI_I2S_FLAG_RXNE)==0); //等待接收完一个byte  
        return SPI2->DR;                                                      
}
*/

/**
  * @brief  进入临界区
  * @retval None
  */
void SPI_CrisEnter(void)
{
        __set_PRIMASK(1);
}
/**
  * @brief  退出临界区
  * @retval None
  */
void SPI_CrisExit(void)
{
        __set_PRIMASK(0);
}

/**
  * @brief  片选信号输出低电平
  * @retval None
  */
void SPI_CS_Select(void)
{
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);        //PE12置0  
}
/**
  * @brief  片选信号输出高电平
  * @retval None
  */
void SPI_CS_Deselect(void)
{
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);        //PE12置1  
}
/*********************************END OF FILE**********************************/

[/mw_shl_code]       

最佳答案

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

我把自己移植的找出来了,你参考一下吧
我只喜欢喜欢我的人
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

125

帖子

0

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-27
在线时间
120 小时
发表于 2018-8-23 17:06:14 | 显示全部楼层
我把自己移植的找出来了,你参考一下吧

F103C8T6 -w5500.rar

8.58 MB, 下载次数: 1341

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2018-8-24 01:35:57 | 显示全部楼层
帮顶
回复

使用道具 举报

27

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-7-20
在线时间
117 小时
 楼主| 发表于 2018-8-24 11:24:23 | 显示全部楼层
来人看一下啊
我只喜欢喜欢我的人
回复

使用道具 举报

8

主题

125

帖子

0

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-27
在线时间
120 小时
发表于 2018-8-24 14:13:12 | 显示全部楼层
修改SPI的配置看看,我记得我移植的时候CLK空闲电平为低
初始化W5500时先读一下芯片的version,是一个固定值(看W5500手册),如果读的值不对那就是SPI还没通
回复

使用道具 举报

27

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-7-20
在线时间
117 小时
 楼主| 发表于 2018-8-27 09:24:14 | 显示全部楼层
红木甲板 发表于 2018-8-24 14:13
修改SPI的配置看看,我记得我移植的时候CLK空闲电平为低
初始化W5500时先读一下芯片的version,是一个固定 ...

我看了一下手册,手册上面提到了读version的寄存器是0x04,然后我读的结果是255,怎么感觉这结果不对,上面没提到版本号应该是多少
我只喜欢喜欢我的人
回复

使用道具 举报

8

主题

125

帖子

0

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-27
在线时间
120 小时
发表于 2018-8-27 09:46:57 | 显示全部楼层
fang百川 发表于 2018-8-27 09:24
我看了一下手册,手册上面提到了读version的寄存器是0x04,然后我读的结果是255,怎么感觉这结果不对{:3_ ...

就是0X04,255肯定是错的了,SPI没通呢,修改SPI配置再看看吧
回复

使用道具 举报

27

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-7-20
在线时间
117 小时
 楼主| 发表于 2018-8-27 09:50:38 | 显示全部楼层
红木甲板 发表于 2018-8-27 09:46
就是0X04,255肯定是错的了,SPI没通呢,修改SPI配置再看看吧

你之前读的大概是多少啊,我重新配置了一下读到1,感觉数字极端不可信啊
我只喜欢喜欢我的人
回复

使用道具 举报

8

主题

125

帖子

0

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-27
在线时间
120 小时
发表于 2018-8-27 09:59:03 | 显示全部楼层
fang百川 发表于 2018-8-27 09:50
你之前读的大概是多少啊,我重新配置了一下读到1,感觉数字极端不可信啊

就是0x04啊~你修改SPI的CLKPolarity和Phase再试试吧
回复

使用道具 举报

27

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-7-20
在线时间
117 小时
 楼主| 发表于 2018-8-27 10:34:10 | 显示全部楼层
红木甲板 发表于 2018-8-27 09:59
就是0x04啊~你修改SPI的CLKPolarity和Phase再试试吧

还是不行,这个CLKpolarity和Phase的组合都试过了,然后其他的SPI基本上都和原子例程设置一样的,但是这个SPI好像还是通信不了,读的任何寄存器返回值都是1,
我只喜欢喜欢我的人
回复

使用道具 举报

27

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-7-20
在线时间
117 小时
 楼主| 发表于 2018-8-28 15:20:48 | 显示全部楼层
红木甲板 发表于 2018-8-27 22:05
我把自己移植的找出来了,你参考一下吧

非常感谢
我只喜欢喜欢我的人
回复

使用道具 举报

28

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2018-2-23
在线时间
37 小时
发表于 2018-10-11 09:40:26 | 显示全部楼层
如果有W5500问题没有解决,可以来找我们深圳炜世科技,提供专业的技术支持。
官网:www.wisioe.com
QQ:2429075983
邮箱gustin@wisioe.com
回复

使用道具 举报

12

主题

40

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3123
金钱
3123
注册时间
2017-2-7
在线时间
387 小时
发表于 2020-6-17 18:40:17 | 显示全部楼层
楼主你好,请问你的程序后来调试OK了吗?能发给我参考一下吗?我也是读VERSION读不对,谢谢
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2020-5-19
在线时间
12 小时
发表于 2020-8-28 11:17:26 | 显示全部楼层
请我是怎么弄好的,我这也这个毛病,搞不好了,哈哈
回复

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
470
金钱
470
注册时间
2017-12-20
在线时间
61 小时
发表于 2020-11-6 11:22:26 | 显示全部楼层
将青夏沫 发表于 2020-8-28 11:17
请我是怎么弄好的,我这也这个毛病,搞不好了,哈哈

我现在也遇到问题了,SPI读出来都是0xff。头疼。。。。。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-5-5
在线时间
2 小时
发表于 2021-3-1 15:59:32 | 显示全部楼层
淡然若梦 发表于 2020-11-6 11:22
我现在也遇到问题了,SPI读出来都是0xff。头疼。。。。。

有解决吗?我读spi任何数据都是0xff
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-1-20
在线时间
3 小时
发表于 2021-3-27 11:53:12 | 显示全部楼层
试试,咋读的都是FF

回复

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
470
金钱
470
注册时间
2017-12-20
在线时间
61 小时
发表于 2021-4-7 17:54:27 | 显示全部楼层
1253930962 发表于 2021-3-1 15:59
有解决吗?我读spi任何数据都是0xff

我的是硬件问题,就是电阻电容没有完全按照给的例程焊接,改了就可以读取了。想来估计还是W5500没有工作
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2020-11-29
在线时间
11 小时
发表于 2021-7-15 18:00:13 | 显示全部楼层
红木甲板 发表于 2018-8-27 09:59
就是0x04啊~你修改SPI的CLKPolarity和Phase再试试吧

我读VERSIONR师0x04,但是还是ping不通 [头疼]
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-8 11:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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