你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H743 SPI3 做从机 接收标记置不了位

[复制链接]
小白灰白 提问时间:2024-7-25 09:20 / 未解决
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);
        
        }
}

收藏 评论13 发布时间:2024-7-25 09:20

举报

13个回答
xmshao 回答时间:3 天前
这个地方提醒两点,保证配置和硬件连接没啥问题,即保证SPI的确可以通信了。


另外,RXP在接收到的数据个数不少于接收FIFO设置的阈值时就会被置位。该位
是个只读位,清零和置1由硬件管理。


建议你在CubeMx配置那里,先将fifo深度设置为1即可,便于验证。


我刚才使用H743开发板就SPI3进行测试,可以清晰看到被置1和清零的。
xmshao 回答时间:3 天前

你确认是否真的正常通信了。 我测试SPI3是可以的。

image.png

xmshao 回答时间:3 天前
.
小白灰白 回答时间:3 天前

xmshao 发表于 2024-7-25 11:04
你确认是否真的正常通信了。 我测试SPI3是可以的。</p>
<p>![image.png](data/attachment/forum/202407/25/11 ...

SPI3 作为从机 是否真的正常通信了,怎么确认?

MOSI 用示波器量的都有波形,是用我上面粘贴的代码调的吗?如果不是,能不能贴出来下,谢谢

MOSI 接3.3V高电平,也读不出来值,理论上CS为低,有时钟,应该就能读到数据啊

xmshao 回答时间:3 天前

小白灰白 发表于 2024-7-25 11:18</p>
<p>SPI3 作为从机   是否真的正常通信了,怎么确认?

[md]image.png

xmshao 回答时间:3 天前
你如果使用DMA的话,数据不要放到TCM区域,注意放到AXI RAM或其它D2域的SRAM区。


我就SPI3自发自收,是可以的。涉及的管脚是PC10 PC11 PC12.
小白灰白 回答时间:3 天前

xmshao 发表于 2024-7-25 12:02
你如果使用DMA的话,数据不要放到TCM区域,注意放到AXI RAM或其它D2域的SRAM区。</p>
<p>

从模式怎么自发自收啊?

没有用DMA,没有用中断,

用的引脚是

PA4 ------> SPI3_NSS PD6 ------> SPI3_MOSI PB3 (JTDO/TRACESWO) ------> SPI3_SCK PB4 (NJTRST) ------> SPI3_MISO

xmshao 回答时间:3 天前

小白灰白 发表于 2024-7-25 12:15
从模式怎么自发自收啊?</p>
<p>没有用DMA,没有用中断,

[md]自发自收就是将SPI配置在全双工主模式,我这么做只是省了点事,做些测试确认。

具体操作就是将MOSI和MISO弄根线连接起来。

我之前测试也没有用DMA,就是轮训而已。相关函数如下:

HAL_SPI_TransmitReceive(&hspi3, spiDataTx, spiDataRx,4,0x999);

小白灰白 回答时间:3 天前

xmshao 发表于 2024-7-25 13:49
自发自收就是将SPI配置在全双工主模式,我这么做只是省了点事,做些测试确认。</p>
<p>

[md]你的是不是从模式啊,发不出来数据

xmshao 回答时间:3 天前

小白灰白 发表于 2024-7-25 14:17
你的是不是从模式啊,发不出来数据

我现在配置SPI3 master 全双工模式。

你看看我的截图,我都收到了,怎么会发不出来呢。

小白灰白 回答时间:3 天前

xmshao 发表于 2024-7-25 14:26
我现在配置SPI3 master 全双工模式。</p>
<p>你看看我的截图,我都收到了,怎么会发不出来呢。

主模式也是OK的,我是要用 SPI_MODE_SLAVE 模式 SPI_DIRECTION_2LINES_RXONLY

xmshao 回答时间:3 天前
我根据你的配置,将SPI3配置为RXONLY SLAVE模式,S PI1用来做mater并实现数据发送。


hspi3.Instance = SPI3;
  hspi3.Init.Mode = SPI_MODE_SLAVE;
  hspi3.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
  hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi3.Init.NSS = SPI_NSS_SOFT;
  hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi3.Init.CRCPolynomial = 0x0;
  hspi3.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  hspi3.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
  hspi3.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
。。。。


__HAL_RCC_GPIOC_CLK_ENABLE();
    //SPI3 GPIO Configuration
  // PC10     ------> SPI3_SCK
  //  PC12     ------> SPI3_MOSI
   
    GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);


SPI1基于DMA方式进行发送,SPI3基于查询方式进行接收。


HAL_SPI_Transmit_DMA(&hspi1, (uint8_t *)&spiDataTx0], 4);

HAL_SPI_Receive(&hspi3,(uint8_t *)&spiDataRx0], 4,0x666);


测试结果也是可以的,SPI3能正常收到数据。


不要急,耐心点。希望我的测试结果能给你些信心。


如果是物理连线的话,一定要连接可靠,且线尽量短。
xmshao 回答时间:3 天前

小白灰白 发表于 2024-7-25 14:37</p>
<p>主模式也是OK的,我是要用 SPI_MODE_SLAVE 模式  SPI_DIRECTION_2LINES_RXONLY

[md]image.png

这是我将SPI3配置为RXONLY SLAVE模式的测试结果,用SPI1做主并完成发送。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版