PHY6222芯片SPI灯控(DMA模式)演示例程

蓝牙 BLE设备、蓝牙 MESH设备、蓝牙 Beacon设备、Sub-G设备等


User avatar
逻辑的院子
Posts: 220
Contact:

基本信息

SDK:TuyaOS BLE SDK V3.9.0 For PHY6222

LED驱动芯片:WS2811

代码修改

从 Tuya Wind IDE 拉取 SDK 并 编译成功至少一次 后,替换以下文件(下载地址):

\software\TuyaOS\vendor\phy6222_ble\tuyaos\drivers\tkl_spi.c

\software\TuyaOS\vendor\phy6222_ble\tuyaos\include\board.h

\software\TuyaOS\vendor\phy6222_ble\sdk\phy62xx-sdk-v3\components\driver\spi 文件夹

\software\TuyaOS\vendor\phy6222_ble\toolchain\templates\vendor.json

\software\TuyaOS\apps\tuyaos_demo_ble_peripheral\tuya_iot.config

然后 使用 vscode 重新编译 SDK,烧录固件。

硬件接线

PHY6222灯珠
SDO(P20)SDO
GNDGND

上位机灯控

打开 Logic 上位机(如果已经下载,请在帮助里面获取最新版本,要求 V2.3.7 及以上版本,上位机操作指南),选择 彩灯控制 页面。

Image

(1)滑动 R、G、B 的滑动条即可调节灯串的 RGB 颜色值(取值范围:0255);

(2)滑动 H、S、V 的滑动条即可调节灯串的 HSV 数值,H 的取值范围:0360,S 和 V 的取值范围:0% ~ 100%;

(3)编辑 灯的个数 即可改变控制灯的数量(每个灯需要 3 字节的 RGB 数据控制);

(4)编辑 波特率 即可改变 SPI 的波特率,由于芯片限制修改范围小不能修改成功,一般不会修改;

(5)也可以选择 SPI 的不同实例,SPI0 和 SPI1 对应的引脚详见 PHY6222 平台说明

hysiry
Posts: 15

Re: PHY6222芯片SPI灯控(DMA模式)演示例程

6594edf86e5cc83d66931db36281b8d.png

设置了80多个灯 DMA分两次发 第二次的数据电平波动比较大《见附件》

hysiry
Posts: 15

Re: PHY6222芯片SPI灯控(DMA模式)演示例程

查看了代码,evt没有继续发送,我在evt里面继续发3次 但是抓波形间隔是比较大的 ,有一两百微秒

11.jpg

static void hal_dma_evt_handler(DMA_CH_t ch)
{
#if (BOARD_SPI_LIGHT_DRIVER)

Code: Select all

light_spi_data.is_sending = 0;

TY_PRINTF("DMA send finish!");

// If the data is too long, you can send the rest of the data here
if(counter)
{
    counter--;
    hal_spi_transmit(&sg_spim, SPI_TXD, (void*)light_spi_data.tx_buffer, NULL, light_spi_data.tx_buffer_len, 0);
}

#endif
}

User avatar
逻辑的院子
Posts: 220
Contact:

Re: PHY6222芯片SPI灯控(DMA模式)演示例程

可以修改一下一下两个位置看看效果:
(1)

Code: Select all

__attribute__ ((weak)) __ATTR_SECTION_SRAM__ void hal_dma_evt_handler(DMA_CH_t ch)

(2)

Code: Select all

g_system_clk = SYS_CLK_DLL_48M;
hysiry
Posts: 15

Re: PHY6222芯片SPI灯控(DMA模式)演示例程

间隔还有60多微秒,需要控制到30以内,超过30灯会闪

13418590826
Posts: 3

Re: PHY6222芯片SPI灯控(DMA模式)演示例程

/**

  • @brief
    *

  • @param spi_ptr

  • @param tx_buf

  • @param tx_len
    */
    #define SPI_SEL AP_SPI1
    void spi_flash_DMA_RX(uint8_t cs_x, uint8_t *rx_buf, uint16_t rx_len)
    {
    if (rx_buf == NULL || rx_len == 0)
    {
    return;
    }
    LOG("spi_flash_DMA_RX();\n");
    //
    SPI_SEL->DMACR &= 0x02;
    //
    DMA_CH_CFG_t dma_cfgc = {0};

    dma_cfgc.transf_size = rx_len; // length

    dma_cfgc.sinc = DMA_INC_NCHG;
    dma_cfgc.src_tr_width = DMA_WIDTH_BYTE;
    dma_cfgc.src_msize = DMA_BSIZE_1;
    dma_cfgc.src_addr = (uint32_t) & (SPI_SEL->DataReg); // source addr

    dma_cfgc.dinc = DMA_INC_INC;
    dma_cfgc.dst_tr_width = DMA_WIDTH_BYTE;
    dma_cfgc.dst_msize = DMA_BSIZE_1;
    dma_cfgc.dst_addr = (uint32_t)rx_buf; // dst addr
    dma_cfgc.enable_int = false;
    LOG("hal_dma_config_channel();\n");
    int ret;
    ret = hal_dma_config_channel(DMA_CH_0, &dma_cfgc);
    if (PPlus_SUCCESS != ret)
    {
    LOG("hal_dma_config_channel,err\n", ret);
    }

    //
    if (cs_x == 1)
    {
    SPI_CS_L;
    }
    ret = hal_dma_start_channel(DMA_CH_0);
    if (PPlus_SUCCESS != ret)
    {
    LOG("hal_dma_start_channel,err\n", ret);
    }
    SPI_SEL->DMACR |= 0x01;
    SPI_SEL->DMATDLR = 0;
    ret = hal_dma_wait_channel_complete(DMA_CH_0);// DMA RX ,程序在这里面卡住了 , SPI SCLK 无时序出来
    if (PPlus_SUCCESS != ret)
    {
    LOG("hal_dma_wait_channel_complete,err\n", ret);
    }
    if (cs_x == 1)
    {
    SPI_CS_H;
    }
    }

Last edited by 13418590826 on 2024年 Apr 18日 15:20, edited 1 time in total.
13418590826
Posts: 3

Re: PHY6222芯片SPI灯控(DMA模式)演示例程

ret = hal_dma_wait_channel_complete(DMA_CH_0);// DMA RX ,程序在这里面卡住了 , SPI SCLK 无时序出来
DMA的接收按例程,跑到这个函数内部就卡住了。。。

Last edited by 13418590826 on 2024年 Apr 18日 15:20, edited 1 time in total.
User avatar
逻辑的院子
Posts: 220
Contact:

Re: PHY6222芯片SPI灯控(DMA模式)演示例程

这个例程是DMA模式下SPI的纯发送例程,因为灯控一般只会用到发送模式,用的比较多,接收的代码还是芯片原厂的原始代码,目前还没有验证。
3.9.0版本本身是支持SPI收发测试的(非DMA模式)。

13418590826
Posts: 3

Re: PHY6222芯片SPI灯控(DMA模式)演示例程

现在是从SPIFLASH读取大片的显示数据到TFT中,我们目前用的是非DMA方式,效果难以接受,目前DMA发送已经调试完成,但是这个DMA的接收就是搞不定。头疼。

Post Reply