发送时,采取的函数为HAL_SPI_Transmit_IT();5 c4 i$ h3 T3 O
接收时,由于不知道对方发过来的报文长度,6 Z% L; D1 q, |' O2 j: g. L8 A
就不知道用什么函数。厂家提供的软件包里面的receive函数都需要
指定size长度。
下面的代码中,我在最开始开启SPI_IT_RXNE中断使能。4 Y- ^! m( c" o j* J4 n2 s
通过中断函数和数据处理函数来解析报文。并把报文上传网络服务器。
但是ARM SPI接收不到数据。不知道为啥???
本代码为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;
hspi5.Init.Mode = SPI_MODE_MASTER;
hspi5.Init.Direction = SPI_DIRECTION_2LINES;
hspi5.Init.DataSize = SPI_DATASIZE_8BIT;, @: t# g$ o/ Y. Y6 ^& u0 l" L
hspi5.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi5.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi5.Init.NSS = SPI_NSS_SOFT;! C( J7 J. a' V" X% Y' O
hspi5.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
hspi5.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi5.Init.TIMode = SPI_TIMODE_DISABLED;
hspi5.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;
HAL_SPI_Init(&hspi5);
}
/**
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
GPIO_InitTypeDef GPIO_InitStruct;( v8 l( a- {/ \; y
if(hspi->Instance==SPI4)' ^& Y# o0 D4 m" \1 Y
{
/* Peripheral clock enable */: c5 Q0 H$ i) S
__SPI4_CLK_ENABLE();
}
if(hspi->Instance==SPI5)" ^8 w: F! [3 l% Y7 h# R1 f
{
/* Peripheral clock enable /
__SPI5_CLK_ENABLE();
/*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
*/, v6 a9 z: c& z# o7 X
GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;1 A* l4 a; Q( D2 K& c: P
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
GPIO_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();
__HAL_SPI_ENABLE_IT(&hspi5, SPI_IT_RXNE);
while (1)
{
SPI5_Master_Rx(); //读取从机发过来的数据。
}0 h7 l5 E9 e. f/ ~
}
typedef uint8_t u8 ;
typedef uint16_t u16 ;
typedef uint32_t u32 ;
u8 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;
u32 ic=0;; x8 p6 A9 ]. A( [' s
#define comsize 8
extern u16 tSession;
u32 udata_len_spi;
extern u16 ports[comsize+1];6 R3 V8 j' D8 S1 L9 b1 d/ s1 S
extern u32 uTimeLst;
6 r; c) S' [( U0 E
extern SPI_HandleTypeDef hspi5;
void 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)
{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
{
//for(;imosi>=(ic+7);ic++)
for(;imosi>=(ic+5);ic++)
{
if((0x2e==hmosi[ic])&&(0x17==hmosi[ic+1])&&(0x0==hmosi[ic+2]))
{
spi5_rx_len=hmosi[ic+6];
udata_len_spi = spi5_rx_len+1;
memset(phmosi,0x00,udata_len_spi);
phmosi[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);
memcpy(hmosi,mosi1,50-ic);
imosi=imosi-ic;8 R$ \8 a5 S* |! d* M( \7 p7 K& v* P: r: c
ic=0;
//**************************$ Z' a$ g6 ^$ ^+ o2 G
tSession++;* H; A, Y$ U6 R' N! R( c
phmosi[0]=0x2e;
phmosi[1]=0x17;2 Q' A- O/ I' x" @. K7 f) T2 t
phmosi[2]=0x00;; T% Q3 ~1 ?! y4 q3 R. {
phmosi[3]=tSession;7 ^& B3 ~( S: T
phmosi[4]=(tSession>>8);
2 ?9 q: L, z0 o/ z6 S5 Q" h
//memcpy(udata+7,tx1_buf,rx1cnt);
phmosi[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
}
}2 F. P+ S6 F ]3 M2 T
}
| 欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) | Powered by Discuz! X3.2 |