stm32f446,使用标准库通过SPI2\SPI4驱动W5500,现在的问题是在写入IP、网关等参数后回读相关寄存器数据错误,网络无法PING通,SPI驱动如下
SPI2使用 PD3->SCK PC2->MISO PC1->MOSI
/**
* @brief 配置指定SPI的引脚
* @retval None
*/
static void SPI2_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//打开时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
//打开端口复用
GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource3, GPIO_AF_SPI2);
//PD3->SCK PC2->MISO PC1->MOSI
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStruct);
//PC1->MOSI PC2->MISO
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStruct);
//PC3->CS,初始化片选输出引脚
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStruct);
//PC0->RST,初始化片复位脚
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStruct);
//拉高片选
GPIO_SetBits(GPIOC,GPIO_Pin_3);
}
/**
* @brief 根据外部SPI设备配置SPI相关参数
* @retval None
*/
void SPI2_Configuration(void)
{
SPI_InitTypeDef SPI_InitStruct;
SPI2_GPIO_Configuration();
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;//SPI_CPOL_High;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial = 7;
SPI_Init(SPI2,&SPI_InitStruct);
SPI_Cmd(SPI2, ENABLE);
}
/* Function name : void Socket0_Config_1(void)
* Description : 配置W5500_1
* Input : null output : null, return : null
* Other :
*/
void W5500_Configuration_1(void)
{
u16 Count_Data=0;
//u8 IP1[4]; u8 MACAddr1[6];
//低电平复位W5500
W5500_RET_L();
delay_ms(10);
W5500_RET_H();
delay_ms(50);
while((Read_ComReg_1Byte(PHYCFGR)&LINK)==0)
{
if(Count_Data++>500)
break;
delay_ms(1);
}
Write_ComReg_1Byte(MR, RST);
delay_ms(10);
// Set Gateway IP as: 10.0.0.0 //模块网关
Gateway[0]=W5500_Gateway[0];
Gateway[1]=W5500_Gateway[1];
Gateway[2]=W5500_Gateway[2];
Gateway[3]=W5500_Gateway[3];
Write_ComReg_nByte(GAR, Gateway, 4);
Gateway[0]=0;
Gateway[1]=0;
Gateway[2]=0;
Gateway[3]=0;
Read_ComReg_nByte(GAR, Gateway, 4);
// Set Subnet Mask as: 255.0.0.0 //模块子网掩码
SubnetMask[0]=W5500_SubnetMask[0];
SubnetMask[1]=W5500_SubnetMask[1];
SubnetMask[2]=W5500_SubnetMask[2];
SubnetMask[3]=W5500_SubnetMask[3];
Write_ComReg_nByte(SUBR, SubnetMask, 4);
// Set MAC Address as: 0x48,0x53,0x00,0x57,0x55,0x00 //模块的物理地址
// Set MAC Address as: 0x00,0x25,0x22,0x33,0x15,0xA3 //模块的物理地址
MACAddr[0]=W5500_MACAddr[0];
MACAddr[1]=W5500_MACAddr[1];
MACAddr[2]=W5500_MACAddr[2];
MACAddr[3]=W5500_MACAddr[3];
MACAddr[4]=W5500_MACAddr[4];
MACAddr[5]=W5500_MACAddr[5];
Write_ComReg_nByte(SHAR, MACAddr, 6);
//模块的IP
IP[0]=192;//W5500_IP[0];
IP[1]=168;//W5500_IP[1];
IP[2]=2;//W5500_IP[2];
IP[3]=2;//W5500_IP[3];
Write_ComReg_nByte(SIPR, IP, 4);
IP[0]=0;IP[1]=0;IP[2]=0;IP[3]=0;
Read_ComReg_nByte(SIPR, IP, 4);
Socket0_Config_1();
Socket3_Config_1(); //网卡1
}
|