东软载波微电子ES32F369X开发板 测评 SPI在RGB灯带上的应用

[复制链接]
 楼主| 码克 发表于 2021-1-27 23:33 | 显示全部楼层 |阅读模式
本帖最后由 码克 于 2021-1-27 23:36 编辑

年底很忙,一直没时间做测评。正好手头的项目有一个RGB灯带的,实际应用中是使用延时加nop()指令实现的,看了下这款开发板的参数,应该可以使用SPI实现,所以做下尝试。
这是灯带的控制时序。

可以巧妙的运用SPI发送特定时许的数值,就可以代替nop()延时。
我是用的keil平台,工程文件用的SDK里的MD驱动实例,ALD的驱动不太习惯,还是MD用来更顺手。
首先设置下SPI波特率,
  1. void md_spi_struct_init(md_spi_init_t *init){
  2.         init->SPIx      = SPI1;
  3.         init->mode      = MD_SPI_MODE_MASTER;
  4.         init->dir       = MD_SPI_DIRECTION_2LINES;
  5.         init->data_size = MD_SPI_DATA_SIZE_8;
  6.         init->baud      = MD_SPI_BAUD_2;//这里改下波特率
  7.         init->phase     = MD_SPI_CPHA_FIRST;
  8.         init->polarity        = MD_SPI_CPOL_HIGH;
  9.         init->first_bit        = MD_SPI_FIRSTBIT_MSB;
  10.         init->ss_en     = DISABLE;
  11.         init->crc_calc  = DISABLE;
  12.         init->crc_poly  = 0;
  13. }
设置完,抓个波形看下,有一点误差,但是在误差范围内。0波形

1波形


写代码实现功能
  1. /**
  2.   *********************************************************************************
  3.   *
  4.   * [url=home.php?mod=space&uid=288409]@file[/url]    main.c
  5.   * [url=home.php?mod=space&uid=247401]@brief[/url]   Main file for DEMO
  6.   *
  7.   * [url=home.php?mod=space&uid=895143]@version[/url] V1.0
  8.   * [url=home.php?mod=space&uid=212281]@date[/url]    19 Feb 2019
  9.   * [url=home.php?mod=space&uid=187600]@author[/url]  AE Team
  10.   * @note   
  11.   *
  12.   * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved.
  13.   *
  14.   *********************************************************************************
  15.   */

  16. #include <string.h>
  17. #include "main.h"

  18. /** @addtogroup Projects_Examples_MD
  19.   * @{
  20.   */

  21. /** @addtogroup Examples
  22.   * @{
  23.   */

  24. md_spi_init_t h_spi;

  25. /**
  26.   * @brief  Initializate pin of spi module.
  27.   * @retval None
  28.   */
  29. void spi_pin_init(void)
  30. {
  31.         md_gpio_init_t x;

  32.         /* Initialize nss pin */
  33.         x.mode  = MD_GPIO_MODE_OUTPUT;
  34.         x.odos  = MD_GPIO_PUSH_PULL;
  35.         x.pupd  = MD_GPIO_PUSH_UP;
  36.         x.podrv = MD_GPIO_OUT_DRIVE_1;
  37.         x.nodrv = MD_GPIO_OUT_DRIVE_1;
  38.         x.flt   = MD_GPIO_FILTER_DISABLE;
  39.         x.type  = MD_GPIO_TYPE_TTL;
  40.         x.func  = MD_GPIO_FUNC_1;
  41.         md_gpio_init(GPIOC, MD_GPIO_PIN_0, &x);

  42.         /* Initialize sck pin */
  43.         x.mode  = MD_GPIO_MODE_OUTPUT;
  44.         x.odos  = MD_GPIO_PUSH_PULL;
  45.         x.pupd  = MD_GPIO_PUSH_UP;
  46.         x.podrv = MD_GPIO_OUT_DRIVE_1;
  47.         x.nodrv = MD_GPIO_OUT_DRIVE_1;
  48.         x.flt   = MD_GPIO_FILTER_DISABLE;
  49.         x.type  = MD_GPIO_TYPE_TTL;
  50.         x.func  = MD_GPIO_FUNC_4;
  51.         md_gpio_init(GPIOC, MD_GPIO_PIN_1, &x);

  52.         /* Initialize miso pin */
  53.         x.mode  = MD_GPIO_MODE_INPUT;
  54.         x.odos  = MD_GPIO_PUSH_PULL;
  55.         x.pupd  = MD_GPIO_PUSH_UP;
  56.         x.podrv = MD_GPIO_OUT_DRIVE_1;
  57.         x.nodrv = MD_GPIO_OUT_DRIVE_1;
  58.         x.flt   = MD_GPIO_FILTER_DISABLE;
  59.         x.type  = MD_GPIO_TYPE_TTL;
  60.         x.func  = MD_GPIO_FUNC_4;
  61.         md_gpio_init(GPIOC, MD_GPIO_PIN_2, &x);

  62.         /* Initialize mosi pin */
  63.         x.mode  = MD_GPIO_MODE_OUTPUT;
  64.         x.odos  = MD_GPIO_PUSH_PULL;
  65.         x.pupd  = MD_GPIO_PUSH_UP;
  66.         x.podrv = MD_GPIO_OUT_DRIVE_1;
  67.         x.nodrv = MD_GPIO_OUT_DRIVE_1;
  68.         x.flt   = MD_GPIO_FILTER_DISABLE;
  69.         x.type  = MD_GPIO_TYPE_TTL;
  70.         x.func  = MD_GPIO_FUNC_4;
  71.         md_gpio_init(GPIOC, MD_GPIO_PIN_3, &x);

  72.         return;
  73. }

  74. /**
  75.   * @brief  Test main function
  76.   * @retval Status.
  77.   */

  78.         int i;

  79. struct RGBW_t
  80. {
  81.         unsigned char R;
  82.         unsigned char G;
  83.         unsigned char B;
  84.         unsigned char W;
  85. } RGBW=
  86. {
  87.         .R        =        255,
  88.         .G        =        0,
  89.         .B        =        0,
  90.         .W        =        0,
  91. };

  92. void        Send_SPI(unsigned char color)
  93. {
  94.         unsigned char i,temp;
  95.         temp=color;
  96.         for(i=0;i<8;i++)
  97.         {
  98.                 if(temp & 0x80)
  99.                 {
  100.                         md_spi_send_byte_fast(&h_spi, 0xFF);
  101.                 }
  102.                 else
  103.                 {
  104.                         md_spi_send_byte_fast(&h_spi, 0xE0);
  105.                 }
  106.                 temp=temp<<1;
  107.         }
  108. }

  109. void        Send_LED(void)
  110. {
  111.         unsigned char i;
  112.         i=8;
  113.         do
  114.         {
  115.                 Send_SPI(RGBW.G);
  116.                 Send_SPI(RGBW.R);
  117.                 Send_SPI(RGBW.B);
  118.                 Send_SPI(RGBW.W);
  119.                 i--;
  120.         }while(i>0);
  121. }

  122. int main()
  123. {
  124.         /* Configure system clock */
  125.         md_cmu_clock_config_default();
  126.         /* Initialize SysTick Interrupt */
  127.         md_init_1ms_tick();

  128.         /* Enable ALL peripheral */
  129.         SYSCFG_UNLOCK();
  130.         md_cmu_enable_perh_all();
  131.         SYSCFG_LOCK();
  132.         spi_pin_init();

  133.         memset(&h_spi, 0, sizeof(h_spi));
  134.         md_spi_struct_init(&h_spi);
  135.         md_spi_init(&h_spi);

  136.         while (1)
  137.         {
  138.                 Send_LED();
  139.                 md_delay_1ms(100);
  140.         }
  141. }

  142. /**
  143.   * @}
  144.   */
  145. /**
  146.   * @}
  147.   */
发个图

说几个要注意的点:
1、这里最好加上--C99

2、调试的时候,下载完成,是要再按一下复位按键才有效果的


下一步准备用DMA+SPI配合,调试下。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

本版积分规则

1

主题

6

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部