打印

stm32 SPI读问题请教版主

[复制链接]
3535|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
explor|  楼主 | 2008-7-25 09:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用SPI2和从设备模拟的SPI 调试,单独收 、发正常,

但我发现在发一串数据给对方后,再开始收第一个字节数据是正确,但从第二个数据开始就移位,第二次收的是第一次的,第三次收的是第二次的数据 ,实际示波器看到的数据是正确的,感觉是在SPI的接收Buffer会有问题,请教版主为什么 ?

设置如下,应该是全双工的。

 /* SPI2 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_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//70Kbit/s
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI2, &SPI_InitStructure);
    /* Enable SPI2 */
    SPI_Cmd(SPI2, ENABLE);

 发数据:

void MasterMcu_SendChar(u8 sbyte)
{
    vu16 count = 0x8FF;
    /* Wait for SPI2 Tx buffer empty */
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
    /* Send SPI2 data */
    SPI_I2S_SendData(SPI2, sbyte);
    /* Delay 100us */
    while(count--) ;
}

读数据:

ErrorFlag MasterMcu_RecChar( u8 *rbyte )
{
    u32 timecount = TimeOutValue;

    /* Slaver MCU is soft SPI interface */
    SPI_I2S_SendData(SPI2,0X00);   //产生读时的CLK
    /* Wait for SPI2 data reception */
    while ( (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET ) )      

   /*   Read SPI2 received data */
        *rbyte = SPI_I2S_ReceiveData(SPI2);
        Delay_us(60);
        return OK;
    }
}

main里的调试程序:

复位开始:

      for(i = 0; i<5; i++)
      {
          MasterMcu_RecChar(len_buf+i);
       }  //这样正常


      for(i = 0; i<5; i++)
      {
          MasterMcu_SendChar(i);
      }
      for(i = 0; i<5; i++)
      {
          MasterMcu_RecChar(len_buf+i);
      } //这样出错  ??

沙发
香水城| | 2008-7-25 17:06 | 只看该作者

这个问题好像与EDN上的一个问题一样

作为SPI的主机,不管发送和接收,都会送出时钟信号;作为SPI从机,不管发送和接收,都需要主机发来的时钟信号进行数据传输。

如果你单独调用5次MasterMcu_RecChar(len_buf+i),则从机会收到5x8个时钟脉冲,如果从机的发送在主机调用MasterMcu_RecChar前已经就绪,它就会在收到时钟脉冲时送出要传送的数据位。

如果你先调用5次MasterMcu_SendChar(),再调用5次MasterMcu_RecChar(),则从机会收到(5+5)x8个时钟脉冲,如果从机在主机执行完5次MasterMcu_SendChar函数之前就允许发送,则从机就会利用主机发送所使用的时钟传送数据位。估计你的错误很可能是主从方配合的问题。

请记住:SPI是全双工传输协议。

使用特权

评论回复
板凳
z_no1| | 2008-7-25 22:17 | 只看该作者

问一下spi有多快?看手册好象不只18M啊?

频率最高是Fpclk的一半,可AHB1的速度有72M,那是不是可以到36M呢?虽然只有一个SPI能到这个速度,那也很好了。

使用特权

评论回复
地板
香水城| | 2008-7-25 23:46 | 只看该作者

STM32的SPI最快只能到18Mbps

SPI的预分频器可以设置为fPCLK/2,但如果AHB1达到72MHz,因为有18MHz的限制,所以不能使用这个选项。

使用特权

评论回复
5
z_no1| | 2008-7-26 10:34 | 只看该作者

谢谢板主。

这么晚还在。

使用特权

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

本版积分规则

51

主题

107

帖子

0

粉丝