两次SPI.write()调用之间的延迟

时间:2018-09-26 10:12:06

标签: c++ spi mbed

我正在使用RedBearLabs Blend V2与SPI外设通信。此时一切正常,我正在使用SPI.write()接收预期的数据并捕获返回值。 SPI总线在模式0下以1 MHz运行。

下图显示了连接到示波器的SPI总线。迹线1是SCLK,迹线2是MISO,迹线3是MOSI,迹线4是CS。如您所见,我有4个SCLK脉冲,而CS为低电平,每个脉冲的长度为8位,每个脉冲之间的延迟约为20 µs。 理想情况下,我需要完全缓解20 µs的延迟,并具有32个周期的 1个SCLK突发脉冲

Scope grab of SPI bus

下面的代码是我目前如何实现在示波器抓斗中看到的内容。

int16_t MAX1300::sampleChannel(uint8_t channel, uint8_t inputMode, uint8_t adcMode) 
{    
    int16_t sample;
    int8_t hi = 0;
    int8_t lo = 0;

    MAX1300::InputWord_u word;
    word.bits.start = 0b1;

    if (inputMode == MAX1300::SINGLE_ENDED) {
        word.bits.select = (Channels_se_e)channel;    
    } else {
        word.bits.select = (Channels_dif_e)channel;   
    }   
    word.bits.payload = 0b0000;

    if (adcMode == MAX1300::EXT_CLK) {
        m_cs = 0;
        m_spiBus.write(word.all);
        m_spiBus.write(7);
        hi = m_spiBus.write(0);
        lo = m_spiBus.write(0);
        m_cs = 1; 
    }

    sample = ((int16_t)hi << 8) | lo;  
    return sample; 
}

到目前为止,我尝试设置SPI.format(16, 0)的目的是使2个SCLK突发达到16个周期,但是如果这样做,SPI总线将不再起作用。如果我将SPI.transfer()与32位缓冲区一起使用-没有SPI总线,也会发生同样的情况。

我能够提高总线频率,从而减少每个SCLK突发之间的延迟,但是由于该设备的最终应用,这并不是真正合适的解决方案。

在这里我在做什么错,或者我试图用这种硬件/固件组合做不到的事情?

谢谢,亚当

0 个答案:

没有答案