CH347的spi接口中cs与sck间时间过长问题

用示波器观察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接口访问可以达到较高的效率,如下所示:

image.png


你说的“通过单独的片选函数手动拉片选产生的延迟时间”是指用CH347SPI_SetChipSelect函数吗?

在demo工程里其仅仅在CH347DLL.H有定义,但实际并没有调用过该函数哦。

上述测出的50us是直接用CH347Demo.exe测出的哦,是哪里配置错了吗?

微信截图_20240311194058.png


新建文件0.jpg  蓝色CS 黄色SCK, 不但前面有约50us时间间隔,后面还有约80us的时间间隔。


您好,可以添加我们技术支持微信,协助您看下代码上的使用问题。方式已私信。


你好,我也碰到一模一样的问题,沁恒官方能不能给个方案公布出来。不要老是解决方案说到一半,藏着掖着。有意义吗。。。

产品用的好,大家会多使用的。。。。



TECH39

您好,如上间隔时间为通过单独的片选函数手动拉片选产生的延迟时间,芯片同时支持硬件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;

    }





只有登录才能回复,可以选择微信账号登录