Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Embedded 使用PIC18作为SPI从设备的问题_Embedded_Pic - Fatal编程技术网

Embedded 使用PIC18作为SPI从设备的问题

Embedded 使用PIC18作为SPI从设备的问题,embedded,pic,Embedded,Pic,我一直在开发一款运行频率为16 MHz的PIC18F45k20,并将其用作SPI从机。我发现,无论来自主机的SPI时钟速率SCK如何,我都必须在SPI字节之间添加一个显著的延迟~64 us,以避免SPI冲突或接收溢出。在没有延迟和非常慢的SPI时钟速率的情况下,95%的SPI数据包将在没有冲突或溢出的情况下通过 在线帖子让我想到这可能是PIC18处理器和其他处理器的一个特点 其他人是否观察到了同样的从属“特征”? 如果这是一项“功能”,是否在所有PIC18处理器中都能找到? 我在没有中断的情况下

我一直在开发一款运行频率为16 MHz的PIC18F45k20,并将其用作SPI从机。我发现,无论来自主机的SPI时钟速率SCK如何,我都必须在SPI字节之间添加一个显著的延迟~64 us,以避免SPI冲突或接收溢出。在没有延迟和非常慢的SPI时钟速率的情况下,95%的SPI数据包将在没有冲突或溢出的情况下通过

在线帖子让我想到这可能是PIC18处理器和其他处理器的一个特点

其他人是否观察到了同样的从属“特征”? 如果这是一项“功能”,是否在所有PIC18处理器中都能找到? 我在没有中断的情况下对PIC18进行了以下测试:

if (SSPSTATbits.BF)
{
  DataIn = SSPBUF;
  SSPBUF = DataOut;
}
还使用中断进行了测试,并看到了相同的挑战


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

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

正如我所知,PIC18是一个8位微控制器,尽管您很容易发现它的整数变量映射到16位。然而,SPI可以处理8位数据。这意味着,如果您的主控制器向该微控制器发送的数据超过8位,例如16位,则SPI模块中会发生溢出,无法再响应主时钟。因此,在从属模式下,确保来自主服务器的数据具有8位结构。但如果pic18是SPI连接中的主设备,即使其从设备发送16位数据,pic18在第一个8位之后保存时钟数据,并等待其缓冲区读取并清空,等待下一个8位。

我也遇到了这个问题,似乎应该考虑的是,支持的SPI simple告诉MCU可以以多快的速度将一个字节接收到SSPBUF


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

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