你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

这个函数是配置和启动SPI的DMA传输吗?:HAL_StatusTypeDef HAL_SPI...

[复制链接]
李公 发布时间:2015-6-4 10:59
这个函数是配置和启动SPI的DMA传输吗?:HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size)
" r: u7 z' K2 v8 _是从用STM32CubeMX生成的,给果没有传输。参考了STM32Cube_FW_F3_V1.1.0\Projects\STM32F303RE-Nucleo\Examples\SPI\SPI_FullDuplex_ComDMA这 个例子。以下是我的程序。$ f0 M, v+ P" ~" C

+ K) k& @6 ?+ J0 b% m/*** \( k( [: [6 p$ `. X
  ******************************************************************************
+ U% j6 Q- B* N" L" B9 {! f  * File Name          : main.c9 l8 V1 r9 J7 I
  * Date               : 04/06/2015 09:34:39! j# `4 A1 G$ ^) }
  * Description        : Main program body; ~' [, j2 w5 s% u* @; V% m5 D. X0 r
  ******************************************************************************
) h6 c0 e/ U2 |  *
( C% D5 m7 y2 X4 I  * COPYRIGHT(c) 2015 STMicroelectronics
; `! v+ X5 r6 Z1 p  *
3 a; Y7 Y% ^8 i: c! Z3 ^  * Redistribution and use in source and binary forms, with or without modification,
" q& j/ L9 ]; W/ k  * are permitted provided that the following conditions are met:
8 N5 O: D) M, P  *   1. Redistributions of source code must retain the above copyright notice,6 V; F8 M0 l9 a  b/ H; t6 C# q
  *      this list of conditions and the following disclaimer.1 W, N+ Y+ p  B
  *   2. Redistributions in binary form must reproduce the above copyright notice,4 I9 g! A% I; K7 U& x
  *      this list of conditions and the following disclaimer in the documentation
# I8 I- S' m  J. v0 ^% T- b  *      and/or other materials provided with the distribution.
8 K0 B  C* P' l0 R# u" I3 l  *   3. Neither the name of STMicroelectronics nor the names of its contributors
# Y! B* z3 N1 ^# ]! i: A  *      may be used to endorse or promote products derived from this software7 P- a6 L- Y) V4 e1 `
  *      without specific prior written permission.
' Y" _! G5 q+ D  m$ V3 }1 u/ U  ** S3 x; a4 R7 ]" T9 w  X# Z
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
" a  l( q7 W# E; h# E  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4 p6 u+ z4 \3 `( ]  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE4 T; B6 M/ f7 s7 O4 Z* s4 s1 y
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
2 }. G/ W# i2 s% }3 s3 P& h5 t  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL0 \) k1 i7 x" O8 d; Q
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
1 E  O! @% t, t. V: M2 s  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER6 a9 |# l! Y# z9 P
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,6 v# w4 t4 c5 m7 G3 e
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE3 j6 G5 [- X% {' O
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.$ A$ |& `8 @9 u6 t0 N
  *
* m6 `1 p/ V" l6 ^& J  ******************************************************************************
* A8 C! G: Y' {7 Q  */
4 {) }; [3 \% D4 f! O/* Includes ------------------------------------------------------------------*/2 ]' h' j( q' n! ]) W
#include "stm32f3xx_hal.h"
! |. B: {! k, u" a6 ^/ P; ?0 w! c/* USER CODE BEGIN Includes */
+ y( S9 ]% _# p4 g" c$ d1 I/* USER CODE END Includes */' D) ~& m7 b4 S) m" [
/* Private variables ---------------------------------------------------------*/
  u) \5 u* y9 O7 U: a3 T6 zSPI_HandleTypeDef hspi2;. @( ^' E8 b9 H5 r* j. Q: X
DMA_HandleTypeDef hdma_spi2_rx;
; z2 M% I/ H& k. [+ RDMA_HandleTypeDef hdma_spi2_tx;7 s9 ?# ]/ P3 Y% l! |
/* USER CODE BEGIN PV */9 x6 ]1 i& F2 h2 I  C
/* Buffer used for transmission */
5 I; v6 w  h( F& A3 E" e, f0 m6 i( V#define BUFFERSIZE 165 K! O  }/ A5 ]. T' M
uint8_t aTxBuffer[] = "****SPI - Two Boards communication based on DMA **** SPI Message ******** SPI Message ******** SPI Message ****";- ~5 g+ ^" [' y5 ~; ]4 `. c
/* Buffer used for reception */
4 m* u2 {4 o2 y8 G) c4 Quint8_t aRxBuffer[BUFFERSIZE];
1 [9 G0 J/ v0 d( M) Y/* USER CODE END PV */0 P( Q! `( ]# I2 k* X8 |
/* Private function prototypes -----------------------------------------------*/$ b' Y$ t, j+ ]) C
void SystemClock_Config(void);4 c1 C) t( b9 }' [$ u5 _' D
static void MX_GPIO_Init(void);
. @9 Y+ R- T6 v3 Y( Dstatic void MX_DMA_Init(void);
& F/ W4 i6 h4 u% S7 {/ d) q2 jstatic void MX_SPI2_Init(void);
" P5 P5 c3 V9 L/* USER CODE BEGIN PFP */( L, Y) F) L/ z; t: ^
static void Error_Handler(void);
. j6 ^; d- o9 R% {6 V/* USER CODE END PFP */
; E" Z8 o4 w' U9 `: f* e/* USER CODE BEGIN 0 */
: \) R& M# U8 a2 T/* USER CODE END 0 */
% D- @4 L- o" o8 o9 V) jint main(void)( f8 |7 F- q& I6 y4 I5 A2 i( o
{$ X+ _# ]# J7 g+ f
  /* USER CODE BEGIN 1 */- h" `+ ?2 K2 v  |! r
  /* USER CODE END 1 */
# I# [0 |! r9 Z; _) Y, u& m- @  /* MCU Configuration----------------------------------------------------------*/* l2 [" [- @3 t# C# J. Z* `4 p
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */+ K# P2 q8 T( }6 w( V! A4 M1 v
  HAL_Init();  _! y7 I- `! w! E  r0 M/ w
  /* Configure the system clock */% _4 Y2 \. P: L
  SystemClock_Config();7 S: K6 r0 `5 r6 v! W0 |/ q1 e, K
  /* Initialize all configured peripherals */
! M$ }0 N; Y0 u* ^  MX_GPIO_Init();( ?9 ^& A0 q# D* p. r& Y8 V0 }
  MX_DMA_Init();: w: }* a5 R, l9 @) g! h
  MX_SPI2_Init();
* y: [5 g; H  W2 k+ \  /* USER CODE BEGIN 2 */4 l9 Q0 s1 Y- `" N
   if(HAL_SPI_TransmitReceive_DMA(&hspi2, (uint8_t*)aTxBuffer, (uint8_t *)aRxBuffer, BUFFERSIZE) != HAL_OK); g6 ~1 a& @! b2 O( g
  {
. E) B% J6 u4 B3 ~2 Z. r  f* c& I    /* Transfer error in transmission process */: {' I+ h3 D" k0 R- w- f% N
    Error_Handler();
4 F& O% W. l  j& [  }
' E/ q' r1 k: C2 l" u$ V& q! G& R  /* USER CODE END 2 */
2 d6 B: g- O+ H" m8 R  /* Infinite loop */( W2 q9 z0 ~0 S: v
  /* USER CODE BEGIN WHILE */
5 \2 g' X0 v( l7 D& p  while (1)6 P0 }9 M# z: W  V
  {
. M) ]2 L" _9 ]8 D  /* USER CODE END WHILE */
# D$ r0 h; |' d7 C( W  /* USER CODE BEGIN 3 */- `& ]  }  N# r# k' ^
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET); 0 L+ t8 ]) U4 m6 ^9 g4 B2 X
  HAL_Delay(100);& \% A" h# m3 R: f! [
   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET); - y* j$ }# G+ y# [
  HAL_Delay(100);/ B6 j& D9 v, ^( w$ n  `
  }9 b: W- @# E3 \4 Z6 I2 G1 @
  /* USER CODE END 3 */
) `1 s9 T* O. j+ V9 X}7 d4 q  W2 ]! Q" H8 K1 y; I
/** System Clock Configuration% ]4 e! i; H1 N3 Z- D9 {
*/* f4 h% R+ j/ D, m( r0 z; }
void SystemClock_Config(void)% [% v, }6 X$ z, k8 v
{, M4 P1 p8 `* v. C/ m/ Y; r+ q
  RCC_OscInitTypeDef RCC_OscInitStruct;
$ X0 X9 r: @  W0 r; V  RCC_ClkInitTypeDef RCC_ClkInitStruct;
/ i, {0 |; d  U2 A* f# B  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
1 m4 {" |- F6 t  RCC_OscInitStruct.HSIState = RCC_HSI_ON;, F+ B7 j9 o# F0 ~! E, U
  RCC_OscInitStruct.HSICalibrationValue = 16;
' I, S) i. H9 C" T8 S  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
0 s2 t4 r9 l& k  HAL_RCC_OscConfig(&RCC_OscInitStruct);5 P' z* V, [5 Z+ U2 z
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
# i8 D. j3 `7 p/ p" H3 K3 P4 W  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
6 u, P( A4 V  s4 W/ d  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
8 x$ V! L% Y" l! b" k4 k  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;% t0 b# `$ Z  N
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
* @; k* J3 }2 W9 d( l  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
7 f- L! |  T' j( k6 |: i  __SYSCFG_CLK_ENABLE();
2 D1 A7 B& |0 k; c7 r}
  Y0 z3 l. ~/ K% w- S/* SPI2 init function */! k: Q) |5 o0 l7 L; v
