STM32F446 SPI问题请教
stm32f446,使用标准库通过SPI2\SPI4驱动W5500,现在的问题是在写入IP、网关等参数后回读相关寄存器数据错误,网络无法PING通,SPI驱动如下SPI2使用 PD3->SCK PC2->MISOPC1->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->MISOPC1->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 : nulloutput : null, return : null
* Other :
*/
void W5500_Configuration_1(void)
{
u16 Count_Data=0;
//u8 IP1; u8 MACAddr1;
//低电平复位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=W5500_Gateway;
Gateway=W5500_Gateway;
Gateway=W5500_Gateway;
Gateway=W5500_Gateway;
Write_ComReg_nByte(GAR, Gateway, 4);
Gateway=0;
Gateway=0;
Gateway=0;
Gateway=0;
Read_ComReg_nByte(GAR, Gateway, 4);
// Set Subnet Mask as: 255.0.0.0 //模块子网掩码
SubnetMask=W5500_SubnetMask;
SubnetMask=W5500_SubnetMask;
SubnetMask=W5500_SubnetMask;
SubnetMask=W5500_SubnetMask;
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=W5500_MACAddr;
MACAddr=W5500_MACAddr;
MACAddr=W5500_MACAddr;
MACAddr=W5500_MACAddr;
MACAddr=W5500_MACAddr;
MACAddr=W5500_MACAddr;
Write_ComReg_nByte(SHAR, MACAddr, 6);
//模块的IP
IP=192;//W5500_IP;
IP=168;//W5500_IP;
IP=2;//W5500_IP;
IP=2;//W5500_IP;
Write_ComReg_nByte(SIPR, IP, 4);
IP=0;IP=0;IP=0;IP=0;
Read_ComReg_nByte(SIPR, IP, 4);
Socket0_Config_1();
Socket3_Config_1(); //网卡1
}
这贴先结了,问题找到是446在I/O口映射时库配置配置错误,HAL库中配置PC口的AFRL为0570,而标准库中是0550
今天又碰到个怪事HAL库PC0翻转居然没法翻转总是在低电平状态,程序如下
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_0|GPIO_PIN_3, GPIO_PIN_RESET);
/*Configure GPIO pin : PE3 */
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/*Configure GPIO pins : PC13 PC0 PC3 */
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_0|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
/* Initialize all configured peripherals */
MX_GPIO_Init();
//MX_SPI2_Init();
//MX_SPI4_Init();
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
delay_ms(50000);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
delay_ms(50000);
就这个程序PC0就是无法出现高电平,硬件没问题 对446是彻底无语了规格书中PC0是15P,程序中设置成PC13即可以进行IO口翻转 补上代码和仿真
while (1)
{
/* USER CODE END WHILE */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET);
delay_ms(50000);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);
delay_ms(50000);
/* USER CODE BEGIN 3 */
}
/* USER CODE E
页:
[1]