weixin_41550238 2018-04-10 02:06 采纳率: 0%
浏览 2209
已结题

两个ARM间的SPI通信怎么实现?ARM型号均为STM32F429ZIT。

发送时,采取的函数为HAL_SPI_Transmit_IT();
接收时,由于不知道对方发过来的报文长度,
就不知道用什么函数。厂家提供的软件包里面的receive函数都需要
指定size长度。
下面的代码中,我在最开始开启SPI_IT_RXNE中断使能。
通过中断函数和数据处理函数来解析报文。并把报文上传网络服务器。
但是ARM SPI接收不到数据。不知道为啥?
本代码为SPI主机的。
/* SPI5 init function */
void MX_SPI5_Init(void)
{

hspi5.Instance = SPI5;
hspi5.Init.Mode = SPI_MODE_MASTER;
hspi5.Init.Direction = SPI_DIRECTION_2LINES;
hspi5.Init.DataSize = SPI_DATASIZE_8BIT;
hspi5.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi5.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi5.Init.NSS = SPI_NSS_SOFT;
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);

}

/**

  • @brief Initializes the SPI according to the specified parameters
  • in the SPI_InitTypeDef and create the associated handle.
  • @param hspi: pointer to a SPI_HandleTypeDef structure that contains
  • the configuration information for SPI module.
  • @retval HAL status */ HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi) { ..... HAL_SPI_MspInit(hspi); ...... }

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{

GPIO_InitTypeDef GPIO_InitStruct;
if(hspi->Instance==SPI4)
{
/* Peripheral clock enable */
__SPI4_CLK_ENABLE();

/**SPI4 GPIO Configuration 
PE2    ------> SPI4_SCK
PE5    ------> SPI4_MISO
PE6    ------> 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)
{
/* Peripheral clock enable /
__SPI5_CLK_ENABLE();
/
*SPI5 GPIO Configuration
PF7 ------> SPI5_SCK
PF8 ------> SPI5_MISO
PF9 ------> SPI5_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI5;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

}

}

main()
{
MX_SPI5_Init();
__HAL_SPI_ENABLE_IT(&hspi5, SPI_IT_RXNE);
while (1)
{
SPI5_Master_Rx(); //读取从机发过来的数据。
}
}

typedef uint8_t u8 ;
typedef uint16_t u16 ;
typedef uint32_t u32 ;
u8 hmosi[50]={0};
u8 mosi1[50]={0};
u8 phmosi[50]={0};
u32 imosi=0;
u32 spi5_rx_len;
u32 ic=0;
#define comsize 8

extern u16 tSession;
u32 udata_len_spi;
extern u16 ports[comsize+1];
extern u32 uTimeLst;

extern SPI_HandleTypeDef hspi5;
void SPI5_IRQHandler(void)
{
if(__HAL_SPI_GET_FLAG(&hspi5, SPI_FLAG_RXNE) == SET)
{
hmosi[imosi++]=(uint8_t)(hspi5.Instance->DR);

}             

}

void SPI5_Master_Rx(void)
{
//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];

phmosi[6]=spi5_rx_len-7;
memcpy(phmosi+7,hmosi+ic+7,spi5_rx_len-7);
memcpy(mosi1,hmosi+ic,50-ic);
memcpy(hmosi,mosi1,50-ic);
imosi=imosi-ic;
ic=0;
//**************************
tSession++;
phmosi[0]=0x2e;
phmosi[1]=0x17;
phmosi[2]=0x00;

phmosi[3]=tSession;
phmosi[4]=(tSession>>8);

//memcpy(udata+7,tx1_buf,rx1cnt);
phmosi[udata_len_spi-1] = crc(phmosi,udata_len_spi-1,1);
com2net(ports[0],udata_len_spi,phmosi);
uTimeLst=HAL_GetTick();
}
}
}

  • 写回答

2条回答

  • 开足马力 2018-04-10 02:38
    关注

    注意需要一个作为HOST一个作为SLAVE

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!