EDA365电子论坛网

标题: 两个ARM间的SPI通信怎么实现?ARM型号均为STM32F429ZIT??? [打印本页]

作者: qpggup    时间: 2019-6-24 17:33
标题: 两个ARM间的SPI通信怎么实现?ARM型号均为STM32F429ZIT???

发送时,采取的函数为HAL_SPI_Transmit_IT();5 c4 i$ h3 T3 O
接收时,由于不知道对方发过来的报文长度,6 Z% L; D1 q, |' O2 j: g. L8 A
就不知道用什么函数。厂家提供的软件包里面的receive函数都需要
; U( O4 }2 Q( q! R) \( v0 C8 q指定size长度。
; o2 l- p, H( r& Q* r下面的代码中,我在最开始开启SPI_IT_RXNE中断使能。4 Y- ^! m( c" o  j* J4 n2 s
通过中断函数和数据处理函数来解析报文。并把报文上传网络服务器。
4 x0 Q9 ~/ `* s# \' v+ ]但是ARM SPI接收不到数据。不知道为啥???


1 F, E$ g! A9 ~1 V1 J本代码为SPI主机的。; E5 a; ~+ [6 Z5 r; P- }# V: W# @
/* SPI5 init function */0 d* h* s( u5 _
void MX_SPI5_Init(void), {" C5 i! ~5 v; w1 M
{

hspi5.Instance = SPI5;
+ y2 a1 Q6 S! b# P! zhspi5.Init.Mode = SPI_MODE_MASTER;
, H9 \4 b( {4 G4 Dhspi5.Init.Direction = SPI_DIRECTION_2LINES;
, u& `9 a, `+ o4 Rhspi5.Init.DataSize = SPI_DATASIZE_8BIT;, @: t# g$ o/ Y. Y6 ^& u0 l" L
hspi5.Init.CLKPolarity = SPI_POLARITY_LOW;
* y6 S% V! F$ R: shspi5.Init.CLKPhase = SPI_PHASE_1EDGE;
9 E( C( @! l7 K9 @" Nhspi5.Init.NSS = SPI_NSS_SOFT;! C( J7 J. a' V" X% Y' O
hspi5.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
9 s7 o4 U+ z. I# `. j/ Lhspi5.Init.FirstBit = SPI_FIRSTBIT_MSB;
0 G& U. y) E1 e# y0 lhspi5.Init.TIMode = SPI_TIMODE_DISABLED;
2 d7 A9 J1 t/ Thspi5.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
. ]7 m9 c0 m3 [4 WHAL_SPI_Init(&hspi5);

}

/**

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
8 G) C: p) L' L' b! ^& y{

GPIO_InitTypeDef GPIO_InitStruct;( v8 l( a- {/ \; y
if(hspi->Instance==SPI4)' ^& Y# o0 D4 m" \1 Y
{
0 N! A) h  G$ A+ ]2 N/* Peripheral clock enable */: c5 Q0 H$ i) S
__SPI4_CLK_ENABLE();

/**SPI4 GPIO Configuration PE2    ------> SPI4_SCKPE5    ------> SPI4_MISOPE6    ------> SPI4_MOSI*/GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_5|GPIO_PIN_6;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_LOW;GPIO_InitStruct.Alternate = GPIO_AF5_SPI4;HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

}

