NXP MCU 技术william hill官网
直播中

申换换

7年用户 1501经验值
私信 关注
[问答]

RT1176 SPI时钟每8个间隔短路一次怎么解决?

使用 RT1176 进行 SPI 通信,我们确实看到了奇怪的时钟行为:每 8 个时钟信号都非常短。我在下面附上了两张图片,显示每个时钟都会发生这种情况,放大版本显示时钟信号有多短。值得注意的是,数据正确地跟随时钟,所以第 8 位的信号也被缩短了. 在测量中,时钟显示为黄色,SDO 显示为蓝色。
请注意,该线路上的噪声与我们进行测量的位置有关。与 RT1176 的 SPI 通信的其他实例显示相同的行为,即使信号噪声较小。

三字节 SPI 传输。时钟:黄色,SDO:蓝色。用红色箭头标记的缩短信号
放大一个字节传输。第 8 个缩短的时钟标有红色箭头。时钟:黄色。SDO:蓝色

RT1176 SPI 接口设置为主机,参数如下:

{
    uint32_t clock_freq;
    lpspi_master_config_t sdk_spi_config;
    edma_config_t sdk_dma_config;
    uint8_t dma_mux_channel_rx, dma_mux_channel_tx;
    LPSPI_Type* instance;

    //Init SPI
    LPSPI_MasterGetDefaultConfig(&sdk_spi_config);
    instance = LPSPI5;
    clock_freq = CLOCK_GetRootClockFreq(kCLOCK_Root_Lpspi5);
    sdk_spi_config.baudRate = 1000000/2;
    sdk_spi_config.bitsPerFrame = 8;
    sdk_spi_config.cpha = kLPSPI_ClockPhaseFirstEdge;
    sdk_spi_config.cpol = kLPSPI_ClockPolarityActiveLow;
    sdk_spi_config.direction = kLPSPI_MsbFirst;
    sdk_spi_config.pcsToSckDelayInNanoSec = 100;
    sdk_spi_config.lastSckToPcsDelayInNanoSec = 100;
    sdk_spi_config.betweenTransferDelayInNanoSec = 10;
    sdk_spi_config.whichPcs = kLPSPI_Pcs0;
    sdk_spi_config.pcsActiveHighOrLow = kLPSPI_PcsActiveLow;
    sdk_spi_config.pinCfg = kLPSPI_SdiInSdoOut;
    sdk_spi_config.dataOutConfig = kLpspiDataOutTristate;
    instance->CR |= LPSPI_CR_DBGEN_MASK; //enable LPSPI in debug mode
    LPSPI_MasterInit(instance, &sdk_spi_config, clock_freq);


    //Data transfer
    uint8_t buf_tx[9] = {0};
    uint8_t buf_rx[9] = {0};
    lpspi_transfer_t transfer;
    txBuffer[0] = 0x24 | (1 << 7);
    transfer.txData = buf_tx;
    transfer.rxData = buf_rx;
    transfer.dataSize = 9;
    transfer.configFlags = kLPSPI_MasterPcs0 | kLPSPI_MasterPcsContinuous;
    if((retval = LPSPI_MasterTransferBlocking(instance, &transfer)) != kStatus_Success)
    {
        printf("Transfer failed!
");
        if(retval == kStatus_LPSPI_Busy)      printf("kStatus_LPSPI_Busy
");
        if(retval == kStatus_InvalidArgument) printf("kStatus_InvalidArgument
");
        if(retval == kStatus_LPSPI_Timeout)   printf("kStatus_LPSPI_Timeout
");
        return false;
    }
    return true;
}
传输成功,kStatusSuccess由LPSPI_MasterTransferBlocking()返回。我们正在使用最新的 SDK。


更多回帖

发帖
×
20
完善资料,
赚取积分