如何在STM32F3上修复SPI的片选时序?

时间:2019-04-08 12:01:41

标签: c++ c arm stm32 spi

我正在使用需要全双工SPI的STM32F303RE进行项目,并且正在使用STM提供的HAL库。当所有线路都在SCK,MOSI和MISO方面工作时,我注意到片选线路的低电平持续时间比必要的更长,并且似乎在20kHz左右触发,而不是2MHz SPI。这是一个问题,因为我正在使用的从设备触发了CS线路的触发,并且在多次SPI调用期间,数据已损坏。我该如何确定时间?

我目前正在使用手动GPIO,该GPIO在SPI调用之前和之后简单地将低电平/高电平设置为低电平。从在线阅读开始,对于很多人来说,CS引脚似乎是问题的根源,尽管人们建议不要这样做,因为它不能正常工作,因此也可以选择使用硬件NSS信号。

@IBOutlet weak var pronunciationLabel: UILabel!
@IBOutlet weak var wordLabel: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()

    contentView.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([
        contentView.leftAnchor.constraint(equalTo: leftAnchor),
        contentView.rightAnchor.constraint(equalTo: rightAnchor),
        contentView.topAnchor.constraint(equalTo: topAnchor),
        contentView.bottomAnchor.constraint(equalTo: bottomAnchor)
    ])
}

我希望CS在SCK之前大约半个周期会走低,之后也会类似。 这些是我可能有的想法:“检查完成”行是否引起了问题?可以是我的时钟设置吗?我使用的GPIO引脚是否应该与NSS相同?我应该使用硬件NSS吗?我需要使用中断和DMA吗?

很抱歉,如果其中任何一个看起来很幼稚,因为我仍在努力理解微控制器。谢谢!

CS and SCK timing

1 个答案:

答案 0 :(得分:0)

我想我可以解释一下CS激活和SPI传输之间的延迟: 如果看一下HAL_SPI_TransmitReceive()的内部,您会发现它实际上需要大量操作才能设置和启动实际的SPI传输。根据您的时钟配置,这很容易花费几微秒的时间(另请参见this question)。

我对SPI传输后直到CS无效的延迟感到有些困惑。与转移准备相比,HAL代码需要更少的操作来完成转移。 “检查完成”代码不需要太多周期,因为它实际上仅检查软件标志(甚至不检查硬件寄存器)。不过,该调用不是必需的,因为HAL_SPI_TransmitReceive()是一个阻塞函数,仅在SPI传输完成后才返回。

关于您的问题,我建议您使用硬件NSS功能。但是,一旦想到,一旦启用了SPI单元,便会断言CS。每次传输后,ST HAL似乎都没有禁用SPI单元-因此,这将无法正常工作。

我认为您需要进一步分析HAL内部发生的实际SPI传输和CS无效之间的情况。这看起来不正常。不必使用中断或DMA来改善CS行为。这些功能会占用CPU的负载,但需要更复杂的代码,这可能不会改善CS延迟。