【问题标题】:Issues using PIC18 as an SPI slave使用 PIC18 作为 SPI 从设备的问题
【发布时间】:2013-01-26 01:22:27
【问题描述】:

我一直在研究以 16 MHz 运行的 PIC18F45k20,并将其用作 SPI 从设备。我发现无论来自主机的 SPI 时钟速率 (SCK) 如何,我总是必须在 SPI 字节之间添加一个显着的延迟(~64 us)以避免 SPI 冲突或接收溢出。在没有延迟和非常慢的 SPI 时钟速率的情况下,95% 的 SPI 数据包将通过而不会发生冲突或溢出。

在线帖子让我认为这可能是该处理器和其他 PIC18 处理器的“功能”。

  1. 其他人是否观察到了同样的从属“特征”?
  2. 如果这是一项“功能”,是否在所有 PIC18 处理器中都可以找到?

我在没有中断的情况下测试了 PIC18:

if (SSPSTATbits.BF)
{
  DataIn = SSPBUF;
  SSPBUF = DataOut;
}

还使用中断进行了测试,发现了同样的挑战。

让我怀疑它是否没有真正正确地检测到 SPI 时钟。

【问题讨论】:

  • PIC18F45k20数据表/参考手册的SPI章节有相关时序图吗?
  • 最经典的 SPI 问题是时钟偏差,它会导致许多奇怪的错误。您是否绝对确定主机和从机使用 1) 相同的时钟极性和 2) 相同的时钟相位(在时钟边沿或边沿 + 延迟上触发)?
  • 我已经测试了所有 4 种基本的 spi 配置。在每种情况下它都有效,但在每种情况下都需要冗长的(相对而言)事务间延迟。

标签: embedded pic


【解决方案1】:

如果您有示波器检查以确保在 PIC 输出最后一个 SPI 数据字节之前没有释放片选。在释放片选线之前,您需要等待 SPI 忙位。

【讨论】:

    【解决方案2】:

    据我所知,PIC18 是一个 8 位微控制器,尽管您可以很容易地发现它的整数变量被映射到 16 位。但是 SPI 适用于 8 位数据。这意味着如果您的主控发送此微控制器超过 8 位,例如 16 位,则 SPI 模块会发生溢出,无法再响应主控时钟。所以在从机模式下,请确保来自主机的数据具有 8 位结构。但是如果 pic18 是 SPI 连接的 Master,即使它的 slave 发送 16bit 数据,pic18 在第一个 8bit 之后保持时钟数据,并等待它的缓冲区读取并为下一个 8bit 清空。

    【讨论】:

      【解决方案3】:

      我也遇到过这个问题,似乎应该考虑的是,受支持的 SPI 简单告诉 MCU 可以多快将 一个 字节接收到 SSPBUF。

      从 SSPBUF 读取此字节并将其存储在缓冲区中将需要一些工作,例如递增指针等,这将需要一些时间。这就是减少多字节 SPI 的实际 SPI 带宽的原因。

      【讨论】:

        猜你喜欢
        • 2012-05-28
        • 2021-12-09
        • 2021-02-13
        • 1970-01-01
        • 1970-01-01
        • 2017-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多