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

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

[复制链接]
dh2964169 提问时间:2018-3-15 14:41 /
任务需求:在一个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);   
  }

波形图:



1个CS产生的16个周期的SCLK

1个CS产生的16个周期的SCLK
收藏 评论18 发布时间:2018-3-15 14:41

举报

18个回答
七哥 回答时间:2018-3-15 15:35:45
CS用软件模拟方式是必须的。
具体要产生32个连续时钟,就是连续发4个字节。用软件查询,或用DMA方式。软件查询要查的状态多一点,DMA需要查询BSY就可以。

傲游截图20180315153036.png

傲游截图20180315153204.png

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

dh2964169 回答时间:2018-3-15 15:28:59
MrJiu 发表于 2018-3-15 15:11
首先CS就改才软件控制,查询模式。。。4个byte不就是32个时钟啦,回归到正常状态,这种私人定制协议 ...

确实啊,根据自己的要求来使能时钟,很麻烦。请问下,
1. 您说的查询模式是什么啊?
2. 如何实现4个byte或者2个16bit的32时钟呢?
3. 我尝试过在一个CS周期内,两次使能和关闭SPI,实现32个周期(虽然能达到32个周期,但是SPI不能提高SPI的分频系数,故不能使用,代码如下:)        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_Cmd(AD_SPI, DISABLE);                        //SPI失能


                SPI_Cmd(AD_SPI, ENABLE);                              //SPI使能
                             data=SPIx_ReadWriteByte();                          //写入数据
                SPI_Cmd(AD_SPI, DISABLE);                        //SPI失能
                     
                    Delay(120);                                                     //增加延时
                GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN);      //CS=1
                    Delay(5);   
其中有个函数SPIx_ReadWriteByte():
u16 SPIx_ReadWriteByte(void)
{  
        u8 retry=0;                        
                while (SPI_I2S_GetFlagStatus(AD_SPI, SPI_I2S_FLAG_RXNE) == RESET)      //长时间等待,影响了数据传输;若不加这一句则不能实现
        {                                                                                                                     //32个周期的sclk
                retry++;
                if(retry>200)
                return 0;
        }                
                        return SPI_I2S_ReceiveData(AD_SPI);        
}
     请指教下不足或者其他的思路,谢谢你
dh2964169 回答时间:2018-3-18 10:38:56
Inc_brza 发表于 2018-3-16 18:28
需要开启DMA连续发送,CLK才能连续,如果等发等发,绝逼会有间隔得

      您说的很对。在我对采样速度有要求的时候,用到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);                       //返回数据
}

dh2964169 回答时间:2018-3-15 15:08:49
不采用用模拟SPI方式,还有什么方式吗,请指教啦,谢谢
MrJiu 回答时间:2018-3-15 15:11:54
首先CS就改才软件控制,查询模式。。。4个byte不就是32个时钟啦,回归到正常状态,这种私人定制协议,怎么搞都不好使,除非自己设计的硬件,或则模拟。。。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

废鱼 回答时间:2018-3-15 15:24:47
支持楼上,需要发送一些空数据来满足32个波形。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

dh2964169 回答时间:2018-3-15 15:31:22
安 发表于 2018-3-15 15:24
支持楼上,需要发送一些空数据来满足32个波形。

但是,我配置的是双线只接收模式,那也可以使用发送空数据来满足吗?或者说满足成倍的时钟周期,则都是通过发送空数据来完成的吗,谢谢指教??
废鱼 回答时间:2018-3-15 15:51:26
只是这么说,还是要看对方的协议。SCLK和DATA之间的关系,楼主应该要明白。
MrJiu 回答时间:2018-3-15 15:58:30
dh2964169 发表于 2018-3-15 15:28
确实啊,根据自己的要求来使能时钟,很麻烦。请问下,
1. 您说的查询模式是什么啊?
2. 如何实现4个byte ...

查询模式,就是手动查询状态标志物。。。然后连续发送4个byte数据。。。。
dh2964169 回答时间:2018-3-15 15:59:14
toofree 发表于 2018-3-15 15:35
CS用软件模拟方式是必须的。
具体要产生32个连续时钟,就是连续发4个字节。用软件查询,或用DMA方式。软件 ...

  谢谢您的指点。意思就是:主要的思想就是需要发送4个字节的数据。
         在我的硬件设计中,是主控通过SPI的方式只接收AD芯片的采样数据;故程序中配置SPI时,是配置为双线只接受模式(AD芯片只有三个接口:cs,sclk,DATA输出)。       故疑问是否在这种条件下能否实现向AD发送数据,然后产生32个周期呢?(我先尝试下其他的模式下,试试看否能行),谢谢啦
dh2964169 回答时间:2018-3-15 16:00:29
MrJiu 发表于 2018-3-15 15:58
查询模式,就是手动查询状态标志物。。。然后连续发送4个byte数据。。。。 ...

哦哦,懂了,懂您的意思了。谢谢啊。我先尝试下
dh2964169 回答时间:2018-3-15 16:01:57
安 发表于 2018-3-15 15:51
只是这么说,还是要看对方的协议。SCLK和DATA之间的关系,楼主应该要明白。 ...

对的对的,要遵循协议才行。谢谢提醒,
七哥 回答时间:2018-3-15 16:20:32
dh2964169 发表于 2018-3-15 15:59
谢谢您的指点。意思就是:主要的思想就是需要发送4个字节的数据。
         在我的硬件设计中,是主控 ...

SPI的收发是同时的,发送的同时也在接收。
只是配置成只发送的话,接收数据线上的数据被忽略;要接收的话,也得发送个数,只是这个数并不关心罢了。
Inc_brza 回答时间:2018-3-16 18:28:30
需要开启DMA连续发送,CLK才能连续,如果等发等发,绝逼会有间隔得

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版