.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运行。
如何改进和/或修复此代码?
答案 0 :(得分:2)
在 PIC16F886 / 7 :
上如果您没有使用/SS
,则数据会在上升沿发生变化,并在下降沿进行采样,SCK
空闲时为0:CKE = 0
,{{ 1}}(或CKP = 0
),1
。
从移位寄存器移位到缓冲寄存器的字节导致SMP = 0
位和BF
中断,因此在等待SSPIF
的中断中通常不会循环。< / p>
不需要禁用BF
个中断(SSP
),但您可能需要在从中断返回之前清除SSPIE = 0
。
我猜你应该在SSPIF
打断(SSP
):
SSPIF = 1
red_byte_array[x] = SSPBUF
您可能需要检查SSPIF = 0
和WCOL
是否有错误。
答案 1 :(得分:0)
鉴于你的PIC只有(8 MHz / 100 kHz)80个响应周期,所以Delay1KTCYx()似乎相当长。