请问429的spi如何产生32个连续的SCLK?

2019-07-14 14:42发布

任务需求:在一个CS周期内需要32个SPI 的sclk,但是根据spi的配置程序,最多实现16个SCLK。  请问如何实现在一个CS周期内产生32个sclk???

程序代码:
    //SPI初始化
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly;  //双线只接受
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                        //主模式
    SPI3->CR1|=1<<10;                                                                //只接受
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;                  //设置SPI的数据大小
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                     
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;            
    SPI_InitStructure.SPI_NSS  = SPI_NSS_Soft;                  
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;         
    SPI_InitStructure.SPI_CRCPolynomial = 7;                     
    SPI_Init(AD_SPI, &SPI_InitStructure);               

主程序:

                while (1)
        {           
              GPIO_ResetBits(AD_CS_GPIO_PORT,AD_CS_PIN);          //CS=0
                    Delay(5);   
                        SPI_Cmd(AD_SPI, ENABLE);             //SPI使能           
                            data= SPIx_ReadWriteByte();             //        返回SPI_DR数据
                        SPI_Cmd(AD_SPI, DISABLE);            //SPI失能
                   Delay(120);                                          //增加延时

               GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN);            //CS=1
    Delay(5);   
  }

波形图:




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
htxk
2019-07-14 22:47
      您说的很对。在我对采样速度有要求的时候,用到SPIx_ReadWriteByte2 ();里面总有查询等待的过程。去掉等待速度能提高,但是又不能产生指定的波形(很矛盾)。
      所以再尝试下,DMA 发送数据的方式,可以避免状态位的查询,同时用另一个DMA接收,希望能成功。谢谢您!!!

(这就是那个写和收的SPI数据传输的函数)
u16 SPIx_ReadWriteByte2 (u16 byte)  //SPI双工,收发数据
{  

                SPITimeout = SPIT_FLAG_TIMEOUT;

                /* 等待发送缓冲区为空,TXE事件 */
                while (SPI_I2S_GetFlagStatus(AD_SPI, SPI_I2S_FLAG_TXE) == RESET)
                 {
                        if((SPITimeout--) == 0) return 0;               
                 }
                /*写入数据寄存器,把要写的数据写入发送缓冲区 */
                SPI_I2S_SendData(AD_SPI, byte);
                /* 等待接收缓冲区非空,RXNE事件*/
                  SPITimeout = SPIT_FLAG_TIMEOUT;
                        while (SPI_I2S_GetFlagStatus(AD_SPI, SPI_I2S_FLAG_RXNE) == RESET)
                 {
                          if((SPITimeout--) == 0)         return 0;                 //等待超时
                 }

                return SPI_I2S_ReceiveData(AD_SPI);                       //返回数据
}

一周热门 更多>