PIC18F26Q43 SPI Slave未接收到数据



我想要两个PIC18通过SPI进行通信。从机具有具有fifo和单独的RX和TX寄存器的新SPI模块。由于某种原因,我收不到数据。我想我错配置了模块。我还使用SS中断来准备转移。在芯片选择上,我交换缓冲区并初始化计数器。这部分是有效的。我还在示波器上看到了主机的时钟和数据信号。但是,不触发TX和RX的中断。

配置如下:

void spiInit() {

spiTransferComplete = 0;
// Chip not ready
CR=1;
// clear EN 
SPI1CON0bits.EN=0;
// Set PPS     
SPI1SSPPS=0b00000110; // SS  RA6 > Chip select input            
SPI1SCKPPS=0b00001010; // SCK > RB2
SPI1SDIPPS=0b00001011; // SDI > RB3
RB4PPS=0x32; // SDO > RB4 
TRISB2=1;
TRISB3=1;    
SPI1CON0=0b00000000; // EN=0, LSBF=0, MST=0, BMODE=0
SPI1CON1=0b00000100; // SMP=0, CKE=0, CKP=0, SSP=1, SDI=0, SDO=0
SPI1CON2=0b00000011; // SSET=0, TXR=1, RXR=1
// Interrupts
SPI1INTEbits.SOSIE=1;
SPI1INTEbits.EOSIE=1;
SPI1INTEbits.SPI1EOSIE=1;
SPI1INTEbits.SPI1SOSIE=1;
SPI1INTEbits.RXOIE=1;
PIE3bits.SPI1IE=1;
PIE3bits.SPI1RXIE=1;
PIE3bits.SPI1TXIE=1;
// enable EN 
SPI1CON0bits.EN=1;

}

,这是中断例程:

void spiInterruptHandler() {
// Start SS
if (SPI1INTEbits.SPI1SOSIE==1 && SPI1INTFbits.SPI1SOSIF==1) {
switchSpiBuffer(); // prepare sending

spiSendCsr=1;
spiRecvCsr=0; 

spiRecv.pck.U1len=0;
spiRecv.pck.U2len=0;
spiRecv.pck.U3len=0;
spiRecv.pck.U4len=0;        

SPI1TXB=spiSend->cBuf[spiSendCsr]; // preload first byte
CR=0;   // ready to send
SPI1INTFbits.SPI1SOSIF=0;
}
// end of SS
if (SPI1INTEbits.SPI1EOSIE==1 && SPI1INTFbits.SPI1EOSIF==1) {
CR=1;
if (spiTransferComplete)
spiTransferComplete(&(spiRecv.pck));
SPI1INTFbits.SPI1EOSIF=0;
}
// byte received
if (PIR3bits.SPI1RXIF==1) {
spiRecv.cBuf[spiRecvCsr++]=SPI1RXB;
}
// byte sent
if (PIR3bits.SPI1TXIF==1) {
SPI1TXB=spiSend->cBuf[spiSendCsr++];
}    

}

这是一部经典之作。要正确使用数字IO,您必须为多路模拟输入清除相应的ANSEL位。我期望MCC为我做这件事,但在这种情况下,它没有发生。所以:一定要仔细检查TRIS和ANSEL设置是否正确。

最新更新