OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6941|回复: 11

利用STM32CubeMX软件实现stm32f427双机SPI全双工模式发送接收成功(HAL库函数)

[复制链接]

10

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2016-8-25
在线时间
62 小时
发表于 2019-7-9 18:22:51 | 显示全部楼层 |阅读模式
内容:如题
1、硬件连接
主机和从机之间:MOSI--MOSI;MISO--MISO;SCK--SCK;NSS(主机可以随便GPIO,后面讲到)--NSS
2、SPI配置问题:
利用STMCube MX软件配置。
软件下载地址:https://www.st.com/zh/development-tools/stm32cubemx.html

(1)主机:这里选取的是SPI2
因为主机端是主导整个通信,不论是读数据还是写数据,都是主机先引导。所以主机端配置也是主导地位,时钟的配置,数据长度,高位先发送还是低位先发送,都是主机这边确定。关键点在于NSS引脚的问题,主机端选择从器件软件管理模式这样内部的SSI值就直接赋值给了NSS内部引脚(这个可以去看看一些坛友的解读),也就是在配置的时候Hardware NSS Signal 选择Disable。所以这个NSS引脚就可以当成普通的IO去使用了,那如果是这样的话,在从机的NSS引脚,随便接一根GPIO就可以了。只要将该引脚设置为output即可。
(2)从机:这里选取的是SPI2,软件配置几乎和主机没什么变化,主要是在于NSS选择。在配置的时候Hardware NSS Signal 选择Hardware NSS Input Signal 。从机设置为硬件输入比较好。
3、发送接收程序:
(1)主机的发送接收函数:
为什么是发送and接收呢?因为spi的全双工模式之下,发送和接收是同时发生的,移位寄存器的数据环流。可以去看具体的时序图找结果。
  while (1)  {                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);                HAL_SPI_TransmitReceive(&hspi2,txbuff1,rxbuff,10,1000);                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);                HAL_Delay(1000);                cnt++;                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);                HAL_SPI_TransmitReceive(&hspi2,txbuff2,rxbuff,10,1000);                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);                HAL_Delay(1000);                cnt++;    /* USER CODE END WHILE */    /* USER CODE BEGIN 3 */  }
(2)从机的接收发送函数:
关键注意点:在进入回调函数之前,必须先执行一遍
void SPI2_init_IT(void){        HAL_SPI_TransmitReceive_DMA(&hspi2,txbuff1,rxbuff,10);}
在main.c中,在初始化spi之后,执行上面这就话就可以。
int main(void){  /* USER CODE BEGIN 1 */  /* USER CODE END 1 */    /* MCU Configuration--------------------------------------------------------*/  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */  HAL_Init();  /* USER CODE BEGIN Init */  /* USER CODE END Init */  /* Configure the system clock */  SystemClock_Config();  /* USER CODE BEGIN SysInit */  /* USER CODE END SysInit */  /* Initialize all configured peripherals */  MX_GPIO_Init();  MX_DMA_Init();  MX_SPI1_Init();  MX_SPI2_Init();  /* USER CODE BEGIN 2 */SPI2_init_IT();  /* USER CODE END 2 */  /* Infinite loop */  /* USER CODE BEGIN WHILE */  while (1)  {    /* USER CODE END WHILE */    /* USER CODE BEGIN 3 */  }  /* USER CODE END 3 */}
在spi.c文件中写回调函数
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi){        if(hspi==&hspi2)        {                cnt++;                if(cnt%2==1)                {                        HAL_SPI_TransmitReceive_IT(&hspi2,txbuff1,rxbuff,10);                }                else                 {                        HAL_SPI_TransmitReceive_IT(&hspi2,txbuff2,rxbuff,10);                }        }}
在这里,从机还可以单独接收主机发送过来的数据,不发送数据给主机。但是一般情况下,主机想要读取从机的数据,就需要先向从机写数据,于此同时实现读取数据的功能。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2016-8-25
在线时间
62 小时
 楼主| 发表于 2019-12-28 19:08:10 | 显示全部楼层
zhangbing12304 发表于 2019-10-21 14:58
楼主能分享下源代码么??

可以啊。需要的话私聊 邮箱
回复 支持 1 反对 0

使用道具 举报

7

主题

237

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1110
金钱
1110
注册时间
2019-5-6
在线时间
128 小时
发表于 2019-10-16 14:22:46 | 显示全部楼层
感谢楼主分享,为楼主点赞!!!
回复 支持 反对

使用道具 举报

7

主题

237

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1110
金钱
1110
注册时间
2019-5-6
在线时间
128 小时
发表于 2019-10-21 14:58:21 | 显示全部楼层
楼主能分享下源代码么??
一步一个脚印
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2019-6-20
在线时间
2 小时
发表于 2019-12-28 21:18:50 | 显示全部楼层
我最近也在用427,请教一个问题。我在做CAN这块,但是我现在CAN1或者CAN2都是参考正点原子F429的例程写的,为什么会出现接收CAN数据的时候严重丢包,大概五六十包才能收到一包。
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-8-24
在线时间
16 小时
发表于 2020-1-7 01:31:10 | 显示全部楼层
LeBron 发表于 2019-12-28 19:08
可以啊。需要的话私聊 邮箱

亲,能不能分享下源代码,谢谢18266398308@163.com
回复 支持 反对

使用道具 举报

5

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2014-1-12
在线时间
13 小时
发表于 2020-3-21 20:03:02 | 显示全部楼层
LeBron 发表于 2019-12-28 19:08
可以啊。需要的话私聊 邮箱

能分享下STM32CubeMX文件和源码吗?谢谢了 邮箱:408916705@qq.com
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2020-2-10
在线时间
3 小时
发表于 2020-3-24 12:08:37 | 显示全部楼层
LeBron 发表于 2019-12-28 19:08
可以啊。需要的话私聊 邮箱

谢谢楼主,284532970@qq.com
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2020-5-22
在线时间
7 小时
发表于 2020-5-26 16:09:45 | 显示全部楼层
回复 支持 反对

使用道具 举报

9

主题

91

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1849
金钱
1849
注册时间
2019-3-8
在线时间
324 小时
发表于 2020-9-3 10:10:21 | 显示全部楼层
xudongqiang987@126.com 谢谢楼主
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2021-5-27
在线时间
1 小时
发表于 2022-1-1 19:09:48 | 显示全部楼层
能分享下STM32CubeMX文件和源码吗?谢谢了 邮箱:1453660816@qq.com
回复 支持 反对

使用道具 举报

4

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
181
金钱
181
注册时间
2015-8-22
在线时间
27 小时
发表于 2022-8-6 14:07:56 | 显示全部楼层
楼主能分享一下源代码吗? 18322571681@163.com
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 09:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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