找回密码
 立即注册
查看: 1367|回复: 1

SPI高速模式

[复制链接]
  • TA的每日心情
    开心
    2024-1-4 09:46
  • 签到天数: 2 天

    [LV.1]初来乍到

    16

    主题

    26

    回帖

    236

    积分

    中级会员

    积分
    236
    发表于 2022-12-6 17:35:36 | 显示全部楼层 |阅读模式
    由于在开发时用到LCD_TFT屏及W25 FLASH,使用SPI通讯时,是可以的,但是使用高速SPI时,时钟波形下降沿下不来,差不多下到一半又上去了。数据波形却正常工作。


    void Sys_config(void) //系统配置
    {
            // ******IO配置****************
              WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
        EAXFR = 1; //扩展寄存器(XFR)访问使能
        CKCON = 0; //提高访问XRAM速度
        P0M1 = 0x00;   P0M0 = 0x00;   //设置P1为ADC输入口
        P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
        P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
        P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
        P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
        P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
        P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
        P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
                    P0PU=0xFF;
               P1PU=0xFF;
                    delay_ms(1000);
                    UART1_config();                  //使用串口1配置





            /*
                //选择PLL输出时钟
    #if (PLL_SEL == PLL_96M)
        CLKSEL &= ~CKMS;            //选择PLL的96M作为PLL的输出时钟
    #elif (PLL_SEL == PLL_144M)
        CLKSEL |= CKMS;             //选择PLL的144M作为PLL的输出时钟
    #else
        CLKSEL &= ~CKMS;            //默认选择PLL的96M作为PLL的输出时钟
    #endif

        //选择PLL输入时钟分频,保证输入时钟为12M
        USBCLK &= ~PCKI_MSK;
    #if (MAIN_Fosc == 12000000UL)
        USBCLK |= PCKI_D1;          //PLL输入时钟1分频
    #elif (MAIN_Fosc == 24000000UL)
        USBCLK |= PCKI_D2;          //PLL输入时钟2分频
    #elif (MAIN_Fosc == 48000000UL)
        USBCLK |= PCKI_D4;          //PLL输入时钟4分频
    #elif (MAIN_Fosc == 96000000UL)
        USBCLK |= PCKI_D8;          //PLL输入时钟8分频
    #else
        USBCLK |= PCKI_D1;          //默认PLL输入时钟1分频
    #endif

        //启动PLL
        USBCLK |= ENCKM;            //使能PLL倍频
        delay_ms(1);                //等待PLL锁频

        //选择HSPWM/HSSPI时钟
    #if (HSCK_SEL == HSCK_MCLK)
        CLKSEL &= ~HSIOCK;          //HSPWM/HSSPI选择主时钟为时钟源
    #elif (HSCK_SEL == HSCK_PLL)
        CLKSEL |= HSIOCK;           //HSPWM/HSSPI选择PLL输出时钟为时钟源
    #else
        CLKSEL &= ~HSIOCK;          //默认HSPWM/HSSPI选择主时钟为时钟源
    #endif
    */
        HSCLKDIV = 4;               //HSPWM/HSSPI时钟源4分频
        SSIG = 1; //忽略 SS 引脚功能,使用 MSTR 确定器件是主机还是从机
        SPEN = 1; //使能 SPI 功能
        DORD = 0; //先发送/接收数据的高位( MSB)
        MSTR = 1; //设置主机模式
        CPOL = 1; //SCLK 空闲时为高电平,SCLK 的前时钟沿为下降沿,后时钟沿为上升沿
        CPHA = 1; //数据在 SCLK 前时钟沿驱动,后时钟沿采样
        //采用漏极开路+上拉电阻方式驱动,需要调低SPI频率才能正常与Flash通信
        SPCTL = (SPCTL & ~3) | 0;   //SPI 时钟频率选择, 0: 4T, 1: 8T,  2: 16T,  3: 2T
        P_SW1 = (P_SW1 & ~(3<<2)) | (1<<0);     //IO口切换. 0: P1.2/P5.4 P1.3 P1.4 P1.5, 1: P2.2 P2.3 P2.4 P2.5, 2: P5.4 P4.0 P4.1 P4.3, 3: P3.5 P3.4 P3.3 P3.2

        HSCLKDIV = 0x01;        //高速时钟1分频,默认2分频
       
        //P_PM25LV040_SCK = 0;    // set clock to low initial state
       // P_PM25LV040_SI = 1;
                LCD_SCL=0;
           
        SPIF = 1;   //清SPIF标志
        WCOL = 1;   //清WCOL标志
            //  HSSPI_CFG2 |= 0x20;         //使能SPI高速模式



    IO使用内部上拉电阻设置,不知会不会有问题 呢、?
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 08:59
  • 签到天数: 143 天

    [LV.7]常住居民III

    27

    主题

    1343

    回帖

    4187

    积分

    论坛元老

    积分
    4187
    发表于 2022-12-6 18:44:11 | 显示全部楼层
    作主机的话,可将SPI的CLK,MOSI,SS脚设置为推挽输出模式,提高输出脚的驱动能力。内部上拉电阻对拉低电平会有一定影响,这些输出脚不需要开启内部上拉。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-19 00:48 , Processed in 0.052065 second(s), 32 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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