打印
[STM32F1]

关于使用俩块开发版SPI通讯问题

[复制链接]
590|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
俩块开发版都是F1,作为主机的板子能正常发送接收数据,但是从机无法接受数据。俩个开发版配置一样,主机通过软件方式片选从机,
按照我的理解,俩块开发版是同时工作正常是与的关系,不可能一个正常,一个不正常。感觉很疑惑,望论坛的大佬可以解惑!


主机通过死循环不停地向从机发送数据,如果发送成功会翻转LED,并向串口打印数据。主机发出接收的数据都正确。主机主要代码如下:
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_SET);
    uint8_t Master_TX_Data_buff[1] = {6};
    uint8_t Master_RX_Data_buff[1] = {0};

    while(1)
    {
      HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_RESET);
      if(HAL_SPI_TransmitReceive(&hspi1,Master_TX_Data_buff,Master_RX_Data_buff,1,1000)== HAL_OK)
      {
        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
        printf("\r\n******** HAL_OK ********");
        printf("主机发送数据 :%d",Master_TX_Data_buff[0] );
        printf("主机接收数据 :%d \r\n",Master_RX_Data_buff[0] );
      }
      HAL_Delay(500);
    }


从机采用中断接收数据,如果接收成功,会在回调函数中翻转LED,并向串口打印数据,目前状况是第一个 if 函数都无法执行,好像没有进入中断。从机主要代码如下:
  if(HAL_SPI_TransmitReceive_IT(&hspi1,Slave_TX_Data_buff,Slave_RX_Data_buff,1) == HAL_OK)//这个函数在主函数中,开启接收发送中断
  {
    printf("\r\n******** HAL_OK ********");
  }


void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)//回调函数
{
  HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
  printf("\r\n******** HAL_OK ********\r\n");
  printf("从机发送数据 : %d",Slave_TX_Data_buff[0] );
  printf("从机接收数据 : %d \r\n",Slave_RX_Data_buff[0] );
}



使用特权

评论回复
沙发
Hufei1994|  楼主 | 2020-3-15 19:36 | 只看该作者
有人在做过俩块开发版SPI通讯么?

使用特权

评论回复
板凳
香水城| | 2020-3-16 11:39 | 只看该作者
你可以先这样,用同一板同一SPI,自发自收,这样先排除硬件问题。

使用特权

评论回复
地板
Hufei1994|  楼主 | 2020-3-16 20:55 | 只看该作者
香水城 发表于 2020-3-16 11:39
你可以先这样,用同一板同一SPI,自发自收,这样先排除硬件问题。

换为了一块开发版SPI1(从机)和SPI2(主机)通讯,还是不对。预想控制逻辑如下:上电,初始化开始,在主函数中开启从机发送接收中断,然后进入死循环(主机每一秒给从机发送接收一次数据,并且打印发送和接收的数据)
预想在主机发送数据时会触发从机中断,再中断服务函数中翻转LED,并且再次开启中断。
实际情况是从机一直未进入中断,看不到LED翻转,麻烦版主帮忙分析一下。

主函数如下:
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_DAC_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();
  MX_TIM1_Init();
  MX_SPI1_Init();
  MX_SPI2_Init();
  uint8_t Master_TX_Data_buff[2] = {1,2};
  uint8_t Master_RX_Data_buff[2] = {3,4};

   HAL_SPI_TransmitReceive_IT(&hspi1,Slave_TX_Data_buff,Slave_RX_Data_buff,2);//开启从机中断

  while (1)
  {
      HAL_GPIO_WritePin(SPI2_CS_GPIO_Port,SPI2_CS_Pin,GPIO_PIN_RESET);
      if(HAL_SPI_TransmitReceive(&hspi2,Master_TX_Data_buff,Master_RX_Data_buff,2,1000)== HAL_OK)
      {
        printf("\r\n******** Master-HAL_OK ********\r\n");
        printf("主机发送:%d %d \r\n",Master_TX_Data_buff[0] ,Master_TX_Data_buff[1]);
        printf("主机接收:%d %d \r\n",Master_RX_Data_buff[0] ,Master_RX_Data_buff[1]);
      }
      HAL_Delay(1000);
  }
}


