W5500的SPI设置

2019-07-20 05:46发布

楼主移植的是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. ");  //初始化失败
                 while(1);
        }
       
        do{
                 if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1){
                                printf("Unknown PHY Link stauts. ");     //未知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]       

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
fang百川
1楼-- · 2019-07-20 22:44
 精彩回答 2  元偷偷看……
红木甲板
2楼-- · 2019-07-21 01:42
 精彩回答 2  元偷偷看……
fang百川
3楼-- · 2019-07-21 02:07
红木甲板 发表于 2018-8-27 09:59
就是0x04啊~你修改SPI的CLKPolarity和Phase再试试吧

还是不行,这个CLKpolarity和Phase的组合都试过了,然后其他的SPI基本上都和原子例程设置一样的,但是这个SPI好像还是通信不了,读的任何寄存器返回值都是1,
fang百川
4楼-- · 2019-07-21 05:26
红木甲板 发表于 2018-8-27 22:05
我把自己移植的找出来了,你参考一下吧

非常感谢
WSGustin
5楼-- · 2019-07-21 10:12
 精彩回答 2  元偷偷看……

一周热门 更多>