This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC1310: SPI master 操作过程中, 每传送 8拍时钟, 间隔2拍以后, 再传送 下一组 8拍时钟 (它们 共享 一个 CSn 低脉冲)

Part Number: CC1310

直接调用 CC1310 的 SPI 函数库(也将 minDmaTransferSize 修改为 1 了), 如果 一次写 5个字节, 示波器显示, 在一个 CSn 为低电平的 状态下, 会有 8*5个 连续的 时钟脉冲 ( 它们 没有间隔,SPI 效率更好)
但是,我们 当前的一个 实际电路, 有一个 元器件,  当 CC1310 使用 SPI 向它 写 5个 字节 过程中,  需要 每8拍 时钟,  都要间隔 至少2拍,  然后再 传送 下一组 8拍 时钟。
请问一下, 修改 CC1310 的 SDK 哪个文件的 哪个地方, 可以实现 这个 增加 间隔的  功能?------ 实现以后的 示波器 波形, 大致 类似 下面的 图片。
备注:前面 也请教过 其它 类似的 修改: minDmaTransferSize 默认是 10, 修改为1了, 则 一个 CSn 为低电平, 可以连续 送出 8*N 个 时钟脉冲。 主要是 请教 在 哪个文件 哪个位置 哪个 变量 做 修改。谢谢啊 !

  • 您好我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!

  • 补充一下  CC1310 默认 SPI 的 波形图。它的 时钟信号,是 连续的,没有 间隔。

  • 好的哈,我们收到了,一起反馈给工程师看下。

  • 您好,

    可以通过使用 GPIO 手动控制 CS 引脚并使用单独的 SPI_transfer 一次发送一个字节来实现。 使用此方法,您无需修改 SDK 中的 SPI 驱动程序代码。

    在 CC1310_LAUNCHXL.c 内的 SPI 驱动器中未分配 CSn 引脚如下:

    const SPICC26XXDMA_HWAttrsV1 spiCC26XXDMAHWAttrs[CC1310_LAUNCHXL_SPICOUNT] = {
        {
            .baseAddr           = SSI0_BASE,
            .intNum             = INT_SSI0_COMB,
            .intPriority        = ~0,
            .swiPriority        = 0,
            .powerMngrId        = PowerCC26XX_PERIPH_SSI0,
            .defaultTxBufValue  = 0xFF,
            .rxChannelBitMask   = 1<<UDMA_CHAN_SSI0_RX,
            .txChannelBitMask   = 1<<UDMA_CHAN_SSI0_TX,
            .mosiPin            = CC1310_LAUNCHXL_SPI0_MOSI,
            .misoPin            = CC1310_LAUNCHXL_SPI0_MISO,
            .clkPin             = CC1310_LAUNCHXL_SPI0_CLK,
            .csnPin             = PIN_UNASSIGNED, // <- csn pin controlled by software
            .minDmaTransferSize = 10
        },

    工程师在 spimaster 示例中尝试了以下代码: 

        /* Initialize master SPI transaction structure */
        txChar = masterTxBuffer[0];
        transaction.count = 1;
        transaction.txBuf = (void *) &txChar;
        transaction.rxBuf = (void *) masterRxBuffer;
    
        // deassert CS pin
        GPIO_write(Board_SPI_MASTER_CSn, 0);
        
        for (i = 0; i < SPI_MSG_LENGTH; i++){
            txChar = masterTxBuffer[i];
            transferOK = SPI_transfer(masterSpi, &transaction);
            if (!transferOK) {
                while(1){};
            }
        }
        
        // assert CS pin
        GPIO_write(Board_SPI_MASTER_CSn, 1);

    并在逻辑分析仪上获得以下事务: 

    每个字节事务之间的间隔最终介于11和12us 之间。 在不修改 SPI 驱动程序代码的情况下、很难实现更严格的字节间间隔。

    您请参考以上答复。

  • 每个字节 8-bit 的 间隔有 11~12us, 太慢了。 我们的实际电路,对于 SPI 需要使用 4M 那种速率。

    请问一下, “SDK 中的 SPI 驱动程序代码”,对应的 文件名字,可否帮忙 告诉我一下? 谢谢啊!

  • 我们跟进给工程师看看。

  • 您好,

    CC1310的 SPI 驱动程序代码位于<sdk>/source/ti/drivers/SPI.h 和 SPI.c 中。特定于器件的代码位于<sdk>/source/ti/drivers/spi/SPICC26XX.h 和 SPICC26XX.c 中。 如果您想要进行更low-level的操作,那么就必须修改 driverlib 中的 SSI 模块,该驱动程序位于<sdk>/source/ti/devices/cc13x0/driverlib/ssi.h 和 ssi.c 。

  • 上图中, 将 SPI 配置为 DMA 模式, 配置时钟 8M, 配置 SPI_POL0_PHA0,  示波器 显示 两组 8-bit 间隔 256ns(大致 2拍 8M 时钟)
    请问一下, 修改哪个 参数, 可以让 上面的 间隔  扩大为 4拍 8M 时钟 ?

    如果 不使用 DMA 模式,  间隔 是 1.38us (大致 11拍 8M 时钟),  还是 比较大。  我需要 8-bit  间隔 4拍 8M 时钟。  谢谢啊!

    备注:上面的波形图, 是参照着 spimaster 的尝试代码, 使用一个 IO 产生 CSn 信号。 对于 SPI 的配置 如下:
       spiParams.transferMode = SPI_MODE_BLOCKING; //
       spiParams.dataSize = 8; // 8-bit data size
       spiParams.mode = SPI_MASTER; //SPI MASTER
       spiParams.frameFormat = SPI_POL0_PHA0;
       spiParams.bitRate = 8000000;

  • 好的我们反馈给工程师看下。

  • 您好,

    在 DMA 模式下设置传输时,一旦事务开始,驱动程序将不会干扰 SPI 模块。DMA 硬件模块将自动在 SPI TX FIFO 中加载字节,并且 SPI IP 将会以允许的尽快的速度传输数据。但SPI 模块没有参数或硬件配置可让您选择连续字节之间的时间间隔(在 SSI 模块的 TRM 中找不到与此相关的任何设置)。上次 POST 的记录时间间隔源自一个字节和下一个字节之间的代码执行时间。因此我们的器件并不支持您的用例。您必须使用~2个时钟周期(DMA 事务)、~11个时钟周期(非 DMA 事务)或实施缩减版本的 SPI 驱动器,以便能够进行更精确的计时控制。