if(hspi->Instance==SPI5)" ^8 w: F! [3 l% Y7 h# R1 f
{
, p  c  v6 u0 a, _/ E* F/* Peripheral clock enable /
! G& j) E. u9 A& c__SPI5_CLK_ENABLE();
3 |! x, ?! J8 O8 W/*SPI5 GPIO Configuration 2 u# C/ |9 o0 s, d8 d4 H
PF7 ------> SPI5_SCK2 S- [5 p* J; |3 s5 H) r" t
PF8 ------> SPI5_MISO" a. P9 u) r* ]! Y' A* a( K, X
PF9 ------> SPI5_MOSI
3 [7 x& S1 o( V9 h5 j9 |' N*/, v6 a9 z: c& z# o7 X
GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
6 j2 k: [4 K& N* {# }! [  S  }, ?GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
# p5 L+ m. K1 [3 |% y. ], `) IGPIO_InitStruct.Pull = GPIO_NOPULL;1 A* l4 a; Q( D2 K& c: P
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
4 e9 P! J( k& u0 qGPIO_InitStruct.Alternate = GPIO_AF5_SPI5;; e4 b$ M. i! T
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

}

}

main()7 J2 @6 \! K4 `4 y
{4 p  Y4 i+ v- f
MX_SPI5_Init();
7 R9 ]. ~9 w4 D$ y__HAL_SPI_ENABLE_IT(&hspi5, SPI_IT_RXNE);
- F: t) ~$ J- p$ r0 z6 e6 gwhile (1)
9 o! p5 l1 Q( X7 Y/ H! S; j& |) K/ s{
0 l8 v( Y: s6 m! p: NSPI5_Master_Rx(); //读取从机发过来的数据。
# `" B  p' y: L3 e& K' s}0 h7 l5 E9 e. f/ ~
}

typedef uint8_t u8 ;
. N+ o5 g9 F) q' k0 P4 T8 {typedef uint16_t u16 ;
6 p! ?' C: ?/ _% j  U- V* E" itypedef uint32_t u32 ;
; n6 o/ H0 X' A! U  Vu8 hmosi[50]={0};7 n8 m+ o% P, Y! l0 ]' q+ h
u8 mosi1[50]={0};0 M, Z) z3 ?4 Q0 L" O
u8 phmosi[50]={0};# L$ s/ k9 ~9 S" k+ T0 b+ v
u32 imosi=0;! A' K6 @3 ^( [
u32 spi5_rx_len;
) s6 T6 K  o& m3 F6 t: Su32 ic=0;; x8 p6 A9 ]. A( [' s
#define comsize 8
  T5 k  c% d, I) h
4 h! b5 I$ m+ L" q( A- q% bextern u16 tSession;
3 u9 G3 B  y" R& T# F* i8 Y% Iu32 udata_len_spi;
5 Z1 D9 J% d1 ^extern u16 ports[comsize+1];6 R3 V8 j' D8 S1 L9 b1 d/ s1 S
extern u32 uTimeLst;
/ M% X" ~  |- y" R  x1 H3 z1 {6 r; c) S' [( U0 E
extern SPI_HandleTypeDef hspi5;
( a( @, ]5 f: B5 P) Nvoid SPI5_IRQHandler(void)  p1 ~) _9 G  `9 z+ F  G9 Y
{0 J6 D. K" ^: v$ T7 g# G
if(__HAL_SPI_GET_FLAG(&hspi5, SPI_FLAG_RXNE) == SET)
! }9 r4 E" Y' M$ e" N: @{5 ~9 c0 w" q( s9 Z& l. b! |, K0 n
hmosi[imosi++]=(uint8_t)(hspi5.Instance->DR);

}            

}

void SPI5_Master_Rx(void): w: c) ]" h6 A9 c5 f, z) m5 W
{
2 n# B$ e- z' x. m. o: N//for(;imosi>=(ic+7);ic++)
  n6 V+ h; c& [) M8 Kfor(;imosi>=(ic+5);ic++)
: h5 m8 f* R9 i{
0 \6 X$ r6 ~6 s( P1 @7 D7 jif((0x2e==hmosi[ic])&&(0x17==hmosi[ic+1])&&(0x0==hmosi[ic+2]))
5 \" O( Z! c3 q+ Y{
1 v" z* O) I% t& B2 N; \! ospi5_rx_len=hmosi[ic+6];
' f/ G/ m" j+ rudata_len_spi = spi5_rx_len+1;
4 p- o; e" z" l5 t4 D' ]memset(phmosi,0x00,udata_len_spi);
; h% o9 u+ ~4 W- e0 Kphmosi[5]=hmosi[ic+5];5 a' O. g2 c  N& _: I
$ @/ B+ U3 `% q
phmosi[6]=spi5_rx_len-7;: ?% L; V, y$ k( m% I
memcpy(phmosi+7,hmosi+ic+7,spi5_rx_len-7);* M3 b3 l7 l. `+ \
memcpy(mosi1,hmosi+ic,50-ic);
' j( N  g5 e$ l( `) G8 ?" Omemcpy(hmosi,mosi1,50-ic);
6 t5 l% Q5 ?# J7 Wimosi=imosi-ic;8 R$ \8 a5 S* |! d* M( \7 p7 K& v* P: r: c
ic=0;
: h& a* \" o2 t2 w( r//**************************$ Z' a$ g6 ^$ ^+ o2 G
tSession++;* H; A, Y$ U6 R' N! R( c
phmosi[0]=0x2e;
& z, q( l$ z5 I5 D$ g% T* Kphmosi[1]=0x17;2 Q' A- O/ I' x" @. K7 f) T2 t
phmosi[2]=0x00;; T% Q3 ~1 ?! y4 q3 R. {

  u" ~: {# |" w- ^& m; Aphmosi[3]=tSession;7 ^& B3 ~( S: T
phmosi[4]=(tSession>>8);
: N) t# V( O9 I& Z0 O# f! c/ G2 ?9 q: L, z0 o/ z6 S5 Q" h
//memcpy(udata+7,tx1_buf,rx1cnt);
5 m" _+ ^* q& Y* e' Hphmosi[udata_len_spi-1] = crc(phmosi,udata_len_spi-1,1);7 W) ?1 H" z$ @6 A- M) _7 R% x
com2net(ports[0],udata_len_spi,phmosi);. R$ P) z: }, |8 x
uTimeLst=HAL_GetTick();; [& S( I: V/ t3 X& q  [+ Q
}
7 v( W. |# |+ r2 Z* u}2 F. P+ S6 F  ]3 M2 T
}

/ T1 @! e% H( R( W$ Y$ s

作者: uerriup    时间: 2019-6-24 19:53
同命相连,帮顶
作者: ghqy22    时间: 2019-7-5 22:50
我也遇到同样的问题,我在同一个板子上的两个口通信,总是收不到




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2