OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3194|回复: 1

关于H750VB和F7F7的主从SPI通信的问题,求解答

[复制链接]

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2019-5-21
在线时间
47 小时
发表于 2020-8-20 14:41:37 | 显示全部楼层 |阅读模式
2金钱
平台:STM32H750VB ------SPI从机       STM32F767ZG -------SPI主机目的:实现SPI主机的通信
做法:SPI主机不开中断,SPI主机使用中断接收
有出现两个问题不太明白,求大侠分享经验,谢谢各位
出现问题1:
当使用以下配置时,从机使用HAL_SPI_Receive_IT接收,无论参数接收个数是1或者1024等等,比如设置为接收个数为500,那么接收完500后就不再接收了,也不进中断了。
而打破这一局面再次接收的情况是,需要主机进行 CS拉高再拉低产生下降沿
如下:SPI_ReadWriteByte(0X63);从机只能接收到0X63,其他不接收,如果把CS拉高再拉低再发送,从机就能接收到


出现问题2:
该项配置,必须从机SPI先初始化化完,主机再初始化,也就具备了CS拉高再拉低,从机是能接收一个数据的,也就是问题1的情况
如果打断点让主机SPI先初始化,从机再初始化,从机没有接收到CS拉高再拉低,然后就不进入中断,除非收到CS的下降边沿。


从机代码

  1. u8 spi4_data;
  2. SPI_HandleTypeDef SPI4_Handler;  //SPI2句柄
  3. void SPI4_Init(void)
  4. {
  5.     SPI4_Handler.Instance=SPI4;                      //SP2
  6.     SPI4_Handler.Init.Mode=SPI_MODE_SLAVE;          //设置SPI工作模式,设置为主模式
  7.     SPI4_Handler.Init.Direction=SPI_DIRECTION_2LINES;//设置SPI单向或者双向的数据模式:SPI设置为双线模式
  8.     SPI4_Handler.Init.DataSize=SPI_DATASIZE_8BIT;    //设置SPI的数据大小:SPI发送接收8位帧结构
  9.     SPI4_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH; //串行同步时钟的空闲状态为高电平
  10.     SPI4_Handler.Init.CLKPhase=SPI_PHASE_1EDGE;      //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
  11.     SPI4_Handler.Init.NSS=SPI_NSS_HARD_INPUT;              //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
  12.     SPI4_Handler.Init.NSSPMode=SPI_NSS_PULSE_DISABLE;//NSS信号脉冲失能
  13.     SPI4_Handler.Init.MasterKeepIOState=SPI_MASTER_KEEP_IO_STATE_ENABLE;  //SPI主模式IO状态保持使能
  14.     SPI4_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2;//SPI_BAUDRATEPRESCALER_256;//定义波特率预分频的值:波特率预分频值为256
  15.     SPI4_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;     //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
  16.     SPI4_Handler.Init.TIMode=SPI_TIMODE_DISABLE;     //关闭TI模式
  17.     SPI4_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
  18.     SPI4_Handler.Init.CRCPolynomial=7;               //CRC值计算的多项式
  19.     HAL_SPI_Init(&SPI4_Handler);
  20.                 HAL_NVIC_SetPriority(SPI4_IRQn, 2, 0);
  21.                         HAL_NVIC_EnableIRQ(SPI4_IRQn);
  22.         HAL_SPI_Receive_IT(&SPI4_Handler, &spi4_data, 1);
  23.     __HAL_SPI_ENABLE(&SPI4_Handler);                 //使能SPI2
  24.                
  25. }


  26. void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
  27. {
  28.        
  29.                  if (hspi->Instance == SPI4)
  30.                 {
  31.                                
  32.                                 GPIO_InitTypeDef GPIO_Initure;
  33.                                 RCC_PeriphCLKInitTypeDef SPI4ClkInit;
  34.                        
  35.                                 __HAL_RCC_GPIOE_CLK_ENABLE();                   //使能GPIOB时钟
  36.                                 __HAL_RCC_SPI4_CLK_ENABLE();                    //使能SPI2时钟
  37.                        
  38.                                 SPI4ClkInit.PeriphClockSelection=RCC_PERIPHCLK_SPI4;            //设置SPI2时钟源
  39.                                 SPI4ClkInit.Spi45ClockSelection=RCC_SPI4CLKSOURCE_HSE;        //SPI4时钟源使用HSE 25MHZ
  40.                                 HAL_RCCEx_PeriphCLKConfig(&SPI4ClkInit);
  41.                                
  42.                                 GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
  43.                                 GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //复用推挽输出
  44.                                 GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉
  45.                                 GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;   //快速   
  46.                                 GPIO_Initure.Alternate=GPIO_AF5_SPI4;           //复用为SPI2
  47.                                 HAL_GPIO_Init(GPIOE,&GPIO_Initure);             //初始化
  48.                
  49.                 }       
  50. }



  51. void SPI4_IRQHandler(void)
  52. {       
  53.         HAL_SPI_IRQHandler(&SPI4_Handler);
  54.         HAL_SPI_Receive_IT(&SPI4_Handler, &spi4_data, 1);
  55. }
