楼主移植的是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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>