|
STM32 5个SPI接收5个STM32从机,如何确保接收数据缓冲区200个包一致?
目前采用SPI1、SPI2、SPI3、SPI5、SPI6。每个SPI 5Mbits/S,采用SPI+外部中断触发DMA(BDMA)接收数据。
/**
* @brief This function handles EXTI line1 interrupt.
*/
void EXTI1_IRQHandler(void)
{
/* USER CODE BEGIN EXTI1_IRQn 0 */
/* USER CODE END EXTI1_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(NRDY_CH1_Pin);
/* USER CODE BEGIN EXTI1_IRQn 1 */
HAL_GPIO_WritePin(SPI_NCS_CH1_GPIO_Port, SPI_NCS_CH1_Pin, GPIO_PIN_RESET);
HAL_SPI_Receive_DMA(&hspi1, SpiData1[BufHead1], 200);
/* USER CODE END EXTI1_IRQn 1 */
}
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
if (hspi->Instance == SPI1)
{
// GPIO 拉高(释放片选信号)
SPI_NCS_CH1_GPIO_Port->BSRR = SPI_NCS_CH1_Pin; // 拉高 CH1 片选信号
SPI_NCS_CH2_GPIO_Port->BSRR = SPI_NCS_CH2_Pin; // 拉高 CH2 片选信号
SPI_NCS_CH3_GPIO_Port->BSRR = SPI_NCS_CH3_Pin; // 拉高 CH3 片选信号
// 更新标志位,表示通道数据接收完成
BufHead1 = (BufHead1 + 1) % DBUF_NUM;
}
if (hspi->Instance == SPI2)
{
SPI_NCS_CH4_GPIO_Port->BSRR = SPI_NCS_CH4_Pin; // 如果需要可以启用
SPI_NCS_CH5_GPIO_Port->BSRR = SPI_NCS_CH5_Pin; // 拉高 CH5 片选信号
SPI_NCS_CH6_GPIO_Port->BSRR = SPI_NCS_CH6_Pin; // 拉高 CH6 片选信号
BufHead4 = (BufHead4 + 1) % DBUF_NUM;
}
if (hspi->Instance == SPI3)
{
// GPIO 拉高(释放片选信号)
SPI_NCS_CH7_GPIO_Port->BSRR = SPI_NCS_CH7_Pin; // 拉高 CH7 片选信号
SPI_NCS_CH8_GPIO_Port->BSRR = SPI_NCS_CH8_Pin; // 拉高 CH8 片选信号
BufHead7 = (BufHead7 + 1) % DBUF_NUM;
}
if (hspi->Instance == SPI5)
{
// GPIO 拉高(释放片选信号)
SPI_NCS_CH9_GPIO_Port->BSRR = SPI_NCS_CH9_Pin; // 拉高 CH9 片选信号
BufHead9 = (BufHead9 + 1) % DBUF_NUM;
}
if (hspi->Instance == SPI6)
{
// GPIO 拉高(释放片选信号)
SPI_NCS_CH10_GPIO_Port->BSRR = SPI_NCS_CH10_Pin; // 拉高 CH10 片选信号
BufHead10 = (BufHead10 + 1) % DBUF_NUM;
}
}
|
|