用示波器观察spi的cs和sck,发现cs下降沿到sck第一个下降沿间的时间约有50us,
尝试修改过时钟速率(60M/30M/15M等),CS0或者CS1、ActiveCS RW delay、Deactive CS RW delay都没有直接影响 ,
这个50us的时间间隙对传输速率影响较大,想确定一下是芯片本身就是如何还是说在使用CH347T上位机Demo软件设置的问题?
用示波器观察spi的cs和sck,发现cs下降沿到sck第一个下降沿间的时间约有50us,
尝试修改过时钟速率(60M/30M/15M等),CS0或者CS1、ActiveCS RW delay、Deactive CS RW delay都没有直接影响 ,
这个50us的时间间隙对传输速率影响较大,想确定一下是芯片本身就是如何还是说在使用CH347T上位机Demo软件设置的问题?
您好,如上间隔时间为通过单独的片选函数手动拉片选产生的延迟时间,芯片同时支持硬件SPI自动拉片选的操作。使用硬件SPI控制片选时间精度可控制在5us以内。
假设当前spi时钟为60MHz,以传输512Byte为例,其传输时间约为65us,而这个cs跟sck的间隔都有50us,
即512Byte实际使用了至少 115us,这使得实际有效传输效率降低了几乎一半呀~~~~
对此,该有什么办法可以提高传输效率吗?
1、增大传输包数量?
2、不使用CS?
3、SPI转usb的极限最大传输速率(理想情况下),有测过吗?
谢谢
您好,如上信息已更正,参见#2,使用硬件SPI接口访问可以达到较高的效率,如下所示:
你说的“通过单独的片选函数手动拉片选产生的延迟时间”是指用CH347SPI_SetChipSelect函数吗?
在demo工程里其仅仅在CH347DLL.H有定义,但实际并没有调用过该函数哦。
上述测出的50us是直接用CH347Demo.exe测出的哦,是哪里配置错了吗?
蓝色CS 黄色SCK, 不但前面有约50us时间间隔,后面还有约80us的时间间隔。
您好,可以添加我们技术支持微信,协助您看下代码上的使用问题。方式已私信。
你好,我也碰到一模一样的问题,沁恒官方能不能给个方案公布出来。不要老是解决方案说到一半,藏着掖着。有意义吗。。。
产品用的好,大家会多使用的。。。。
您好,如上间隔时间为通过单独的片选函数手动拉片选产生的延迟时间,芯片同时支持硬件SPI自动拉片选的操作。使用硬件SPI控制片选时间精度可控制在5us以内。
无法解决吗?是这样的,read的延迟很久,但是write却很快
CH347T/F 的SPI片选机制支持芯片自己控制片选以及上位机单独控制片选,两种方式。
如测试中遇到收发速率不够快,应该是因为使用的API函数使用了上位机片选的控制方式。您可使用接口函数:CH347SPI_WriteRead
,参数 ignoreCS 设置为false,在SPI模式0下看下速度。正常如:30MHz时钟,正常可以达到2.5MB↑。
注:CH347SPI_WriteRead 因底层会采用自动片选控制方式,其收发效率最优。范例:
注:以下 SPI 设置 Clock 时钟为 30MHz,MOSI 和 MISO 短接回环测速。
bool CH347_SPI_Init()
{
bool ret;
mSpiCfgS SpiCfg = { 0 };
/* set spi interface in [mode3] & [30MHz] & [MSB] & output [0xFF] by default */
SpiCfg.iMode = 0x03;
SpiCfg.iByteOrder = 1;
SpiCfg.iSpiOutDefaultData = 0xFF;
SpiCfg.iChipSelect = 0x80;
CH347SPI_SetFrequency(ch347device.fd, 30e6);
/* set spi to 16bits transfer */
CH347SPI_SetDataBits(ch347device.fd, 0);
/* init spi interface */
ret = CH347SPI_Init(ch347device.fd, &SpiCfg);
if (!ret) {
printf("Failed to init SPI interface.\n");
return false;
} else {
printf("SPI Init ok.\n");
}
return true;
}
void ch347_spi__pressure_test()
{
bool ret = false;
int len;
int i;
uint8_t tBuffer[0x1000] = { 0 };
uint8_t rBuffer[0x1000] = { 0 };
int count = 0;
ret = CH347_SPI_Init();
if (ret == false) {
printf("Failed to init CH347 SPI interface.\n");
return;
}
printf("CH347 SPI interface init succeed.\n");
retry:
len = 4000;
ret = CH347SPI_WriteRead(ch347device.fd, false, 0x80, len, rBuffer);
if (ret == false) {
printf("Failed to CH347SPI_WriteRead.\n");
return;
}
// 以下判断为 SPI Loopback 模式下,SPI发送数据接收回来进行比对。
if (memcmp(tBuffer, rBuffer, len)) {
printf("SPI data comare error!!! (len = %d)\n\n", len);
printf("TX data:\n");
for (i = 0; i < len; i++) {
printf("0x%2x ", tBuffer[i]);
}
printf("\n");
printf("RX data:\n");
for (i = 0; i < len; i++) {
printf("0x%2x ", rBuffer[i]);
}
printf("\n");
return;
} else {
printf("spi loopback ok (len = %d), count: %d\n", len, count);
g_bytes_read += len;
}