完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我想用STM32f303的两路SPI在4µs内各接收1个16bit 的数据,SPI SCK 18MHz 没毛病,但是两个HAL_SPI_RECEIVE 函数之间的等待时间却为惊人的8µs,竟然远大于<1µs 的信号传送时间,我的问题是,如何减小这个等待时间? 必须自己写底层函数吗?
SPI configuration: hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_16BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;[url=]Url[/url] hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 7; hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; if (HAL_SPI_Init( hspi1) != HAL_OK) { Error_Handler(); } 测试放到main中的循环中 while(1) { uint16_t data_in; HAL_SPI_Receive( hspi1,(uint8_t *) data_in,1,1); } |
|
相关推荐
2个回答
|
|
不建议用同一片上的两路SPI互收发测试,最好用两块板一主一从测试,这样各干各的活。
不过单字节/单字收发的话,效率是很低,一个HAL_SPI_Receive函数,里面代码不少。 |
|
|
|
要减小HAL_SPI_Receive函数的等待时间,可以使用DMA来接收SPI数据。使用DMA可以减少CPU的负担,同时提高数据传输的效率。
要使用DMA接收SPI数据,可以按照以下步骤进行配置: 1. 配置SPI的DMA模式: ```c hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_16BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; ... ``` 2. 配置DMA通道: ```c hdma_spi_rx.Instance = DMAx_Channely; hdma_spi_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_spi_rx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_spi_rx.Init.MemInc = DMA_MINC_ENABLE; hdma_spi_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_spi_rx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_spi_rx.Init.Mode = DMA_NORMAL; hdma_spi_rx.Init.Priority = DMA_PRIORITY_HIGH; hdma_spi_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; ... ``` 3. 配置DMA的传输长度和地址: ```c HAL_DMA_Start(&hdma_spi_rx, (uint32_t)&hspi1.Instance->DR, (uint32_t)receiveBuffer, dataLength); ``` 4. 启用SPI DMA接收模式: ```c hspi1.Instance->CR2 |= SPI_CR2_RXDMAEN; ``` 5. 等待DMA传输完成: ```c HAL_DMA_PollForTransfer(&hdma_spi_rx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); ``` 6. 关闭SPI DMA接收模式: ```c hspi1.Instance->CR2 &= ~SPI_CR2_RXDMAEN; ``` 通过使用DMA接收SPI数据,可以显著减少等待时间,从而实现在更短的时间内接收到数据。 另外,为了进一步优化SPI数据传输的速度,还可以考虑使用FIFO以及合适的DMA传输模式。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1646 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1566 浏览 1 评论
993 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
692 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1611 浏览 2 评论
1871浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
656浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
526浏览 3评论
542浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
515浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 05:23 , Processed in 0.927578 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号