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

STM32做双机SPI通信,主机接收数据异常

[复制链接]
一夜长安花 提问时间:2017-9-27 16:09 /
实验平台:两片STM32F103ZET6
实验目的:两片STM32 通过SPI通信的方式,进行发送与接受数据
实验流程:A单片机作为主机,主机设定为按下按键,向从机发送0xAC,并接收从机发来的数据,将其打印在串口屏上;B单片机为从单片机,主机进行发送数据时,从机也同时向主机发送0x69,并接受主机发来的数据,打印在串口屏上。
目前实验现象:从机能够接收到主机发来的数据,能在串口屏上打印0xAC,但主机接收的数据有问题,主机在串口屏上打印的数据时0xAC(应该是0x69)
收藏 1 评论11 发布时间:2017-9-27 16:09

举报

11个回答
斜阳 回答时间:2017-9-28 14:28:20
好复杂,帮顶
一夜长安花 回答时间:2017-9-27 16:13:12
主机代码:
//GPIO配置:
void SPI_Master_Init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
       
       
SPI_APBxClock_FUN ( SPI_CLK, ENABLE );
       
SPI_CS_APBxClock_FUN ( SPI_CS_CLK|SPI_SCK_CLK|
                                                                                                                                        SPI_MISO_PIN|SPI_MOSI_PIN, ENABLE );
       

  GPIO_InitStructure.GPIO_Pin = SPI_CS_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
  GPIO_Init(SPI_CS_PORT, &GPIO_InitStructure);
       

  GPIO_InitStructure.GPIO_Pin = SPI_SCK_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(SPI_SCK_PORT, &GPIO_InitStructure);


  GPIO_InitStructure.GPIO_Pin = SPI_MISO_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(SPI_MISO_PORT, &GPIO_InitStructure);

  
  GPIO_InitStructure.GPIO_Pin = SPI_MOSI_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(SPI_MOSI_PORT, &GPIO_InitStructure);

  
   SPI_CS_HIGH();
  

  
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b ;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPIx , &SPI_InitStructure);


  SPI_Cmd(SPIx , ENABLE);
       
}   //   其中 CS PA4、 SCK PA5、MISO PA6、MOSI PA7
一夜长安花 回答时间:2017-9-27 16:14:49
主机发送数据函数:
u8 SPI_SendByte(u8 byte)
{
         
         SPITimeout = SPIT_FLAG_TIMEOUT;

  while (SPI_I2S_GetFlagStatus(SPIx , SPI_I2S_FLAG_TXE) == RESET)
        {
    if((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(0);
   }


  SPI_I2S_SendData(SPIx , byte);

        SPITimeout = SPIT_FLAG_TIMEOUT;

  while (SPI_I2S_GetFlagStatus(SPIx , SPI_I2S_FLAG_RXNE) == RESET)
  {
    if((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(1);
   }


  return SPI_I2S_ReceiveData(SPIx );   
         
}   同时,该函数也是从机的发送接收数据函数
一夜长安花 回答时间:2017-9-27 16:17:33
从机配置:
void SPI_Slave_Init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
       

SPI_APBxClock_FUN ( SPI_CLK, ENABLE );

SPI_CS_APBxClock_FUN ( SPI_CS_CLK|SPI_SCK_CLK|
                                                                                SPI_MISO_PIN|SPI_MOSI_PIN, ENABLE );
       

       

  GPIO_InitStructure.GPIO_Pin = SPI_SCK_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(SPI_SCK_PORT, &GPIO_InitStructure);


  GPIO_InitStructure.GPIO_Pin = SPI_MISO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(SPI_MISO_PORT, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = SPI_MOSI_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;
  GPIO_Init(SPI_MOSI_PORT, &GPIO_InitStructure);

  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b ;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPIx , &SPI_InitStructure);


  SPI_Cmd(SPIx , ENABLE);
       
}

一夜长安花 回答时间:2017-9-27 16:22:05
SPI主从的IO口按照STM32中文手册上进行配置的:
QQ图片20170927162140.png
一夜长安花 回答时间:2017-9-27 16:25:05
从机采用外部中断接受数据的方式,即主机片选端产生低电平后,从机进入中断,从机的中断配置如下:static void SPI_NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       
       NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}


void SPI_EXTI_Config(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;       
                 
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE );          

        GPIO_InitStructure.GPIO_Pin = SPI_CS_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
       GPIO_Init(SPI_CS_PORT, &GPIO_InitStructure);
        //SPI_CS_HIGH();
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);         

        EXTI_InitStructure.EXTI_Line = EXTI_Line4 ;                
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                       
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;               
        EXTI_Init(&EXTI_InitStructure);                /
       SPI_NVIC_Configuration();
}

一夜长安花 回答时间:2017-9-27 16:26:07
从机的中断函数:
void EXTI4_IRQHandler(void)
{
       
          if(EXTI_GetITStatus(EXTI_Line4) != RESET)
                {
                        Rec_data=SPI_SendByte(Send_data);
                        printf("Slave_data=%x Send_data=%x\r\n",Rec_data,Send_data);       
                }                       
               
        EXTI_ClearITPendingBit(EXTI_Line4);
}

一夜长安花 回答时间:2017-9-27 16:28:36
主机在主程序中的发送函数:int main()
{
        unsigned char value=0;
        u8 rec=0;
        LED_GPIO_Config();
        USART1_Config();
        Key_GPIO_Config();
        SPI_Master_Init();
         while(1)
         {       
                 value=KEY_Scan();
                 if(value==2)
                 {
             rec= SPI_send_data(0xAC);
             printf("Rec_data=%x\r\n",rec);       
                 }
                  if(value==3)
                 {
                   rec= SPI_send_data(0xBD);
                   printf("Rec_data=%x\r\n",rec);       
                 }
                 
         }
}  //其中SPI_send_data函数包括了cs线先拉低,然后发送并接受一个字节,然后CS线拉低


一夜长安花 回答时间:2017-9-27 16:33:35
串口屏数据接收情况:主机接受情况

QQ图片20170927163139.png
一夜长安花 回答时间:2017-9-27 16:35:08
从机接收情况:

QQ图片20170927163232.png
一夜长安花 回答时间:2017-9-27 16:36:23
反正就是从机接收数据完全OK,主机接受的数据都却不对,是自己发出去的数据。求大神解答啊!
april1818 回答时间:2017-11-15 00:08:25
一夜长安花 发表于 2017-9-27 16:36
反正就是从机接收数据完全OK,主机接受的数据都却不对,是自己发出去的数据。求大神解答啊! ...

你好 看到你关于SPI双机通信的问题 请问你解决了么。。我现在也在做双机通讯 有一些问题 方便交流一下么 谢谢

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版