Page 1 of 2

【求助】ZS系列SPI使用问题

Posted: 2025年 Jun 26日 09:02
by xiaoluo

您好!现在有个项目,模块用的ZSU模块,SDK版本为:EFR32MG21A020_TuyaOS-3.11.1。项目中用到SPI功能,每次发送数据需要发送8KByte的数据。但是实测每次只能发送不超过2047Byte的数据,请问这个有什么解决办法吗?


Re: 【求助】ZS系列SPI使用问题

Posted: 2025年 Jun 26日 15:01
by xiaoluo

目前发送数据的接口使用的是:SPIDRV_MTransmit。初始化是这样初始化的:
SPIDRV_Init_t tSpiDrvCfg;
tSpiDrvCfg.bitRate = 8000000;
tSpiDrvCfg.frameLength = 8;
tSpiDrvCfg.dummyTxValue = 0;
tSpiDrvCfg.type = spidrvMaster;
tSpiDrvCfg.bitOrder = spidrvBitOrderMsbFirst;
tSpiDrvCfg.clockMode = spidrvClockMode0;
tSpiDrvCfg.csControl = spidrvCsControlAuto;
tSpiDrvCfg.slaveStartMode = spidrvSlaveStartImmediate;
optRet = SPIDRV_Init(&tSpiDrvHandle, &tSpiDrvCfg);
如果采用分包传送(一帧数据分N次发送),测试发现,在调用接口:SPIDRV_MTransmit(&tSpiDrvHandle, u8TxBuffer, u32TxBufferLength, spi_data_send_callback); 发送数据后到发送数据完成,执行回调函数:spi_data_send_callback 中间间隔的时间都是5毫秒以上(使用GPIO翻转电平来测试的间隔时间),这会导致从设备那边接收数据异常。


Re: 【求助】ZS系列SPI使用问题

Posted: 2025年 Jun 26日 15:53
by shiliang

您好:

当前原厂底层驱动发送buff依赖于DMA buff,默认大小是0x0800,如果需要发送8K数据,是否可以拆分发送。


Re: 【求助】ZS系列SPI使用问题

Posted: 2025年 Jun 26日 16:12
by xiaoluo

您好!
1、如果采用分包传送(一帧数据分N次发送),测试发现,在调用接口:SPIDRV_MTransmit(&tSpiDrvHandle, u8TxBuffer, u32TxBufferLength, spi_data_send_callback); 发送数据后到发送数据完成,执行回调函数:spi_data_send_callback 中间间隔的时间都是5毫秒以上(使用GPIO翻转电平来测试的间隔时间),这会导致从设备那边接收数据异常。有什么办法可以解决这个回调函数触发的时间吗?
2、这个原厂底层驱动发送buff依赖于DMA buff,默认大小是0x0800,这个默认大小可以修改吗?


Re: 【求助】ZS系列SPI使用问题

Posted: 2025年 Jun 26日 16:32
by shiliang

您好!
1、如果采用分包传送(一帧数据分N次发送),测试发现,在调用接口:SPIDRV_MTransmit(&tSpiDrvHandle, u8TxBuffer, u32TxBufferLength, spi_data_send_callback); 发送数据后到发送数据完成,执行回调函数:spi_data_send_callback 中间间隔的时间都是5毫秒以上(使用GPIO翻转电平来测试的间隔时间),这会导致从设备那边接收数据异常。有什么办法可以解决这个回调函数触发的时间吗?

是否可以提供下具体是什么样的异常?

2、这个原厂底层驱动发送buff依赖于DMA buff,默认大小是0x0800,这个默认大小可以修改吗?
可以尝试更改frameLength大小为16,如果 frameLength = 16,DMA buffer 仍为 2048,则一次最多可以发送 2048 帧(每帧 2 字节),也就是 4096 字节。


Re: 【求助】ZS系列SPI使用问题

Posted: 2025年 Jun 26日 16:40
by xiaoluo

您好!用来驱动LED 芯片, 间隔时间不能超过芯片的复位(归零码)时间


Re: 【求助】ZS系列SPI使用问题

Posted: 2025年 Jun 26日 16:51
by shiliang

可以尝试使用SPIDRV_MTransmitB函数发送,framelength改为16

Code: Select all

// 第一次传输4096字节
result = SPIDRV_MTransmitB(handle, data, 2048);
if (result != ECODE_EMDRV_SPIDRV_OK) {
    return result;
}

// 第二次传输剩余的4096字节
result = SPIDRV_MTransmitB(handle, data + 2048, 2048);
return result;

Re: 【求助】ZS系列SPI使用问题

Posted: 2025年 Jun 26日 17:33
by xiaoluo

您好!参考您说的方法:
optRet = SPIDRV_MTransmitB(&tSpiDrvHandle, u8TxBuffer, ((u32TxBufferLength/4) + 1));
if(ECODE_EMDRV_SPIDRV_OK != optRet) {
return optRet;
}
optRet = SPIDRV_MTransmitB(&tSpiDrvHandle, u8TxBuffer + (u32TxBufferLength/2) ), ((u32TxBufferLength/4) + 1));
两次数据包之间间隔了10ms,超过了驱动IC的复位时间。

0.jpg

Re: 【求助】ZS系列SPI使用问题

Posted: 2025年 Jun 26日 17:53
by shiliang

可尝试.csControl=spidrvCsControlApplication;

并在传输前后手动控制片选信号:
GPIO PinOutClear(SPI CS PORT,SPI CS PIN);// 拉低CS
SPIDRV MTransmitB(&tSpiDrvHandle,u8TxBuffer,len1);
SPIDRV MTransmitB(&tSpiDrvHandle,u8TxBuffer + len1, len2);
GPIO PinOutSet(SPI CS PORT, SPI CS PIN);


Re: 【求助】ZS系列SPI使用问题

Posted: 2025年 Jun 26日 21:31
by xiaoluo

您好!我按照你你说的,加上这个控制,并没有生效, 两帧数据之间还是有10ms 的间隔, 而且我发现,采用frameLength = 16; 每次发送数据,前面的波形会错乱

13.jpg