微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PIC18F26Q43 SPI Slave不接收数据

如何解决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 是否设置正确。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?