复制代码
主机代码

  1. void SPI_INIT(void)
  2. {
  3.        
  4.        
  5.                 GPIO_InitTypeDef GPIO_Init;
  6.                        
  7.                                 __HAL_RCC_GPIOA_CLK_ENABLE();
  8.                                 __HAL_RCC_GPIOB_CLK_ENABLE();
  9.        
  10.                  __HAL_RCC_SPI1_CLK_ENABLE();
  11.        
  12.                         myhspi.Instance = SPI1;
  13.                         myhspi.Init.Mode = SPI_MODE_MASTER;                                                        //主模式
  14.                         myhspi.Init.Direction = SPI_DIRECTION_2LINES;                // 双线
  15.                         myhspi.Init.DataSize  = SPI_DATASIZE_8BIT;                        // 8位数据
  16.                         myhspi.Init.CLKPolarity = SPI_POLARITY_HIGH;                        // 空闲是高
  17.                         myhspi.Init.CLKPhase  = SPI_PHASE_1EDGE;                                // 第一个边沿采集数据
  18.                         myhspi.Init.NSS = SPI_NSS_SOFT;                                                                        // NSS软管理
  19.                         myhspi.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  20.                         myhspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;//SPI_BAUDRATEPRESCALER_16;// 2分频,54Mbit
  21.                         myhspi.Init.FirstBit =        SPI_FIRSTBIT_MSB;// 高位先发
  22.                         myhspi.Init.TIMode = SPI_TIMODE_DISABLE;// 摩托罗拉格式
  23.                        
  24.                         myhspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;// 不进行CRC校验
  25.                
  26.                   HAL_SPI_Init(&myhspi);
  27.        
  28.                 __HAL_SPI_ENABLE(&myhspi);  
  29.                
  30.                 SPI_ReadWriteByte(0X63);
  31.                 delay_ms(500);
  32.                 SPI_ReadWriteByte(0XA7);
  33.                  delay_ms(500);
  34.                 SPI_ReadWriteByte(0XB8);
  35. }




  36. void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
  37. {
  38.        
  39.                 if (hspi->Instance == SPI1)
  40.                 {       
  41.                                 GPIO_InitTypeDef GPIO_Init;
  42.                        
  43.                                 __HAL_RCC_GPIOA_CLK_ENABLE();
  44.                                 __HAL_RCC_GPIOB_CLK_ENABLE();
  45.                        
  46.                                
  47.                                
  48.                                 GPIO_Init.Pin = GPIO_PIN_5|GPIO_PIN_6;   //SCK MISO     
  49.                                 GPIO_Init.Mode = GPIO_MODE_AF_PP;      
  50.                                 GPIO_Init.Pull = GPIO_PULLUP;      
  51.                                 GPIO_Init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;     
  52.                                 GPIO_Init.Alternate = GPIO_AF5_SPI1;  
  53.                                 HAL_GPIO_Init(GPIOA, &GPIO_Init);
  54.                        
  55.                                 GPIO_Init.Pin = GPIO_PIN_5;              //M OSI
  56.                                 GPIO_Init.Mode = GPIO_MODE_AF_PP;      
  57.                                 GPIO_Init.Pull = GPIO_PULLUP;      
  58.                                 GPIO_Init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;     
  59.                                 GPIO_Init.Alternate = GPIO_AF5_SPI1;  
  60.                                 HAL_GPIO_Init(GPIOB, &GPIO_Init);
  61.                        
  62.                                 GPIO_Init.Pin = GPIO_PIN_4;              //片选 CS
  63.                                 GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;      
  64.                                 GPIO_Init.Pull = GPIO_PULLUP;      
  65.                                 GPIO_Init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;     
  66.                                 HAL_GPIO_Init(GPIOA, &GPIO_Init);
  67.                                 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
  68.                                 delay_ms(500);
  69.                                 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
  70.                                
  71.                                
  72.                 }

  73. }
复制代码



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2019-5-21
在线时间
47 小时
 楼主| 发表于 2020-8-20 22:27:59 | 显示全部楼层
自顶自顶自顶自顶自顶自顶自顶自顶自顶自顶自顶自顶自顶自顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-30 15:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表