void MX_SPI2_Init(void)0 _; Q. m+ q! d1 t
{9 G2 H; @. {6 m7 k! d5 h  C  q
  hspi2.Instance = SPI2;/ H, P2 H* c' p+ b" P% S
  hspi2.Init.Mode = SPI_MODE_MASTER;) R5 I9 C2 Y8 p3 M7 a
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
. b3 ^- V& V! V  hspi2.Init.DataSize = SPI_DATASIZE_16BIT;2 i3 g# E6 y: r4 l# w, v) t
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;# P8 {. N  K: F% i, `
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
3 J0 E$ a7 H  u& U5 B3 x/ X  hspi2.Init.NSS = SPI_NSS_HARD_OUTPUT;* p% |4 v  P6 c$ q/ }4 H) m) f
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
8 C1 ]6 Q2 g; O2 G% \  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
+ N3 u" K' {# e# G  hspi2.Init.TIMode = SPI_TIMODE_DISABLED;
1 \  c5 y. o  X( s1 p: h  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;2 t0 p7 z( I* S+ V
  hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLED;
7 e0 |: f6 m! w+ j4 j5 T' [  HAL_SPI_Init(&hspi2);" Z4 k5 d1 I& x8 S$ b
}  B+ b/ }( S' r; S
/** + Q  _' |2 I- D3 b
  * Enable DMA controller clock
. x' B0 f- {$ J7 M8 {: g% D( c  */) V# m! X7 R2 U. A
void MX_DMA_Init(void)
8 m' N5 \$ q% W4 f' b{( V  H. }# ~$ U4 h
  /* DMA controller clock enable */; @# Q% N! [/ d. e. h
  __DMA1_CLK_ENABLE();$ _, B$ t. M) U& J% z
  /* DMA interrupt init */
