PIC18F26Q43 SPI 从机不接收数据
Posted
技术标签:
【中文标题】PIC18F26Q43 SPI 从机不接收数据【英文标题】:PIC18F26Q43 SPI Slave does not receive data 【发布时间】:2021-05-13 02:57:54 【问题描述】:我希望两个 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++];
【问题讨论】:
【参考方案1】:这是一个经典。要正确使用数字 IO,您必须清除多路复用模拟输入的相应 ANSEL 位。我希望 MCC 为我做这件事,但在这种情况下并没有发生。所以:请务必仔细检查 TRIS 和 ANSEL 是否设置正确。
【讨论】:
以上是关于PIC18F26Q43 SPI 从机不接收数据的主要内容,如果未能解决你的问题,请参考以下文章