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 个 时钟脉冲。 主要是 请教 在 哪个文件 哪个位置 哪个 变量 做 修改。谢谢啊 !
Cherry Zhou:
您好我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!
,
user3985772:
补充一下 CC1310 默认 SPI 的 波形图。它的 时钟信号,是 连续的,没有 间隔。
,
Cherry Zhou:
好的哈,我们收到了,一起反馈给工程师看下。
,
Cherry Zhou:
您好,
可以通过使用 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 pinGPIO_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 pinGPIO_write(Board_SPI_MASTER_CSn, 1);并在逻辑分析仪上获得以下事务:
每个字节事务之间的间隔最终介于11和12us 之间。 在不修改 SPI 驱动程序代码的情况下、很难实现更严格的字节间间隔。
您请参考以上答复。
,
user3985772:
每个字节 8-bit 的 间隔有 11~12us, 太慢了。 我们的实际电路,对于 SPI 需要使用 4M 那种速率。
请问一下, “SDK 中的 SPI 驱动程序代码”,对应的 文件名字,可否帮忙 告诉我一下? 谢谢啊!
,
Cherry Zhou:
我们跟进给工程师看看。
,
Cherry Zhou:
您好,
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 。
,
user3985772:
上图中, 将 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;
,
Cherry Zhou:
好的我们反馈给工程师看下。
,
Cherry Zhou:
您好,
在 DMA 模式下设置传输时,一旦事务开始,驱动程序将不会干扰 SPI 模块。DMA 硬件模块将自动在 SPI TX FIFO 中加载字节,并且 SPI IP 将会以允许的尽快的速度传输数据。但SPI 模块没有参数或硬件配置可让您选择连续字节之间的时间间隔(在 SSI 模块的 TRM 中找不到与此相关的任何设置)。上次 POST 的记录时间间隔源自一个字节和下一个字节之间的代码执行时间。因此我们的器件并不支持您的用例。您必须使用~2个时钟周期(DMA 事务)、~11个时钟周期(非 DMA 事务)或实施缩减版本的 SPI 驱动器,以便能够进行更精确的计时控制。