3 `' ]$ _7 d! {* @9 |5 z' P  HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0);( s; x- t" J. V7 D' `" U- D3 o- @
  HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);. L+ T! d6 \& A0 Q$ g" v3 Z
  HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);+ W3 a% Q% x5 M& }* W$ A9 B- C9 v
  HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
$ \/ l, Z+ K# O# ^/ F2 N# @}
! v. [$ m  ^* Z/** Configure pins as . {( K* \% x& t
        * Analog + V% J/ o8 h+ f( g
        * Input ' D& B6 D- }2 z+ B4 W# w
        * Output
' F$ Y" \7 W5 W* b7 h) v/ }( R+ P        * EVENT_OUT, |7 c, b5 Z( z  P; v8 T  q7 |
        * EXTI
8 t1 S9 K* k5 J. B& w  w( b*/. M: i+ A  o/ R; g! u
void MX_GPIO_Init(void)
' b* n% L: ]6 P2 t{
( r2 ?! r: \7 M6 R. e, V  GPIO_InitTypeDef GPIO_InitStruct;
7 v* ]( _7 e- z9 M  /* GPIO Ports Clock Enable */
8 X8 t$ Y1 d, O' Z* T  __GPIOF_CLK_ENABLE();" r  T' y8 ~5 K0 M1 X
  __GPIOB_CLK_ENABLE();
5 z( I+ ]% F9 N0 O  /*Configure GPIO pin : PB13 */; B, y' ^8 A4 ~6 @. G$ G# Q# d
  GPIO_InitStruct.Pin = GPIO_PIN_13;. [+ S: l& |- B
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;; F& m( o/ E" ?8 _3 u
  GPIO_InitStruct.Pull = GPIO_NOPULL;! L; {' [8 G4 K
  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;; z2 y2 D0 F- x, \2 [/ W, P3 j
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);8 H) {5 [; R2 K! w3 i, N& z
}
  q2 y3 t9 ^* I- ?- \/* USER CODE BEGIN 4 */
, {4 }# F% B' r, V/**! Q$ s# h4 [5 N% p$ C2 _" V
  * @brief  This function is executed in case of error occurrence.
' [+ D1 w9 r, \1 P3 R) D5 E5 A; A7 z  * @param  None
. O* @, }2 ]" c  * @retval None
: {$ a; Z, ]3 }* x5 o/ y  */1 h% z4 l8 }8 ~  a! b( @1 h5 I
static void Error_Handler(void)
9 _8 B0 V/ p9 S{
" X: ~6 v! x3 v  while(1)
7 t! k: r. M( w* Y  {
, p. K9 w3 ~  P& l% A% r    /* Toogle LED for error */' I6 G9 y2 t) l1 A
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET); ! |9 v5 b6 p+ d$ x0 C5 b3 t
  HAL_Delay(100);) ^( R4 ]: \/ M3 }( S
   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET); ! o( ~- N; ~7 K5 f
  HAL_Delay(1000);
+ ~/ ?, p- }% `- L* v" p, @   }& V2 y" g- Z* K. X
}
+ Z$ T5 ]; m4 z4 n$ d
9 O. o: q* b. s; ^3 I& C+ I/* USER CODE END 4 */
2 w, e  }& V1 F% p# X+ E8 s. J#ifdef USE_FULL_ASSERT9 E/ f% M" }% l6 }" M& I% c
/**
( l* J$ s6 z, Z9 \2 M   * @brief Reports the name of the source file and the source line number
6 d7 p' p4 C3 F# x! N/ l   * where the assert_param error has occurred.5 I$ u4 \! {) N
   * @param file: pointer to the source file name3 }. z0 i/ ~0 H' x3 e
   * @param line: assert_param error line source number
& X& l$ O3 e( x* h7 ^0 ]   * @retval None
4 ^' L) d9 h5 A5 M3 d   */" X8 P2 ~" n. I6 N5 n+ H, w3 [
void assert_failed(uint8_t* file, uint32_t line)
1 {6 _2 l) w4 w1 n, X{* N: {7 H6 l) ?8 C/ V: g4 _5 W
  /* USER CODE BEGIN 6 */  |7 _6 M; a! e8 @3 E$ C
  /* User can add his own implementation to report the file name and line number,& @3 R3 a' g) v- T
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */3 Y# h5 n, M$ o" ~+ W7 S  f
  /* USER CODE END 6 */% m  i, v6 k3 M4 t
}. O& B" Z" S0 K
#endif0 J3 e: w% c. @+ ^/ }4 e9 m' T
/**
. i! Q( l* ]. b5 D4 I; ?5 N/ ^+ t. P  * @}, Y4 m8 D. O" p' x0 a
  */ 5 k7 a6 H; h: O1 t9 ?6 ^
/**
5 t$ q/ D6 h1 Y+ V  * @}
- e3 W$ @- R. n4 z6 O+ u*/ 7 {* P" {: N8 P/ ]/ x5 W& k# L
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
% V2 X1 ]- Q& g& i) K
赞 收藏 1 评论10 发布时间:2015-6-4 10:59

举报

10个回答
guohaidao 回答时间:2016-8-31 17:26:51
折腾一个下午终于弄好了SPI的DMA通道,HAL确实很复杂,注意利用例子上的两个回调函数来检测是否发送完毕,另外HAL_SPI_TransmitReceive_DMA这个函数可以,其他单独收发的对于配置成双工SPI工作不正常。& @( A) R- {; p: M; X; g- L. M
__IO uint32_t wTransferState = SPI_DMA_TRANSFER_WAIT;
: L4 f- d8 \2 H
6 W' T! L( k. W) Jvoid HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
7 y* Q; z& W! g  W{- S" o  n  u' A) _9 ~' N3 V! R
  wTransferState = SPI_DMA_TRANSFER_COMPLETE;" V% Q2 K* N4 `
}
( P: g6 A) a; h0 T/ J* F
% b" R" T) C) H0 ivoid HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)5 F3 z- V. x# v% n: h
{
" W5 Q5 T, a# W) @& V  wTransferState = SPI_DMA_TRANSFER_ERROR;
; l- J: c+ |; ]# a) T( M}
. W% E1 Y8 ]( ]: e" @$ z
jcx0324 回答时间:2015-6-4 12:26:02
不太习惯cube中产生的库,真心看起来累
jiaswang 回答时间:2015-6-4 12:27:45
只用过UART的DMA,不知道和SPI区别大不,你看下是不是有个SPI Start DMA的函数,可能是先在初始化时候运行下start才可以传输的
Tension 回答时间:2015-6-4 13:55:30
是的,这是全双工。不过一般半双工,选择收/发其中一种。
你好我好大家好! 回答时间:2015-6-4 15:53:39
帮顶              
无力回天 回答时间:2015-6-4 16:04:42
不是写了吗
为什么是EEFOCUS小白 回答时间:2015-6-6 10:20:52
不懂帮顶
DarkG 回答时间:2017-1-23 14:00:10
guohaidao 发表于 2016-8-31 17:26
0 L9 H7 A3 M+ {$ `' W- Q折腾一个下午终于弄好了SPI的DMA通道,HAL确实很复杂,注意利用例子上的两个回调函数来检测是否发送完毕, ...

# ^6 J# x$ T: g) L6 G请问楼主,我使用DMA接收SPI,在ReceiveOnly模式,3个字节接收,接收到的数据有点奇怪,从我读取到数据来看,像是错位了。
bzy0212 回答时间:2017-3-22 10:16:37
HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi)! [5 m7 |# d: f& N
大神,请问那个参数hspi是什么意思?
冯兆亮 回答时间:2017-8-12 12:03:31
guohaidao 发表于 2016-8-31 17:26
  _( r, b# M$ [' P  B2 K折腾一个下午终于弄好了SPI的DMA通道,HAL确实很复杂,注意利用例子上的两个回调函数来检测是否发送完毕, ...

" ?, p+ y. u$ Y0 `% M+ S请问楼主的SPI发送和接收函数怎么写的?使用的就只有HAL_SPI_TransmitReceive_DMA函数吗?全双工怎么打开发送和接收呢?

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版