在申请开发办的时候,是奔着这个开发板的高工作主频去的。所以这次测试主要围绕工作主频。在上次测试GPIO程序的基础上,进行了简单修改,在循环中不加 延时,直接翻转GPIO端口,然后检测端口的周期/脉冲频率。程序如下:

  1. #include <rtthread.h>
  2. #include <rtdevice.h>
  3. #include "rtt_board.h"

  4. void thread_entry(void *arg);

  5. int main(void) {
  6.     // 初始化LED使用的GPIO
  7.     app_init_led_pins();

  8.     // 建立线程
  9.     static uint32_t led_thread_arg = 0;
  10.     rt_thread_t led_thread = rt_thread_create("led_th", thread_entry, &led_thread_arg, 1024, 1, 10);

  11.     // 启动线程
  12.     rt_thread_startup(led_thread);

  13.     return 0;
  14. }

  15. // LED闪烁线程
  16. void thread_entry(void *arg) {
  17.     while (1) {
  18.         app_led_write(0, APP_LED_ON);       // 输出1
  19.         app_led_write(0, APP_LED_OFF);      // 输出0
  20.     }
  21. }
用示波器的检测结果:
图片1.png
脉冲周期是80nS左右。我的示波器是200MHz的,感觉测量结果已经不太准确了。波形也不好看,不是标准的方波了。这个测试的目的主要是看看时钟能达到什么级别。按照这个结果看,用来测量MHz级别的信号,应该没问题,虽然有些勉强。

接下来,测试SPI的工作情况。利用HPM SDK Project Generator生成工程代码,选择的是spi_polling_master例程:

图片2.png
生成的例程使用SEGGER Embedded Studio集成编译器。为了测试,修改了主程序代码:
  1. int main(void) {
  2.     uint8_t wbuff[10] = {0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9};
  3.     uint8_t rbuff[10] = {0};
  4.     spi_timing_config_t timing_config = {0};
  5.     spi_format_config_t format_config = {0};
  6.     spi_control_config_t control_config = {0};
  7.     hpm_stat_t stat;
  8.     uint32_t spi_clcok;

  9.     /* bsp initialization */
  10.     board_init();
  11.     spi_clcok = board_init_spi_clock(BOARD_APP_SPI_BASE);
  12.     board_init_spi_pins(BOARD_APP_SPI_BASE);
  13.     printf("SPI-Master Polling Transfer Example\n");

  14.     /* set SPI sclk frequency for master */
  15.     spi_master_get_default_timing_config(&timing_config);
  16.     timing_config.master_config.clk_src_freq_in_hz = spi_clcok;
  17.     timing_config.master_config.sclk_freq_in_hz = BOARD_APP_SPI_SCLK_FREQ;
  18.     if (status_success != spi_master_timing_init(BOARD_APP_SPI_BASE, &timing_config)) {
  19.         printf("SPI master timming init failed\n");
  20.         while (1) {
  21.         }
  22.     }
  23.     printf("SPI-Master transfer timing is configured.\n");
  24.     printf("SPI-Master transfer source clock frequency: %dHz\n", timing_config.master_config.clk_src_freq_in_hz);
  25.     printf("SPI-Master transfer sclk frequency: %dHz\n", timing_config.master_config.sclk_freq_in_hz);

  26.     /* set SPI format config for master */
  27.     spi_master_get_default_format_config(&format_config);
  28.     format_config.common_config.data_len_in_bits = BOARD_APP_SPI_DATA_LEN_IN_BITS;
  29.     format_config.common_config.mode = spi_master_mode;
  30.     format_config.common_config.cpol = spi_sclk_high_idle;
  31.     format_config.common_config.cpha = spi_sclk_sampling_even_clk_edges;
  32.     spi_format_init(BOARD_APP_SPI_BASE, &format_config);
  33.     printf("SPI-Master transfer format is configured.\n");

  34.     /* set SPI control config for master */
  35.     spi_master_get_default_control_config(&control_config);
  36.     control_config.master_config.cmd_enable = false;  /* cmd phase control for master */
  37.     control_config.master_config.addr_enable = false; /* address phase control for master */
  38.     control_config.common_config.trans_mode = spi_trans_write_only;
  39.     spi_transfer_mode_print(&control_config);

  40.     printf("SPI-Master transfer starts.\n");
  41.     stat = spi_transfer(BOARD_APP_SPI_BASE,
  42.                 &control_config,
  43.                 NULL, NULL,
  44.                 (uint8_t *)wbuff, ARRAY_SIZE(wbuff), (uint8_t *)rbuff, ARRAY_SIZE(rbuff));

  45.     if (stat == status_success) {
  46.         printf("SPI-Master transfer ends.\n");
  47.     } else {
  48.         printf("SPI-Master transfer error[%d]!\n", stat);
  49.     }

  50.     while(1) {
  51.        stat = spi_transfer(BOARD_APP_SPI_BASE,
  52.                   &control_config,
  53.                   NULL, NULL,
  54.                   (uint8_t *)wbuff, ARRAY_SIZE(wbuff), (uint8_t *)rbuff, ARRAY_SIZE(rbuff));

  55.        if (stat == status_success) {
  56.             printf("SPI-Master transfer ends.\n");
  57.         } else {
  58.             printf("SPI-Master transfer error[%d]!\n", stat);
  59.         }
  60.     }

  61.     return 0;
  62. }

使用control_config.common_config.trans_mode = spi_trans_write_only;设置SPI为输出模式,因为后面是为了驱动SPI显示屏用的,不需要读。依旧使用串口模式烧录程序。根据电路图:


   图片3.png   


可以在J3的MOSI和SCLK获取波形和逻辑数据。以下是逻辑数据:
图片4.png
由分析结果,和例程中发送的数据是一致的。可以看到,SPI的时钟周期是50nS,频率为20MHz,已经很高了。
图片5.png
示波器测出的波形依旧不好看,但可以看得出测量结果是一致的。
图片6.png
接下来,就准备用这个SPI接口驱动TFT显示屏。

补充说明以下,程序中的串口调试输出内容依旧使用的是TX0/RX0实现的。另外一点,在烧录程序的时候,

图片7.png
烧录程序所在的文件夹中,一定不要有中文字符。否则,在连接串口的时候,一定会失败,这个问题是我在本次进行测试的时候发现的。