硬汉嵌入式论坛

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

[技术讨论] 基于HAL库STM32F407的SPI通信,

[复制链接]

3

主题

5

回帖

14

积分

新手上路

积分
14
发表于 2024-8-26 11:52:52 | 显示全部楼层 |阅读模式
求助,我现在在使用STM32F407H723VET6对BMI270进行SPI通信,为什么我的给的程序发送的是0X80,但是SPI通过示波器抓出来的波形不是0X80,程序如下,能佛iu告知我是哪里出了问题,谢谢。
SPI3的配置如下:
void MX_SPI3_Init(void)
{

  /* USER CODE BEGIN SPI3_Init 0 */

  /* USER CODE END SPI3_Init 0 */

  /* USER CODE BEGIN SPI3_Init 1 */

  /* USER CODE END SPI3_Init 1 */
  hspi3.Instance = SPI3;
  hspi3.Init.Mode = SPI_MODE_MASTER;
  hspi3.Init.Direction = SPI_DIRECTION_2LINES;
  hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi3.Init.NSS = SPI_NSS_SOFT;
  hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi3.Init.CRCPolynomial = 0x0;
  if (HAL_SPI_Init(&hspi3) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN SPI3_Init 2 */

  /* USER CODE END SPI3_Init 2 */

}
在主函数中的循环中,每隔50ms执行一次下面函数:
    SPI3_CSB_L;
    //HAL_SPI_Receive(BMI270_SPI,Reg | BMI270_SPI_R,Temp_Data,Len + 1,1);
//    HAL_SPI_TransmitReceive(&BMI270_SPI,0x80,Temp_Data,3,1000);

                HAL_SPI_Transmit_IT(&BMI270_SPI, 0x80,2);
SPI3_CSB_H;
112.jpg
SPI3_CSB_L;
    //HAL_SPI_Receive(BMI270_SPI,Reg | BMI270_SPI_R,Temp_Data,Len + 1,1);
//    HAL_SPI_TransmitReceive(&BMI270_SPI,0x80,Temp_Data,3,1000);
                HAL_SPI_Transmit_IT(&BMI270_SPI, 0x80,1);
    SPI3_CSB_H;
113.jpg

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-8-26 12:36:33 | 显示全部楼层
方便的话,将SCK,MISO,MOSI都接示波器,测试个完整的波形看下,
回复

使用道具 举报

0

主题

20

回帖

20

积分

新手上路

积分
20
发表于 2024-8-26 15:02:02 | 显示全部楼层
别调用HAL_SPI_Transmit_IT(), 这个是中断发送;你这应该使用HAL_SPI_Transmit()
回复

使用道具 举报

0

主题

20

回帖

20

积分

新手上路

积分
20
发表于 2024-8-26 15:03:43 | 显示全部楼层
别调用HAL_SPI_Transmit_IT(), 这个api是在中断内发送;你这应该调用HAL_SPI_Transmit()
回复

使用道具 举报

3

主题

5

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2024-8-27 11:24:30 | 显示全部楼层
硬汉哥,问题目前解决了,是我代码写错了。但是我遇到了一个新的问题,在BMI270的初始化进程中,我先向芯片的一个寄存器0x7C写入0x00,在向寄存器0x59写入0x00,我发现调用函数HAL_SPI_Transmit()发送的时候,连续发送可以,我如果在两个发送中间加入Hal_Delay(1)的延时,示波器显示的波形就只有乱拉,请问这是什么问题呀。
我的代码如下
61d339690421c6f297770446da405543.jpg
下面是不加延时的效果

加了延时后的效果如下

3.jpg
1.jpg
2.jpg
回复

使用道具 举报

3

主题

5

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2024-8-27 11:26:44 | 显示全部楼层
eric2013 发表于 2024-8-26 12:36
方便的话,将SCK,MISO,MOSI都接示波器,测试个完整的波形看下,

谢谢硬汉哥,问题已经解决了,是我代码的问题
回复

使用道具 举报

3

主题

5

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2024-8-27 11:31:08 | 显示全部楼层
还有一个关键的问题是,我在给BMI270初始化的时候,需要向写入一个8192大小的u8类型的配置文件,我使用HAL_SPI_Transmit()函数时,最多写入1500数组,示波器就抓不到波形了,这种一般是示波器没抓到还是我的程序没有往外发送了呀
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-8-28 09:15:34 | 显示全部楼层
123456 发表于 2024-8-27 11:31
还有一个关键的问题是,我在给BMI270初始化的时候,需要向写入一个8192大小的u8类型的配置文件,我使用HAL_ ...

那就考虑分多次写入,每次写100个是否正常。
回复

使用道具 举报

3

主题

5

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2024-8-28 10:24:42 | 显示全部楼层
eric2013 发表于 2024-8-28 09:15
那就考虑分多次写入,每次写100个是否正常。

我现在用的for循环写入的,每次写一个进去拿示波器抓的波形是没问题啦,但是BMI270初始化还是不成功,一直报错,我还在查为什么
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 02:51 , Processed in 0.045856 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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