使用NETMF SPI主机到PIC18F4550从机同步(C18)

时间:2010-10-26 13:07:48

标签: c serial-port interrupt .net-micro-framework pic18

.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运行。

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

2 个答案:

答案 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 = 0WCOL是否有错误。

答案 1 :(得分:0)

鉴于你的PIC只有(8 MHz / 100 kHz)80个响应周期,所以Delay1KTCYx()似乎相当长。