打印
[技术问答]

HC32L176 SPI 速度只能达到2M CLK间隔也不一致

[复制链接]
1617|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
迷惘186|  楼主 | 2020-12-25 11:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
HC, spi, gp, IO, GPIO
本帖最后由 迷惘186 于 2020-12-25 13:49 编辑

SPI 初始化代码
 stc_gpio_cfg_t GpioInitStruct;
   
    DDL_ZERO_STRUCT(GpioInitStruct);
   
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
   
    ///< SPI0引脚配置:主机
    GpioInitStruct.enDrv = GpioDrvH;
    GpioInitStruct.enDir = GpioDirOut;   
    GpioInitStruct.bOutputVal = TRUE;

    Gpio_Init(CV520_CS_PORT, CV520_CS_PIN, &GpioInitStruct);   
    Gpio_Init(CV520_RST_PORT, CV520_RST_PIN, &GpioInitStruct);     
    Gpio_Init(W25_CS_PORT, W25_CS_PIN, &GpioInitStruct);
                                                               
    Gpio_Init(SPI0_PORT, SPI0_CLK_PIN, &GpioInitStruct);            
    Gpio_SetAfMode(SPI0_PORT, SPI0_CLK_PIN, GpioAf1);           ///<配置SPI0_SCK
                                                               
    Gpio_Init(SPI0_PORT, SPI0_MOSI_PIN, &GpioInitStruct);           
    Gpio_SetAfMode(SPI0_PORT, SPI0_MOSI_PIN, GpioAf1);         ///<配置SPI0_MOSI
                                                               
    GpioInitStruct.enDir = GpioDirIn;   
    GpioInitStruct.enPu = GpioPuEnable;
    Gpio_Init(SPI0_PORT, SPI0_MISO_PIN, &GpioInitStruct);            
    Gpio_SetAfMode(SPI0_PORT, SPI0_MISO_PIN, GpioAf1);         ///<配置SPI0_MISO
   
   
    stc_spi_cfg_t  SpiInitStruct;
   
    ///< 打开外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi0,TRUE);
   
    ///<复位模块
    Reset_RstPeripheral0(ResetMskSpi0);
   
    //SPI0模块配置:主机
    SpiInitStruct.enSpiMode = SpiMskMaster;     //配置位主机模式
    SpiInitStruct.enPclkDiv = SpiClkMskDiv8;    //波特率:PCLK/2
    SpiInitStruct.enCPHA    = SpiMskCphafirst;  //第一边沿采样
    SpiInitStruct.enCPOL    = SpiMskcpollow;    //极性为低
    Spi_Init(SPI_SPI0, &SpiInitStruct);
系统时钟初始化 HCLK48 PCLK 48
///<请注意根据外部晶振配置宏——[SYSTEM_XTH],如果使用PLL,XTH必须小于24MHz
static void SystemClkInit_PLL48M_byXTH(void)
{
    stc_sysctrl_pll_cfg_t stcPLLCfg;   
   
    ///< 切换时钟前(根据外部高速晶振)设置XTH频率范围,配置晶振参数,使能目标时钟,此处为SYSTEM_XTH = 8MHz
    Sysctrl_SetXTHFreq(SysctrlXthFreq4_8MHz);
    Sysctrl_XTHDriverCfg(SysctrlXtalDriver3);
    Sysctrl_SetXTHStableTime(SysctrlXthStableCycle16384);
    Sysctrl_ClkSourceEnable(SysctrlClkXTH, TRUE);
    delay1ms(10);
   
    stcPLLCfg.enInFreq    = SysctrlPllInFreq6_12MHz;    //XTH 8MHz
    stcPLLCfg.enOutFreq   = SysctrlPllOutFreq36_48MHz;  //PLL 输出
    stcPLLCfg.enPllClkSrc = SysctrlPllXthXtal;          //输入时钟源选择XTH
    stcPLLCfg.enPllMul    = SysctrlPllMul6;             //8MHz x 6 = 48MHz
    Sysctrl_SetPLLFreq(&stcPLLCfg);
   
    ///< 当使用的时钟源HCLK大于24M:设置FLASH 读等待周期为1 cycle(默认值也为1 cycle)
    Flash_WaitCycle(FlashWaitCycle1);   

    ///< 使能PLL
    Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE);   
    ///< 时钟切换到PLL
    Sysctrl_SysClkSwitch(SysctrlClkPLL);
//    ///PCLK时钟分频4分频 12M
//    Sysctrl_SetPCLKDiv(SysctrlPclkDiv4);
}




已解决
逻辑分析仪采样设置的有问题
速度可以达到6M

使用特权

评论回复
沙发
martinhu| | 2020-12-25 11:25 | 只看该作者
SpiInitStruct.enPclkDiv = SpiClkMskDiv8;    //波特率:PCLK/2
你这个不是PCLK/2的分频吧???

使用特权

评论回复
板凳
迷惘186|  楼主 | 2020-12-25 11:50 | 只看该作者
本帖最后由 迷惘186 于 2020-12-25 11:53 编辑
martinhu 发表于 2020-12-25 11:25
SpiInitStruct.enPclkDiv = SpiClkMskDiv8;    //波特率:PCLK/2
你这个不是PCLK/2的分频吧??? ...

8分频
48/8 也有6M
这个也没6M
之前是用的 PCLK 12M
分频是2 SPI理论速度应该是6M  
逻辑分析仪采集到的数据也是这样 只有2M 且间隙不一致

使用特权

评论回复
地板
martinhu| | 2020-12-25 13:00 | 只看该作者
迷惘186 发表于 2020-12-25 11:50
8分频
48/8 也有6M
这个也没6M

你这个逻分采集对么?SPI都是1一个字节1个字节发的数据,怎么会有3个CLK一组的……

使用特权

评论回复
5
迷惘186|  楼主 | 2020-12-25 13:36 | 只看该作者
本帖最后由 迷惘186 于 2020-12-25 13:50 编辑
martinhu 发表于 2020-12-25 13:00
你这个逻分采集对么?SPI都是1一个字节1个字节发的数据,怎么会有3个CLK一组的…… ...

是一个字节一个字节发的   频率在降低到2M以下时 clk就正常了

是我的逻辑分析仪设置的有问题的 采样率不够

使用特权

评论回复
6
martinhu| | 2020-12-25 13:55 | 只看该作者
迷惘186 发表于 2020-12-25 13:36
是一个字节一个字节发的   频率在降低到2M以下时 clk就正常了

是我的逻辑分析仪设置的有问题的 采样率不 ...

你把你的逻分的采样率设置高一点,然后试一下刚才的PCLK/8

使用特权

评论回复
7
Alohaq| | 2023-10-24 15:46 | 只看该作者
请问后面解决了吗?我这只能250K。。。

使用特权

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

本版积分规则

2

主题

11

帖子

1

粉丝