野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12261|回复: 3

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

[复制链接]
发表于 2018-3-15 14:40:09 | 显示全部楼层 |阅读模式
任务需求:在一个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
回复

使用道具 举报

发表于 2018-3-15 14:45:48 | 显示全部楼层
硬件spi最多支持16位,你这需求要用软件spi
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-15 14:59:08 | 显示全部楼层
随风 发表于 2018-3-15 14:45
硬件spi最多支持16位,你这需求要用软件spi

意思就是只能使用,软件模拟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)
        {
                retry++;
                if(retry>28)
                return 0;
        }                
                        return SPI_I2S_ReceiveData(AD_SPI);       
}


产生如下波形:








32分频CS-SCLK.jpg
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-15 15:06:57 | 显示全部楼层
但是这样两次使能和关闭SPI的方式,能产生32个周期SCLK,主要是因为有红色部分:u16 SPIx_ReadWriteByte(void)
{  
        u8 retry=0;                        
                while (SPI_I2S_GetFlagStatus(AD_SPI, SPI_I2S_FLAG_RXNE) == RESET)
        {
                retry++;
                if(retry>200)
                return 0;
        }     
            
                        return SPI_I2S_ReceiveData(AD_SPI);        
}
如果我去掉这个红色的等到数据到来的语句后,有以下情况:
1. 不能实现32个周期的sclk
2. 因为减少等待的时间,所以能够设置更高的SPI分频系数(需求高的sclk)


故请问下,若删除上面红色部分的等待过程程序,和除了模拟SPI过程,还有其他的方式吗??谢谢各位

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-18 03:50 , Processed in 0.061926 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表