2

.NET Micro Framework 设备(在本例中为 ChipworkX)通过SPI接口向PIC18F发送一个字节。启用后,在PIE1bits.SSPIE中断时执行以下代码:

void high_isr (void)
{
     PIE1bits.SSPIE = 0;
     PIR1bits.SSPIF = 0; //Clear interrupt flag.
     LATDbits.LATD5 = 1; //Enables LED for high interrupt activity.
     while ( !SSPSTATbits.BF ); //Wait until cycle complete
     red_byte_array[1] = SSPBUF;
     SSPBUF = 0x00;
     LATDbits.LATD5 = 0;
     PIE1bits.SSPIE = 1;
}

当多次发送相同的字节时,数据似乎并没有被一致地读取。主机和从机都设置为时钟空闲低电平,数据时钟在上升沿。我不使用片选线,因为它是直接通信。最后,主机以 100 kHz 发送数据,而 PIC 以 8 MHz 运行。

如何改进和/或修复此代码?

4

2 回答 2

2

PIC16F886/7上:

如果您不使用/SS,则数据在上升沿发生变化并在下降沿采样,在 0: ,(或),SCK处空闲。CKE = 0CKP = 01SMP = 0

从移位寄存器移动到缓冲寄存器的字节会导致BF位和SSPIF中断,因此您通常不会在等待的中断中循环BF

不需要禁用SSP中断 ( SSPIE = 0),但您可能需要SSPIF在从中断返回之前清除 。

我猜你应该在SSP中断(SSPIF = 1)时:

red_byte_array[x] = SSPBUF
SSPIF = 0

您可能需要检查WCOL和检查SSPOV错误。

于 2011-03-06T00:37:51.727 回答
0

鉴于您的 PIC 只有(8 MHz / 100 kHz)80 个周期来响应,因此 Delay1KTCYx() 似乎相当长。

于 2010-10-26T13:37:09.490 回答