问题描述:SPI做从机,上位机作主机发送数据,上位机发送单个字节可以,发送多个字节进不了中断。
用逻辑分析仪抓取上位机发送的数据波形,发送正常。
以下是代码,请大佬指教以下哪里出来问题。谢谢。
SPI从机初始化
[C] 纯文本查看 复制代码 void SPI_FLASH_Init(void)
{
SpiHandle.Instance = SPI1;
SpiHandle.Init.Direction = SPI_DIRECTION_2LINES;
SpiHandle.Init.CLKPhase = SPI_PHASE_1EDGE;
SpiHandle.Init.CLKPolarity = SPI_POLARITY_LOW;
SpiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
SpiHandle.Init.CRCPolynomial = 7;
SpiHandle.Init.DataSize = SPI_DATASIZE_8BIT;
SpiHandle.Init.FirstBit = SPI_FIRSTBIT_MSB;
SpiHandle.Init.NSS = SPI_NSS_HARD_INPUT;//
SpiHandle.Init.TIMode = SPI_TIMODE_DISABLE;
SpiHandle.Init.Mode = SPI_MODE_SLAVE;
HAL_SPI_Init(&SpiHandle);
__HAL_SPI_ENABLE(&SpiHandle);
}
GPIO初始化和中断优先级设置
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
GPIO_InitTypeDef GPIO_InitStruct;
/*##-1- Enable peripherals and GPIO Clocks #################################*/
/* Enable GPIO TX/RX clock */
__HAL_RCC_GPIOA_CLK_ENABLE;
/* Enable SPI clock */
__HAL_RCC_SPI1_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7;//pianxuan shizhong mosi
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_6;//miso
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* SPI1 interrupt Init */
HAL_NVIC_SetPriority(SPI1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(SPI1_IRQn);
}
中断
void SPI1_IRQHandler(void)
{
/* USER CODE BEGIN SPI1_IRQn 0 */
printf("\r\n中断 \r\n");
/* USER CODE END SPI1_IRQn 0 */
HAL_SPI_IRQHandler(&SpiHandle);
/* USER CODE END SPI1_IRQn 1 */
}
终端回调
void HAL_SPI_RxCpltCallback (SPI_HandleTypeDef *hspi)
{
printf("\r\n回调 \r\n");
if (hspi->Instance== SPI1)
{
printf("rx_data[0] = %x\r\n",rx_data[0]);
printf("rx_data[1] = %x\r\n",rx_data[1]);
printf("rx_data[2] = %x\r\n",rx_data[2]);
printf("rx_data[3] = %x\r\n",rx_data[3]);
printf("rx_data[4] = %x\r\n",rx_data[4]);
HAL_SPI_Receive_IT(&SpiHandle, rx_data, 5);
}
}
main函数:初始化时打开了SPI中断接收
int main(void)
{
/* 设定系统时钟为72MHz */
SystemClock_Config();
LED_GPIO_Config();
LED_BLUE;
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
uint8_t printData[] = {0X55,0X05};
/* 配置串口1为:115200 8-N-1 */
DEBUG_USART_Config();
printf("\r\n这是一个switch pack测试实验 \r\n");
/* 8M串行flash W25Q64初始化 */
SPI_FLASH_Init();
HAL_SPI_Receive_IT(&SpiHandle,rx_data,5);
while(1)
{
printf("\r\n这是一个switch pack测试实验 \r\n");
// HAL_SPI_Transmit(&SpiHandle,(uint8_t*)rx_data,5,1000);
HAL_Delay(2000);
}
还请大佬指点以下
|