[STM32F4]

STM32F446 SPI问题请教

[复制链接]
129|3
手机看帖
扫描二维码
随时随地手机跟帖
xad74|  楼主 | 2022-9-20 13:26 | 显示全部楼层 |阅读模式
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
       
}

使用特权

评论回复
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口翻转
7960632aa095afc7c.png

使用特权

评论回复
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
91007632aa10e9fa7e.png

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则