STM32
直播中

母猪会上树

9年用户 812经验值
擅长:电源/新能源
私信 关注
[问答]

STM32H743 SPI3做从机接收标记置不了位怎么解决?

SPI3 PD6 做为MOSI 引脚 有波形,但RXP 置不了位

求解

SPI_HandleTypeDef gSpi3Handle = {0};                /* SPI句柄 */

void SPI3_Init(void)
{
        uint32_t adcValueB1 = 0;
HAL_SPI_DeInit( gSpi3Handle);

gSpi3Handle.Instance = SPI3;                                                                                                                        /* SPI2 */
gSpi3Handle.Init.Mode = SPI_MODE_SLAVE;                                                                                                /* 设置SPI工作模式,设置为主模式 */
gSpi3Handle.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;                                                                                /* 设置SPI单向或者双向的数据模式:SPI设置为双线模式 */
gSpi3Handle.Init.DataSize = SPI_DATASIZE_16BIT;                                                                                        /* 设置SPI的数据大小:SPI发送接收8位帧结构 */
gSpi3Handle.Init.CLKPolarity = SPI_POLARITY_LOW;                                                                                /* 串行同步时钟的空闲状态为高电平 */
gSpi3Handle.Init.CLKPhase = SPI_PHASE_2EDGE;                                                                                        /* 串行同步时钟的第二个跳变沿(上升或下降)数据被采样 */
gSpi3Handle.Init.NSS = SPI_NSS_HARD_INPUT;                                                                                                        /* NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制 */
gSpi3Handle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;                                                        /* 定义波特率预分频的值:波特率预分频值为256 */
gSpi3Handle.Init.FirstBit = SPI_FIRSTBIT_MSB;                                                                                        /* 指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始 */
gSpi3Handle.Init.TIMode = SPI_TIMODE_DISABLE;                                                                                        /* 关闭TI模式 */
gSpi3Handle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;                                                        /* 关闭硬件CRC校验 */
gSpi3Handle.Init.CRCPolynomial = 7;                                                                                                                /* CRC值计算的多项式 */
gSpi3Handle.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
gSpi3Handle.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
gSpi3Handle.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
gSpi3Handle.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
gSpi3Handle.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
gSpi3Handle.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
gSpi3Handle.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
gSpi3Handle.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
gSpi3Handle.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
gSpi3Handle.Init.IOSwap = SPI_IO_SWAP_DISABLE;                                                                                        /* SPI主模式IO状态保持使能 */

if (HAL_SPI_Init( gSpi3Handle) != HAL_OK)
{

}

__HAL_SPI_ENABLE( gSpi3Handle);                                       /* 使能SPI2 */

adcValueB1 = SPI3_ReadWrite2Byte(0xffff);           /* 启动传输 */

}




void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{
        if(spiHandle->Instance==SPI3)
        {
                GPIO_InitTypeDef GPIO_InitStruct;
                RCC_PeriphCLKInitTypeDef  RCC_PeriphCLKInitStruct;
               
                RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SPI3;
                RCC_PeriphCLKInitStruct.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL;
                HAL_RCCEx_PeriphCLKConfig( RCC_PeriphCLKInitStruct);
               
                __HAL_RCC_SPI3_CLK_ENABLE();

                __HAL_RCC_GPIOA_CLK_ENABLE();
                __HAL_RCC_GPIOD_CLK_ENABLE();
                __HAL_RCC_GPIOB_CLK_ENABLE();
                __HAL_RCC_GPIOI_CLK_ENABLE();
               
                /**SPI3 GPIO Configuration
    PA4     ------> SPI3_NSS
    PD6     ------> SPI3_MOSI
    PB3 (JTDO/TRACESWO)     ------> SPI3_SCK
    PB4 (NJTRST)     ------> SPI3_MISO
    */
               
                GPIO_InitStruct.Pin = GPIO_PIN_4;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_PULLUP;
                GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
                GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
                HAL_GPIO_Init(GPIOA,  GPIO_InitStruct);

                GPIO_InitStruct.Pin = GPIO_PIN_6;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_PULLUP;
                GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
                GPIO_InitStruct.Alternate = GPIO_AF5_SPI3;
                HAL_GPIO_Init(GPIOD,  GPIO_InitStruct);

                GPIO_InitStruct.Pin = GPIO_PIN_3;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_PULLUP;
                GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
                GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
                HAL_GPIO_Init(GPIOB,  GPIO_InitStruct);
               
                GPIO_InitStruct.Pin = GPIO_PIN_4;
                GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
                GPIO_InitStruct.Pull = GPIO_PULLUP;
                GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
                GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
                HAL_GPIO_Init(GPIOB,  GPIO_InitStruct);
        
        }
}

回帖(1)

yuhonglong

2024-9-9 17:27:17
在STM32H743中,使用SPI3作为从机接收数据时,如果遇到RXP(接收数据寄存器)无法置位的问题,可以尝试以下步骤进行排查和解决:

1. **检查SPI初始化配置**:确保SPI3的初始化配置正确,包括SPI模式(主/从)、时钟极性和相位、数据大小等。你的代码片段中缺少了初始化配置的部分,确保你已经正确设置了这些参数。

2. **检查GPIO配置**:确保PD6引脚已经被配置为SPI3的MOSI功能。这通常在GPIO的初始化函数中完成。

   ```c
   GPIO_InitTypeDef GPIO_InitStruct = {0};
   __HAL_RCC_GPIOD_CLK_ENABLE();
   GPIO_InitStruct.Pin = GPIO_PIN_6;
   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
   GPIO_InitStruct.Pull = GPIO_NOPULL;
   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
   GPIO_InitStruct.Alternate = GPIO_AF5_SPI3;
   HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
   ```

3. **检查SPI中断和DMA配置**:如果你使用中断或DMA来接收数据,确保相关配置正确,并且中断使能。

4. **检查SPI接收中断使能**:确保你已经使能了SPI的接收中断。

   ```c
   __HAL_SPI_ENABLE_IT(&gSpi3Handle, SPI_IT_RXNE);
   ```

5. **检查数据接收逻辑**:在接收数据的逻辑中,确保你正确地从RXP寄存器读取数据。

6. **硬件问题排查**:如果软件配置正确,但问题依旧存在,可能是硬件连接问题。检查PD6引脚的物理连接,以及SPI3的其他相关硬件配置。

7. **使用示波器检查信号**:使用示波器检查PD6引脚的信号波形,确认信号是否正确。

8. **参考STM32CubeMX配置**:如果你手动编写初始化代码,建议使用STM32CubeMX工具生成初始化代码作为参考,确保所有配置项都被正确设置。

9. **查看错误代码**:如果HAL库函数返回错误代码,检查这些错误代码的含义,它们可能会提供问题的线索。

10. **更新固件库**:确保你使用的STM32 HAL库是最新版本,有时候库中的bug也会导致类似问题。

如果以上步骤都无法解决问题,可能需要更详细的调试,包括查看SPI的寄存器状态,以及使用调试器逐步跟踪代码执行过程。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分