硬汉嵌入式论坛

 找回密码
 立即注册
查看: 425|回复: 7
收起左侧

[技术讨论] STM32F103做从机在中断中接收数据只能接收一个字节

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2024-2-23 10:53:08 | 显示全部楼层 |阅读模式
问题描述: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);
               
               

        }

还请大佬指点以下
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2024-2-23 13:47:04 | 显示全部楼层
不能在SPI中断里面串口打印,串口打印速度远远低于SPI中断速度。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2024-2-23 15:01:08 | 显示全部楼层
eric2013 发表于 2024-2-23 13:47
不能在SPI中断里面串口打印,串口打印速度远远低于SPI中断速度。

我在中断中置标志位,然后在循环中打印,还是无法接收上位机发送的多哥字节数据。现在上位机发送多个字节只能进一次中断,第二次发送就进不了。如果单个字节发送的话,每一次都能进中断。博主能看出是什么原因吗,已经困扰我一天了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2024-2-24 00:26:11 | 显示全部楼层
JiangLang 发表于 2024-2-23 15:01
我在中断中置标志位,然后在循环中打印,还是无法接收上位机发送的多哥字节数据。现在上位机发送多个字节 ...

这样测试过没,每发送1个字节数据后,延迟100ms发送是否正常。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2024-2-25 15:29:31 | 显示全部楼层
eric2013 发表于 2024-2-24 00:26
这样测试过没,每发送1个字节数据后,延迟100ms发送是否正常。

老师能否加您个联系方式,我将工程发您,帮我调试一下,有偿。谢谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2024-2-26 08:21:47 | 显示全部楼层
JiangLang 发表于 2024-2-25 15:29
老师能否加您个联系方式,我将工程发您,帮我调试一下,有偿。谢谢

分享到百度云,有时间了我看下
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2024-2-26 12:47:51 | 显示全部楼层
eric2013 发表于 2024-2-26 08:21
分享到百度云,有时间了我看下

链接: https://pan.baidu.com/s/1QoVAeHAEh6shH-w5R4wU9A?pwd=vftk 提取码: vftk 复制这段内容后打开百度网盘手机App,操作更方便哦
提取码:vftk

问题描述:SPI主从通信,上位机作主计,stm32做从机。目前只能实现上位机发送一个字节,下位机收一个字节,多个字节发送不可行。

老师,我怀疑是不是SPI中断一次只能收发一个字节,如果是的话,那么是不是要采取DMA收发?还请老师帮忙看一下,谢谢!  我是今年刚入职公司的应届生,这个项目对我至关重要,希望老师帮忙看看
回复

使用道具 举报

2

主题

11

回帖

17

积分

新手上路

积分
17
发表于 2024-2-27 11:40:30 | 显示全部楼层
JiangLang 发表于 2024-2-26 12:47
链接: https://pan.baidu.com/s/1QoVAeHAEh6shH-w5R4wU9A?pwd=vftk 提取码: vftk 复制这段内容后打开百度 ...

不能采用阻塞接收嘛,片选信号通过外部中断触发,在主程序里判断标志位,进行阻塞接收
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 18:13 , Processed in 0.180302 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表