打印
[STM32F1]

俩块开发版SPI通讯

[复制链接]
350|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiajs|  楼主 | 2022-3-6 23:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
俩块开发版都是F1,作为主机的板子能正常发送接收数据,但是从机无法接受数据。俩个开发版配置一样,主机通过软件方式片选从机,

使用特权

评论回复
沙发
jlyuan| | 2022-3-6 23:29 | 只看该作者
俩块开发版是同时工作正常是与的关系

使用特权

评论回复
板凳
wyjie| | 2022-3-6 23:31 | 只看该作者
不可能一个正常,一个不正常

使用特权

评论回复
地板
stly| | 2022-3-6 23:34 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
5
jiajs|  楼主 | 2022-3-6 23:36 | 只看该作者
主机通过死循环不停地向从机发送数据,如果发送成功会翻转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] );
}

使用特权

评论回复
6
jiajs|  楼主 | 2022-3-6 23:39 | 只看该作者
有人在做过俩块开发版SPI通讯么?

使用特权

评论回复
7
jiajs|  楼主 | 2022-3-6 23:43 | 只看该作者
本帖最后由 jiajs 于 2022-3-6 23:46 编辑

我再试下

使用特权

评论回复
8
juventus9554| | 2022-3-6 23:46 | 只看该作者
你可以先这样,用同一板同一SPI,自发自收,这样先排除硬件问题。

使用特权

评论回复
9
jiajs|  楼主 | 2022-3-6 23:49 | 只看该作者
换为了一块开发版SPI1(从机)和SPI2(主机)通讯,还是不对。预想控制逻辑如下:上电,初始化开始,在主函数中开启从机发送接收中断,然后进入死循环(主机每一秒给从机发送接收一次数据,并且打印发送和接收的数据)
预想在主机发送数据时会触发从机中断,再中断服务函数中翻转LED,并且再次开启中断。
实际情况是从机一直未进入中断,看不到LED翻转

使用特权

评论回复
10
jiajs|  楼主 | 2022-3-6 23:51 | 只看该作者
主函数如下:
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);
}

使用特权

评论回复
11
dengdc| | 2022-3-6 23:52 | 只看该作者
看到HAL库就无力,要么标准库,要么LL库,最后才会考虑HAL库

使用特权

评论回复
12
lizye| | 2022-3-6 23:53 | 只看该作者
你主机发送时要保证从机已经就绪;

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

使用特权

评论回复
13
pengf| | 2022-3-6 23:54 | 只看该作者
硬件线路上再检测下有无问题;

使用特权

评论回复
14
huangchui| | 2022-3-6 23:55 | 只看该作者
接上仿真器,设断点调试,从机是否进入中断,慢慢排除问题。

使用特权

评论回复
15
zhanghqi| | 2022-3-6 23:55 | 只看该作者
有时候光看代码很难发现问题,接上逻辑分析仪看一下波形就一目了然。

使用特权

评论回复
16
jiajs|  楼主 | 2022-3-6 23:56 | 只看该作者
这个操作需要硬件调试器不

使用特权

评论回复
17
jiajs|  楼主 | 2022-3-6 23:58 | 只看该作者
我再好好缕一缕吧,有了好消息及时通知大家

使用特权

评论回复
18
guijial511| | 2022-3-7 08:01 | 只看该作者
看看程序

使用特权

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

本版积分规则

940

主题

11975

帖子

6

粉丝