我想用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); } 下面是测试结果,时钟没问题 16 次, 18MHz. 但是两次接收之间的等待时间却是惊人的8µs. |
不过单字节/单字收发的话,效率是很低,一个HAL_SPI_Receive函数,里面代码不少。
HAL_SPI_Receive(&hspi1,(uint8_t *)&data_in_1,1,1);
HAL_SPI_Receive(&hspi4,(uint8_t *)&data_in_2,1,1);
结果就把其中的一个函数放到main循环中看要执行多长时间。发现两次接受得16µs.
所以想问一下有没有办法把这个间隔等待时间缩短。
@lebment: DMA适用于单通道多次采样。我的项目里是双通道里同时采样两个数据后马上处理。单通道多次采样后再采样第二通道的数据时差更大。