两片STM32使用HAL完成SPI全双工主从通信

发布者:心灵清澈最新更新时间:2019-01-07 来源: eefocus关键字:STM32  HAL  SPI  全双工  主从通信 手机看文章 扫描二维码
随时随地手机看文章

SPI是一种非常简单易用的全双工主从式通信协议。


本文使用两片STM32F429,一个作为主机,一个作为从机完成SPI的全双工通信测试。


在STM32的HAL库中简化了SPI主机端的发送接收,但是HAL库没有提供一个简单的SPI从机代码接口,这样就需要自己拼接接口来完成全双工的通信。以下都以实现全双工通信为目的进行配置和编写:


一 主机端:



禁止使用SPI的硬件片选信号,因为这个信号是SPI使能了之后就一直为低,直到禁止了SPI之后才为高。可以使用某一个普通IO来充当片选信号。



这里选用一个较低的速率来通信,在HAL库的spi头文件中有说明各个模式下SPI的最大速度。


二 从机端:



主从的速率要一样,从机打开SPI中断


三 硬件连接:

主机                        从机


CS                          CS


CLK                        CLK


MISO                      MISO


MOSI                      MOSI


接收和发送都是直连不需要交叉。



四 主机代码:

  /* USER CODE BEGIN 3 */

HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_RESET);


HAL_SPI_TransmitReceive(&hspi1, txbuf, rxbuf, 1, 0xFF);

HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET);

HAL_Delay(500);

  }

  /* USER CODE END 3 */

五 从机代码:

现在while之前打开spi接收中断:


  /* USER CODE BEGIN 2 */

HAL_SPI_Receive_IT(&hspi1, rxbuf, 1);

  /* USER CODE END 2 */

在中断中使用阻塞函数把数据发送出去:


/* USER CODE BEGIN 4 */

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)

{

if (hspi == &hspi1)

{

HAL_SPI_Transmit(&hspi1, txbuf, 1, 0xFFFF);

HAL_SPI_Receive_IT(&hspi1, rxbuf, 1);

}

}

/* USER CODE END 4 */


使用逻辑分析仪可以看到主机在发送的同时也收到了从机返回的数据。


可能在中断里调用阻塞发送不是很好,如果有更好的方法欢迎指正。


另外在一片stm32上使用两个SPI接口模拟主从机通信好像不能正常工作。


 

最后需要注意的是如果你使用了以上方法,能测试spi通信成功,但是当主程序有其他任务的时候就会非常卡顿,因为在中断中调用了阻塞发送的函数。为了让程序更加流畅一种方法是减小HAL_SPI_Transmit的等待时间,另外一种方法就是使用DMA.


因为这里我只需要用DMA回复SPI master数据,所以我只开启了从机的SPI发送DMA,而且没有使能DMA中断。配置如下图:




将spi.c中的代码更改如下:


/* USER CODE BEGIN 1 */

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)

{

if (hspi == &hspi1)

{

HAL_SPI_Transmit_DMA(&hspi1, p_phase_buf, 1);

//HAL_SPI_Transmit(&hspi1, p_phase_buf, 1, 0xFFF);

HAL_SPI_Receive_IT(&hspi1, p_pwm_freq, 1);

}

}

/* USER CODE END 1 */


添加DMA就是这么简单,由此就看到HAL库高效的地方了,使用起来确实能大幅提高工作效率


关键字:STM32  HAL  SPI  全双工  主从通信 引用地址:两片STM32使用HAL完成SPI全双工主从通信

上一篇:s3c2440裸板_中断体系结构
下一篇:STM32之串口DMA接收不定长数据

推荐阅读最新更新时间:2024-03-16 16:22

