查看: 585|回复: 1

STC32G SPI测试,最快能到36M

[复制链接]

1

主题

1

帖子

11

积分

注册会员

Rank: 2

积分
11
发表于 2022-3-6 14:26:11 | 显示全部楼层 |阅读模式
STC32G  SPI测试,最快能到36M。

  1. #include <STC32G.h>
  2. #include "intrins.h"


  3. void delay()
  4. {
  5. int i;
  6. for (i=0; i<100; i++);
  7. }

  8. #define FOSC 12000000UL

  9. #define HSCK_MCLK 0
  10. #define HSCK_PLL 1
  11. #define HSCK_SEL HSCK_PLL
  12. #define PLL_96M 0
  13. #define PLL_144M 1
  14. #define PLL_SEL PLL_144M
  15. #define CKMS 0x80
  16. #define HSIOCK 0x40
  17. #define MCK2SEL_MSK 0x0c
  18. #define MCK2SEL_SEL1 0x00
  19. #define MCK2SEL_PLL 0x04
  20. #define MCK2SEL_PLLD2 0x08
  21. #define MCK2SEL_IRC48 0x0c
  22. #define MCKSEL_MSK 0x03
  23. #define MCKSEL_HIRC 0x00
  24. #define MCKSEL_XOSC 0x01
  25. #define MCKSEL_X32K 0x02
  26. #define MCKSEL_IRC32K 0x03
  27. #define ENCKM 0x80
  28. #define PCKI_MSK 0x60
  29. #define PCKI_D1 0x00
  30. #define PCKI_D2 0x20
  31. #define PCKI_D4 0x40
  32. #define PCKI_D8 0x6

  33. void main()
  34. {
  35.   
  36.   WTST = 0x00;
  37.   P_SW2 = 0x80;
  38.   //选择 PLL 输出时钟
  39.   #if (PLL_SEL == PLL_96M)
  40.     CLKSEL &= ~CKMS; //选择 PLL 的 96M 作为 PLL 的输出时钟
  41.   #elif (PLL_SEL == PLL_144M)
  42.   CLKSEL |= CKMS; //选择 PLL 的 144M 作为 PLL 的输出时钟
  43.   #else
  44.   CLKSEL &= ~CKMS; //默认选择 PLL 的 96M 作为 PLL 的输出时钟
  45.   #endif
  46.   //选择 PLL 输入时钟分频,保证输入时钟为 12M
  47.   USBCLK &= ~PCKI_MSK;
  48.   #if (FOSC == 12000000UL)
  49.   USBCLK |= PCKI_D1; //PLL 输入时钟 1 分频
  50.   #elif (FOSC == 24000000UL)
  51.   USBCLK |= PCKI_D2; //PLL 输入时钟 2 分频
  52.   #elif (FOSC == 48000000UL)
  53.   USBCLK |= PCKI_D4; //PLL 输入时钟 4 分频
  54.   #elif (FOSC == 96000000UL)
  55.   USBCLK |= PCKI_D8; //PLL 输入时钟 8 分频
  56.   #else
  57.   USBCLK |= PCKI_D1; //默认 PLL 输入时钟 1 分频
  58.   #endif
  59.   //启动 PLL
  60.   USBCLK |= ENCKM; //使能 PLL 倍频
  61.   delay(); //等待 PLL 锁频
  62.   //选择 HSPWM/HSSPI 时钟
  63.   #if (HSCK_SEL == HSCK_MCLK)
  64.   CLKSEL &= ~HSIOCK; //HSPWM/HSSPI 选择主时钟为时钟源
  65.   #elif (HSCK_SEL == HSCK_PLL)
  66.   CLKSEL |= HSIOCK; //HSPWM/HSSPI 选择 PLL 输出时钟为时钟源
  67.   #else
  68.   CLKSEL &= ~HSIOCK; //默认 HSPWM/HSSPI 选择主时钟为时钟源
  69.   #endif

  70.   HSCLKDIV = 0; //HSPWM/HSSPI 时钟源不分频
  71.   //SPCTL: SSIG SPEN DORD MSTR CPOL CPHA SPR[1:0]
  72.   //        1    1    0    1    0    0    0   0
  73.   //SPR[1:0] SCLK 频率
  74.   //00 SYSclk/4
  75.   //01 SYSclk/8
  76.   //10 SYSclk/16
  77.   //11 SYSclk/2
  78.   SPCTL = 0xd0; //设置 SPI 为主机模式,速度为 SPI 时钟/4
  79.   HSSPI_CFG2 |= 0x20; //使能 SPI 高速模式
  80.   //00101000
  81.   P1M0 = 0x28;
  82.   P1M1 = 0x00;
  83.   //P1PU = 0xFF;

  84.   CLKDIV = 0x04; //时钟 4 分频, 主时钟选择高速频率前,
  85.   ////必须先设置分频系数,否则程序会当掉
  86.   ////xxxx0100
  87.   ////MCK2SEL[1:0] 01:内部 PLL 输出
  88.   ////MCKSEL[1:0]  00:内部高精度 IRC
  89.   CLKSEL &= 0xf0; //选择 PLL 时钟源
  90.   CLKSEL |= 0x04;

  91. //快速IO模式
  92.   P1DR = 0;
  93.   P1SR = 0;

  94.   while (1)
  95.   {
  96.     SPSTAT = 0xc0;
  97.     SPDAT = 0x5A;
  98.     while (!(SPSTAT & 0x80));
  99.     delay();

  100.   }
  101. }
复制代码






13.jpg
12.jpg

回复

使用道具 举报

0

主题

6

帖子

32

积分

注册会员

Rank: 2

积分
32
发表于 2022-3-19 22:37:50 | 显示全部楼层
代码有点复杂,目前还不太懂,也就知道速度快多了。
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|好好搭搭在线 ( © 好好搭搭在线 浙ICP备19030393号-1 )

GMT+8, 2024-4-25 21:44 , Processed in 0.364143 second(s), 25 queries .

Powered by Discuz!

© 2001-2024 Comsenz Inc.

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