我一直在研究以16 MHz运行的PIC18F45k20并将其用作SPI从器件。我发现无论主时钟的SPI时钟速率(SCK)如何,我总是要在SPI字节之间添加一个显着的延迟(~64 us)以避免SPI冲突或接收溢出。如果没有延迟和非常慢的SPI时钟速率,95%的SPI数据包将通过而不会发生冲突或溢出。
在线帖子让我认为这可能是这个以及其他PIC18处理器的“特性”。
我在没有中断的情况下测试了PIC18,具体如下:
if (SSPSTATbits.BF)
{
DataIn = SSPBUF;
SSPBUF = DataOut;
}
还使用中断测试并看到了同样的挑战。
让我想知道它是不是真的无法正确检测SPI时钟。
答案 0 :(得分:0)
如果您要进行示波器检查,以确保在PIC输出最后一个SPI数据字节之前没有释放芯片选择。在释放芯片选择线之前,需要等待SPI忙位。
答案 1 :(得分:0)
我知道PIC18是一个8位微控制器,虽然你可以很容易地发现它的整数变量被映射到16位。但SPI使用8位数据。这意味着如果您的主设备发送超过8位的微控制器,例如16位,则SPI模块中会发生溢出,并且不再响应主时钟。因此在从模式下,确保来自主站的数据具有8位结构。但如果pic18是SPI连接中的Master,即使它的从设备发送16位数据,pic18在第一个8bit之后保持时钟数据并等待其缓冲区读取并为下一个8bit清空。
答案 2 :(得分:0)
我也遇到过这个问题,似乎应该考虑的一点是,受支持的SPI简单说明了MCU能够以多快的速度将一个字节接收到SSPBUF中。
从SSPBUF读取此字节并将其存储在缓冲区中将需要一些工作,例如增加指针等,这将需要一些时间。这就是减少多字节SPI的实际SPI带宽的原因。