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); } } |
STM32H750内部flash读写
STM32H743采用flash swap 进行IAP升级,reset后启动不了
STM32双核H7核间通信的方法
STM32H743IIC,HAL库驱动硬件I2C,hi2c2.state一直是busy. 为什么?
H747 DSI 模块的官方例程跑不通
MAC回环或以太网PHY芯片回环怎么实现?
STM32745/747芯片固件升级问题
H743 DAC通道缓冲器的校准问题
STM32H750更改时钟后,程序无法运行
疑似STM32CUBEIDE出现BUG
[md]
这是我将SPI3配置为RXONLY SLAVE模式的测试结果,用SPI1做主并完成发送。
另外,RXP在接收到的数据个数不少于接收FIFO设置的阈值时就会被置位。该位
是个只读位,清零和置1由硬件管理。
建议你在CubeMx配置那里,先将fifo深度设置为1即可,便于验证。
我刚才使用H743开发板就SPI3进行测试,可以清晰看到被置1和清零的。
你确认是否真的正常通信了。 我测试SPI3是可以的。
SPI3 作为从机 是否真的正常通信了,怎么确认?
MOSI 用示波器量的都有波形,是用我上面粘贴的代码调的吗?如果不是,能不能贴出来下,谢谢
MOSI 接3.3V高电平,也读不出来值,理论上CS为低,有时钟,应该就能读到数据啊
[md]
我就SPI3自发自收,是可以的。涉及的管脚是PC10 PC11 PC12.
从模式怎么自发自收啊?
没有用DMA,没有用中断,
用的引脚是
PA4 ------> SPI3_NSS PD6 ------> SPI3_MOSI PB3 (JTDO/TRACESWO) ------> SPI3_SCK PB4 (NJTRST) ------> SPI3_MISO
[md]自发自收就是将SPI配置在全双工主模式,我这么做只是省了点事,做些测试确认。
具体操作就是将MOSI和MISO弄根线连接起来。
我之前测试也没有用DMA,就是轮训而已。相关函数如下:
HAL_SPI_TransmitReceive(&hspi3, spiDataTx, spiDataRx,4,0x999);
[md]你的是不是从模式啊,发不出来数据
我现在配置SPI3 master 全双工模式。
你看看我的截图,我都收到了,怎么会发不出来呢。
主模式也是OK的,我是要用 SPI_MODE_SLAVE 模式 SPI_DIRECTION_2LINES_RXONLY
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能正常收到数据。
不要急,耐心点。希望我的测试结果能给你些信心。
如果是物理连线的话,一定要连接可靠,且线尽量短。