Page 2 of 2

Re: 【求助】【TuyaOS OS】【PHY6222】求份SPI的使用DEMO或者文档

Posted: 2023年 Nov 9日 17:28
by wxq1123
Mumu_YU 2023年 Nov 9日 16:46
wxq1123 2023年 Nov 9日 11:34
Mumu_YU 2023年 Nov 9日 10:30

5.3 SPI支持速率
SPI频率有如下注意事项,其中 F ssi_clk为 pclk,F sclk_in为 spi clock。
➢ SPI Master: F ssi_clk >= 2 × (maximum F sclk_out )
➢ SPI Slave (receive only): F ssi_clk >= 6 × (maximum F sclk_in )
➢ SPI Slave: F ssi_clk >= 8 × (maximum F sclk_in)

按你说增加主频,我现在g_system_clk = SYS_CLK_DLL_64M; 还是不能设置为6.4M,设置6.4M后波形就乱套了

主频64M,spi速率30M。我使用逻分看波形确实乱了。我的逻分100m的,但是用示波器来看没有问题。

请问你发送函数用的哪一个接口?我设置成30M直接回卡死


Re: 【求助】【TuyaOS OS】【PHY6222】求份SPI的使用DEMO或者文档

Posted: 2023年 Nov 9日 18:04
by kangxi

有做过ws2811驱动预研,以下代码可以参考:

Code: Select all

int ty_light_driver_spi_init(void)//初始化
{
	uint8_t retval = PPlus_SUCCESS;

	hal_dma_init();//use dma
	
	ty_spi_ptr.spi_index = SPI1;
	hal_spi_init(ty_spi_ptr.spi_index);	

	ty_spim_cfg.MOSI = TY2_SPI_PIN_MOSI;
	ty_spim_cfg.baudrate = 7000000;//1bit --- 151ns
	ty_spim_cfg.spi_tmod = SPI_TXD;// only send
	ty_spim_cfg.spi_scmod = SPI_MODE0;
  	ty_spim_cfg.int_mode = false;
  	ty_spim_cfg.force_cs = true;
	ty_spim_cfg.spi_dfsmod = SPI_1BYTE;
  	ty_spim_cfg.evt_handler = NULL;	

	retval = hal_spi_bus_init(&ty_spi_ptr, ty_spim_cfg);

	if(retval != PPlus_SUCCESS){
			TUYA_APP_LOG_ERROR("spi init err!please check it!\n");
			return retval;
	}

	ty_dma_cfg.dma_channel = DMA_CH_0;
  	ty_dma_cfg.evt_handler = ty_light_driver_dma_int;
	
	retval = hal_dma_init_channel(ty_dma_cfg);

	if(retval != PPlus_SUCCESS){
			TUYA_APP_LOG_ERROR("dma init err!please check it!\n");
			return retval;
	}
	
}

Code: Select all

int ty_light_driver_spi_data_send(void)//发送
{
		uint8_t retval = PPlus_SUCCESS;

		if(spi_data_tx.spi_data_send_flag){
				spi_data_tx.send_cnt = (spi_data_tx.tx_buffer_len/DMA_H0_DATA_MAX_LEN)+1;
				hal_spi_dma_set(&ty_spi_ptr,1,0);

				if(spi_data_tx.send_cnt==1){			
					retval = hal_spi_transmit(&ty_spi_ptr,SPI_TXD,spi_data_tx.tx_buffer,NULL,spi_data_tx.tx_buffer_len,0);
				}else{
					retval = hal_spi_transmit(&ty_spi_ptr,SPI_TXD,spi_data_tx.tx_buffer,NULL,DMA_H0_DATA_MAX_LEN,0);
				}	

				if(retval != PPlus_SUCCESS){
					TUYA_APP_LOG_ERROR("ty_light_driver_data_send err!!!");			
				}
		}else{
				retval = PPlus_ERR_INVALID_DATA;
				TUYA_APP_LOG_ERROR("ty light no data send!!!");
		}
		
		return retval;
}

Re: 【求助】【TuyaOS OS】【PHY6222】求份SPI的使用DEMO或者文档

Posted: 2023年 Nov 9日 18:12
by wxq1123
kangxi 2023年 Nov 9日 18:04

有做过ws2811驱动预研,以下代码可以参考:

Code: Select all

int ty_light_driver_spi_init(void)//初始化
{
	uint8_t retval = PPlus_SUCCESS;

	hal_dma_init();//use dma
	
	ty_spi_ptr.spi_index = SPI1;
	hal_spi_init(ty_spi_ptr.spi_index);	

	ty_spim_cfg.MOSI = TY2_SPI_PIN_MOSI;
	ty_spim_cfg.baudrate = 7000000;//1bit --- 151ns
	ty_spim_cfg.spi_tmod = SPI_TXD;// only send
	ty_spim_cfg.spi_scmod = SPI_MODE0;
  	ty_spim_cfg.int_mode = false;
  	ty_spim_cfg.force_cs = true;
	ty_spim_cfg.spi_dfsmod = SPI_1BYTE;
  	ty_spim_cfg.evt_handler = NULL;	

	retval = hal_spi_bus_init(&ty_spi_ptr, ty_spim_cfg);

	if(retval != PPlus_SUCCESS){
			TUYA_APP_LOG_ERROR("spi init err!please check it!\n");
			return retval;
	}

	ty_dma_cfg.dma_channel = DMA_CH_0;
  	ty_dma_cfg.evt_handler = ty_light_driver_dma_int;
	
	retval = hal_dma_init_channel(ty_dma_cfg);

	if(retval != PPlus_SUCCESS){
			TUYA_APP_LOG_ERROR("dma init err!please check it!\n");
			return retval;
	}
	
}

Code: Select all

int ty_light_driver_spi_data_send(void)//发送
{
		uint8_t retval = PPlus_SUCCESS;

		if(spi_data_tx.spi_data_send_flag){
				spi_data_tx.send_cnt = (spi_data_tx.tx_buffer_len/DMA_H0_DATA_MAX_LEN)+1;
				hal_spi_dma_set(&ty_spi_ptr,1,0);

				if(spi_data_tx.send_cnt==1){			
					retval = hal_spi_transmit(&ty_spi_ptr,SPI_TXD,spi_data_tx.tx_buffer,NULL,spi_data_tx.tx_buffer_len,0);
				}else{
					retval = hal_spi_transmit(&ty_spi_ptr,SPI_TXD,spi_data_tx.tx_buffer,NULL,DMA_H0_DATA_MAX_LEN,0);
				}	

				if(retval != PPlus_SUCCESS){
					TUYA_APP_LOG_ERROR("ty_light_driver_data_send err!!!");			
				}
		}else{
				retval = PPlus_ERR_INVALID_DATA;
				TUYA_APP_LOG_ERROR("ty light no data send!!!");
		}
		
		return retval;
}

我dma的宏手动打开后编译器找不到“include "dma.h"”,我该如何设置路径