打印

spi通信问题

[复制链接]
2096|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hsbjb|  楼主 | 2011-11-26 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
两个stm32处理器的spi进行通信
SPI_Writebyte(u8 data)

   {

          while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
          SPI_I2S_SendData(SPI1, data);      
          SPI_I2S_ReceiveData(SPI1);
  

  }
u8   SPI_Readbyte(u8 data)

   {     


          while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
          SPI_I2S_SendData(SPI1, data);      

          while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);  

  
          return SPI1_Buffer_Rx[RxIdx++]=SPI_I2S_ReceiveData(SPI1);  

  }
/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
#ifdef DEBUG
  debug();
#endif
  /* System clocks configuration ---------------------------------------------*/
  RCC_Configuration();
  /* NVIC configuration ------------------------------------------------------*/
  NVIC_Configuration();
  /* GPIO configuration ------------------------------------------------------*/
  GPIO_Configuration();
  /* 1st phase: SPI1 Master and SPI2 Slave */
  /* SPI1 Config -------------------------------------------------------------*/
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  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_LSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);

  /* Enable SPI1 */
  SPI_Cmd(SPI1, ENABLE);

  /* Transfer procedure */
  while (TxIdx < BufferSize)
  {
        SPI_Writebyte(0x55);
         SPI_Readbyte(0xff);
        if(TxIdx == BufferSize)
        TxIdx=0;
  }
  
}
从机程序
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  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_LSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);

  /* Enable SPI1 */
  SPI_Cmd(SPI1, ENABLE);

  /* Transfer procedure */
  while (TxIdx < BufferSize)
  {
    /* Wait for SPI1 Tx buffer empty */
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == 1)
    /* Send SPI1 data */ {SPI_I2S_SendData(SPI1, SPI1_Buffer_Tx[TxIdx++]);
  }
    /* Wait for SPI1 data reception */
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
    /* Read SPI1 received data */
    {SPI1_Buffer_Rx[RxIdx++] = SPI_I2S_ReceiveData(SPI1);
     }
      
   
    if(TxIdx == BufferSize)
        TxIdx=0;
  }
  
}
版主帮帮忙吧,你说的资料我看了,方法也用了怎么还是不好用,你看我的程序差在哪里,谢谢了,详细的给我指导一下吧,我的是两个stm32通信的问题,采用全双工通信,可是我就是找不到问题出在哪里了
沙发
秋天落叶| | 2011-11-26 09:43 | 只看该作者
从机是不能提供时钟的,你必须通过发送一个dummy字节来产生接收时钟

使用特权

评论回复
板凳
xxx378087736| | 2011-12-1 13:19 | 只看该作者
仔细研究一下SPI

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

193

主题

2354

帖子

0

粉丝