stm32专题二十九:Flash 读写保护
设置Flash的读写保护,其实就是操作内部Flash的选项字节。 选项字节在内部Flash的主存储页之后,由于是Flash,不能像内存RAM一样随意写入。由于Flash的写入特性,只能将 1 写成 0,而如果要确保写入数据的绝对正确,则需要先擦除再写入。如果直接对Flash写入,则只能确保写入 0 值是正确的。 选项字节,可以认为是掉电不会丢失的寄存器(Flash空间)。就是用Flash介质来存储配置,要修改选项字节,跟修改Flash一样。 RDP 读保护字节描述(可以通过j-link或st-link读Flash 加密等): RDP配置方式: 2个数据字节 Data0 Data1 3 设置写保护 RDP
[单片机]
<font color='red'>stm32</font>专题二十九:Flash 读写保护
STM32定时器中断关于何时清除中断的总结
问题:在调STM32的程序的时候,发现定时器(timer2)比自己设定的中断周期缩小了一倍。设定为10ms中断一次,但实测发现5ms便中断了一次。 初始化代码如下: void InitTimer2(void) { RCC- APB1ENR|=0x01; //enable clock,max clock=36M TIM2- PSC=71; // counter clock CK_CNT=72M/(71+1)=1M TIM2- ARR=10000; // 10000*1us=10ms TIM2- CR1 |=0x0080; //Auto-reload preload enable TIM2- EGR |=0x0001;
[单片机]
STM8L SPI使用过程记录
STM8L SPI使用过程记录 工作需要,需要使用SPI方式和DSP进行通信,关于SPI通信,作为一名新手,还停留在大学时候学的MOSI/MISO阶段,没有实际的应用经验,所以遇到了不少有趣的事情,记录一下,防止以后再犯同样的错误。 SPI从机:STM8L SPI主机:DSP 问题一:主机接收异常 现象:从机向主机发送 “1234”,主机收到“11223334” 过程及分析: 从机向主机数据的时候,主机轮训去读,但是一直读到数据如上,一直不正常,主机SPI频率为4M,从机主机频率为8M,通过示波器测量也是只要主机发送clk去读,从机就返回异常的数据,一直找不到原因,后来询问别人猜测是主机SPI频率太快导致的此问题 解决方法:降低
[单片机]
stm32入门——PWM输出控制直流电机变速
最近刚做了智能小车的寻迹实验,实验中用了定时器PWM输出来改变直流电机的转速,我在这里就大致总结一下PWM相关的知识。 什么是PWM? PWM(Pulse Width Modulation)脉冲宽度调制。 占空比:pwm占空比就是一个脉冲周期内有效电平在整个周期所占的比例。 通过调节PWM的占空比就能调节IO口上电压的持续性变化,因此也能够控制外设的功率进行持续性变化,也就能控制直流电机的转速快慢。 那么重点就在于如何调节PWM波形的输出。如下图所示 图中的ARR是我们给定时器的一个预装载值,CCRx的上下变化是产生PWM波的关键。我们假设ARR大于CCRx的部分输出为高电平(即t1-t2、t3-t4、t5-t6),ARR
[单片机]
<font color='red'>stm32</font>入门——PWM输出控制直流电机变速
STM32HAL库和标准库的GPIO
HAL库 使用CubeMX自动生成需要的代码。 一、初始化GPIO 自动生成的HAL库GPIO初始化代码: void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO
[单片机]
stm32成长记之中断介绍
嵌套向量中断控制器 特性 ●68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线); ● 16个可编程的优先等级(使用了4位中断优先级); 外部中断/事件控制器框图 外部中断程序设计思路: 中断初始化,主要是完善三个结构体: ①GPIO_InitTypeDef (功能:IO配置) ②EXTI_InitTypeDef (功能:中断配置) ③NVIC_InitTypeDef (功能:中断优先级配置) 抢占优先级高的可以抢占优先级低的,即发生中断嵌套;响应优先级高的中断先进行,但不会抢占响应优先级低的中断,即不能发生中断嵌套; void exti_init() { GPIO
[单片机]
<font color='red'>stm32</font>成长记之中断介绍
stm32_ps2键盘显示测试程序
//PS2键盘测试程序,可换行,按shift不放接着输入 //可输出大写,按下CAPS输出大写,再次按下输出小写 //此程序只用来测试,代码冗余,仅供参考,可根据需要自行删减 //PA13- PS2.CLK PA15- PS2.DATA #include #include sys.h #include usart.h #include delay.h #include led.h #include key.h #include exti.h #include wdg.h #include timer.h #i
[单片机]
STM32单片机特性解析
STM32单片机 由ST厂商推出的STM32系列单片机,行业的朋友都知道,这是一款性价比超高的系列单片机,应该没有之一,功能及其强大。其基于专为要求高性能、 低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核,同时具有一流的外设:1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,在功耗和集成度方面也有不俗的表现,当然和MSP430的功耗比起来是稍微逊色的一些,但这并不影响工程师们对它的热捧程度,由于其简单的结构和易用的工具再配合其强大的功能在行业中赫赫有名。其强大的功能主要表现在: 特性 1、内核:ARM32位Cortex-M3CPU,最高工作频率72MHz,1.25DMIPS/MHz,单周
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved