码克 发表于 2021-1-27 23:33

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

本帖最后由 码克 于 2021-1-27 23:36 编辑

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

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

1波形


写代码实现功能
/**
*********************************************************************************
*
* @file    main.c
* @brief   Main file for DEMO
*
* @version V1.0
* @date    19 Feb 2019
* @authorAE Team
* @note   
*
* Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved.
*
*********************************************************************************
*/

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

/** @addtogroup Projects_Examples_MD
* @{
*/

/** @addtogroup Examples
* @{
*/

md_spi_init_t h_spi;

/**
* @briefInitializate pin of spi module.
* @retval None
*/
void spi_pin_init(void)
{
      md_gpio_init_t x;

      /* Initialize nss pin */
      x.mode= MD_GPIO_MODE_OUTPUT;
      x.odos= MD_GPIO_PUSH_PULL;
      x.pupd= MD_GPIO_PUSH_UP;
      x.podrv = MD_GPIO_OUT_DRIVE_1;
      x.nodrv = MD_GPIO_OUT_DRIVE_1;
      x.flt   = MD_GPIO_FILTER_DISABLE;
      x.type= MD_GPIO_TYPE_TTL;
      x.func= MD_GPIO_FUNC_1;
      md_gpio_init(GPIOC, MD_GPIO_PIN_0, &x);

      /* Initialize sck pin */
      x.mode= MD_GPIO_MODE_OUTPUT;
      x.odos= MD_GPIO_PUSH_PULL;
      x.pupd= MD_GPIO_PUSH_UP;
      x.podrv = MD_GPIO_OUT_DRIVE_1;
      x.nodrv = MD_GPIO_OUT_DRIVE_1;
      x.flt   = MD_GPIO_FILTER_DISABLE;
      x.type= MD_GPIO_TYPE_TTL;
      x.func= MD_GPIO_FUNC_4;
      md_gpio_init(GPIOC, MD_GPIO_PIN_1, &x);

      /* Initialize miso pin */
      x.mode= MD_GPIO_MODE_INPUT;
      x.odos= MD_GPIO_PUSH_PULL;
      x.pupd= MD_GPIO_PUSH_UP;
      x.podrv = MD_GPIO_OUT_DRIVE_1;
      x.nodrv = MD_GPIO_OUT_DRIVE_1;
      x.flt   = MD_GPIO_FILTER_DISABLE;
      x.type= MD_GPIO_TYPE_TTL;
      x.func= MD_GPIO_FUNC_4;
      md_gpio_init(GPIOC, MD_GPIO_PIN_2, &x);

      /* Initialize mosi pin */
      x.mode= MD_GPIO_MODE_OUTPUT;
      x.odos= MD_GPIO_PUSH_PULL;
      x.pupd= MD_GPIO_PUSH_UP;
      x.podrv = MD_GPIO_OUT_DRIVE_1;
      x.nodrv = MD_GPIO_OUT_DRIVE_1;
      x.flt   = MD_GPIO_FILTER_DISABLE;
      x.type= MD_GPIO_TYPE_TTL;
      x.func= MD_GPIO_FUNC_4;
      md_gpio_init(GPIOC, MD_GPIO_PIN_3, &x);

      return;
}

/**
* @briefTest main function
* @retval Status.
*/

      int i;

struct RGBW_t
{
      unsigned char R;
      unsigned char G;
      unsigned char B;
      unsigned char W;
} RGBW=
{
      .R      =      255,
      .G      =      0,
      .B      =      0,
      .W      =      0,
};

void      Send_SPI(unsigned char color)
{
      unsigned char i,temp;
      temp=color;
      for(i=0;i<8;i++)
      {
                if(temp & 0x80)
                {
                        md_spi_send_byte_fast(&h_spi, 0xFF);
                }
                else
                {
                        md_spi_send_byte_fast(&h_spi, 0xE0);
                }
                temp=temp<<1;
      }
}

void      Send_LED(void)
{
      unsigned char i;
      i=8;
      do
      {
                Send_SPI(RGBW.G);
                Send_SPI(RGBW.R);
                Send_SPI(RGBW.B);
                Send_SPI(RGBW.W);
                i--;
      }while(i>0);
}

int main()
{
      /* Configure system clock */
      md_cmu_clock_config_default();
      /* Initialize SysTick Interrupt */
      md_init_1ms_tick();

      /* Enable ALL peripheral */
      SYSCFG_UNLOCK();
      md_cmu_enable_perh_all();
      SYSCFG_LOCK();
      spi_pin_init();

      memset(&h_spi, 0, sizeof(h_spi));
      md_spi_struct_init(&h_spi);
      md_spi_init(&h_spi);

      while (1)
      {
                Send_LED();
                md_delay_1ms(100);
      }
}

/**
* @}
*/
/**
* @}
*/发个图

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

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


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



页: [1]
查看完整版本: 东软载波微电子ES32F369X开发板 测评 SPI在RGB灯带上的应用