xad74 发表于 2022-9-20 13:26

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
       
}

xad74 发表于 2022-9-21 11:07

这贴先结了,问题找到是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就是无法出现高电平,硬件没问题

xad74 发表于 2022-9-21 13:28

对446是彻底无语了规格书中PC0是15P,程序中设置成PC13即可以进行IO口翻转

xad74 发表于 2022-9-21 13:29

补上代码和仿真
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]
查看完整版本: STM32F446 SPI问题请教