中断服务函数如下:
void SPI1_IRQHandler(void)
{
  uint8_t Slave_TX_Data_buff[2] = {6,7};
  uint8_t Slave_RX_Data_buff[2] = {0};
  HAL_SPI_TransmitReceive_IT(&hspi1,Slave_TX_Data_buff,Slave_RX_Data_buff,2);
  HAL_SPI_IRQHandler(&hspi1);
  HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
}



使用特权

评论回复
5
yklstudent| | 2020-3-16 22:21 | 只看该作者
看到HAL库就无力,要么标准库,要么LL库,最后才会考虑HAL库

使用特权

评论回复
评论
Hufei1994 2020-3-17 10:47 回复TA
HAL上手快一点啊!适合新手 
6
香水城| | 2020-3-16 23:24 | 只看该作者
Hufei1994 发表于 2020-3-16 20:55
换为了一块开发版SPI1(从机)和SPI2(主机)通讯,还是不对。预想控制逻辑如下:上电,初 ...

你主机发送时要保证从机已经就绪;

建议先将这堆printf屏蔽掉,直接通过调试环境查看收发缓冲区数据;

硬件线路上再检测下有无问题;

使用特权

评论回复
7
yklstudent| | 2020-3-17 10:51 | 只看该作者
yklstudent 发表于 2020-3-16 22:21
看到HAL库就无力,要么标准库,要么LL库,最后才会考虑HAL库

遇到问题这么懵逼了

使用特权

评论回复
8
七颗咖啡豆| | 2020-3-17 11:36 | 只看该作者
瞎搞,既然用了HAL库 就严格按照流程来  ,修改中断入口里面的内容干啥。
然后初始化代码不放出来,CUBEMAX配置不放出来。

使用特权

评论回复
9
七颗咖啡豆| | 2020-3-17 11:41 | 只看该作者
新手还是建议从标准库学起,原理搞不清楚,自己也看不懂HAL库的处理机制流程。HAL用着很爽,一遇到问题就蒙圈了。
然后 私以为  cubemax HAL库是方便熟手的,免去了那些繁琐的基本配置,免去了那些繁琐的基本组件的移植

使用特权

评论回复
10
光轮TreeOS| | 2020-3-17 14:03 | 只看该作者
接上仿真器,设断点调试,从机是否进入中断,慢慢排除问题。

使用特权

评论回复
11
Hufei1994|  楼主 | 2020-3-17 21:53 | 只看该作者
七颗咖啡豆 发表于 2020-3-17 11:36
瞎搞,既然用了HAL库 就严格按照流程来  ,修改中断入口里面的内容干啥。
然后初始化代码不放出来, ...

配置如下,麻烦大佬看看

中端配置.png (343.73 KB )

中端配置.png

从机.png (293.56 KB )

从机.png

主机.png (316.69 KB )

主机.png

使用特权

评论回复
12
七颗咖啡豆| | 2020-3-18 11:33 | 只看该作者
问题在于你的

中断服务函数如下:
void SPI1_IRQHandler(void)
{
// uint8_t Slave_TX_Data_buff[2] = {6,7};
//  uint8_t Slave_RX_Data_buff[2] = {0};
// HAL_SPI_TransmitReceive_IT(&hspi1,Slave_TX_Data_buff,Slave_RX_Data_buff,2);
  HAL_SPI_IRQHandler(&hspi1);
// HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
}


标准的不是这样的,你这样修改百分之百有问题,我注释的都是你自己添加的,HAL_SPI_TransmitReceive_IT(&hspi1,Slave_TX_Data_buff,Slave_RX_Data_buff,2);不能加在这里,应当加在回调函数中

使用特权

评论回复
13
Hufei1994|  楼主 | 2020-3-18 15:56 | 只看该作者
七颗咖啡豆 发表于 2020-3-18 11:33
问题在于你的

中断服务函数如下:

这个中断服务函数是在it下面的的,是我自己修改的。修改这个应该也不会有问题啊?
回调函数使用过,也是不行的。

使用特权

评论回复
14
diweo| | 2020-3-18 16:32 | 只看该作者
有时候光看代码很难发现问题,接上逻辑分析仪看一下波形就一目了然。

使用特权

评论回复
15
Hufei1994|  楼主 | 2020-3-18 16:44 | 只看该作者
diweo 发表于 2020-3-18 16:32
有时候光看代码很难发现问题,接上逻辑分析仪看一下波形就一目了然。

这个操作需要硬件调试器不

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

160

帖子

0

粉丝