Page 1 of 2
PHY6222芯片SPI灯控(DMA模式)演示例程
Posted: 2023年 Nov 22日 21:04
by 逻辑的院子
基本信息
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 |
GND | GND |
上位机灯控
打开 Logic 上位机(如果已经下载,请在帮助里面获取最新版本,要求 V2.3.7 及以上版本,上位机操作指南),选择 彩灯控制 页面。
(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 平台说明;
Re: PHY6222芯片SPI灯控(DMA模式)演示例程
Posted: 2023年 Nov 23日 12:18
by hysiry
设置了80多个灯 DMA分两次发 第二次的数据电平波动比较大《见附件》
Re: PHY6222芯片SPI灯控(DMA模式)演示例程
Posted: 2023年 Nov 23日 14:02
by 逻辑的院子
2包以上的要是用这个hal_dma_evt_handler
Re: PHY6222芯片SPI灯控(DMA模式)演示例程
Posted: 2023年 Nov 23日 14:50
by hysiry
查看了代码,evt没有继续发送,我在evt里面继续发3次 但是抓波形间隔是比较大的 ,有一两百微秒
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
}
Re: PHY6222芯片SPI灯控(DMA模式)演示例程
Posted: 2023年 Nov 23日 17:21
by 逻辑的院子
可以修改一下一下两个位置看看效果:
(1)
Code: Select all
__attribute__ ((weak)) __ATTR_SECTION_SRAM__ void hal_dma_evt_handler(DMA_CH_t ch)
(2)
Re: PHY6222芯片SPI灯控(DMA模式)演示例程
Posted: 2023年 Nov 24日 15:21
by hysiry
间隔还有60多微秒,需要控制到30以内,超过30灯会闪
Re: PHY6222芯片SPI灯控(DMA模式)演示例程
Posted: 2024年 Apr 18日 14:32
by 13418590826
/**
@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;
}
}
Re: PHY6222芯片SPI灯控(DMA模式)演示例程
Posted: 2024年 Apr 18日 14:36
by 13418590826
ret = hal_dma_wait_channel_complete(DMA_CH_0);// DMA RX ,程序在这里面卡住了 , SPI SCLK 无时序出来
DMA的接收按例程,跑到这个函数内部就卡住了。。。
Re: PHY6222芯片SPI灯控(DMA模式)演示例程
Posted: 2024年 Apr 18日 15:16
by 逻辑的院子
这个例程是DMA模式下SPI的纯发送例程,因为灯控一般只会用到发送模式,用的比较多,接收的代码还是芯片原厂的原始代码,目前还没有验证。
3.9.0版本本身是支持SPI收发测试的(非DMA模式)。
Re: PHY6222芯片SPI灯控(DMA模式)演示例程
Posted: 2024年 Apr 18日 15:22
by 13418590826
现在是从SPIFLASH读取大片的显示数据到TFT中,我们目前用的是非DMA方式,效果难以接受,目前DMA发送已经调试完成,但是这个DMA的接收就是搞不定。头疼。