UART RX无法在PIC16F1704上工作

时间:2014-07-03 04:27:55

标签: embedded microcontroller pic uart mplab

我已经让UART TX工作在一张图片上,但无法让UART RX在另一张PIC上工作。我的计划是让第一个PIC向第二个PIC发送数据。

第一个PIC TX的初始化代码是,

代码:

void configure_TX_port(){
    /*Port configurations*/
    OSCCON = 0X68;
    //Push button
    TRISC3 = 1;
    INLVLC3 = 0;
    ANSC3 = 0;
    //Led output
    TRISC2 = 0;
    //TX output
    TRISA2 = 0;   
    ANSA2 = 0;

    /*PPS setup for RA2*/
    PPSLOCK = 0x55;
    PPSLOCK = 0xAA;
    PPSLOCK = 0;
    RA2PPS = 0x14;
    PPSLOCK = 0x55;
    PPSLOCK = 0xAA;
    PPSLOCK = 1;

    /*UART configuration*/
    TXEN = 1;
    SYNC = 0;
    SPEN = 1;

    TXSTA = (0x4|0x20);
    SPBRG = (int)(4000000L/(16UL * 9600) -1);
}

我将数据发送到tx代码是

代码:

void putch(unsigned char byte) {
    /* output one byte */
    while (!TXIF) /* set when register is empty */

    TXREG = byte;
}

我的第二个PIC RX的初始化代码是,

void configure_RX_port(){
    /*Port configurations*/
    OSCCON = 0X68;
    //Led output
    TRISC3 = 0;
    //RX input
    TRISC5 = 1;
    ANSC5 = 0;

    /*UART configuration*/
    CREN = 1;
    SYNC = 0;
    SPEN = 1;
    TXSTA = (0x4|0x20);
    RCSTA = 0x90;
    SPBRG = (int)(4000000L/(16UL * 9600) -1);
}

我的接收数据代码是,

unsigned char getch(void) {
    /* retrieve one byte */
    unsigned char ret;
    while (!RCIF) {  /* set when register is not empty */
    }
    ret = RCREG;
    return ret;
}

当我调试代码时,getch函数被阻塞等待一个字符但我的其他PIC正在发送数据。在这个PIC RC5是一个指定的RX引脚,所以我不认为我必须做任何pps配置。

的Rahul

4 个答案:

答案 0 :(得分:0)

您希望将异步模式与SYNC = 0一起使用,但不要设置TXEN = 1

设置CREN = 1仅在同步模式下覆盖TXEN。尝试设置TXEN = 1

答案 1 :(得分:0)

默认情况下,复位时PIC16F1704上的所有引脚都设置为模拟。 因此,在寄存器ANSELA,ANSELB和ANSELC中清除相应的RX和TX引脚位,以将其设置为数字。

答案 2 :(得分:0)

TX1STA = 0b00100100; This enablex TX (TXEN=1) and high baud rate (BRGH = 1)

RC1STA = 0b10000000; This enable the serial port (SPEN = 1)

唯一重要的缺失部分是您的时钟设置和您想要的波特率。

我在公式中看到了4000000,意味着4MHz,和/ 9600,所以假设为9600BDS。

结果= 0x25。

SPBRGL = 0x25; 

SPBRGH = 0;

这样,您的TX应该有效。你的tx功能很好。

确保通过禁用ANSELA,ANSELB和ANSELC将RX和TX引脚配置为DIGITAL。 您的PIC也使用PPS,因此请务必正确配置。

*********编辑发布,接收条件************

获得工作接收器的唯一区别是启用连续接收器 位,CREN。

RC1STA = 0b10010000; //Enable serial port(SPEN) and continuous receive(CREN)

确保将RX引脚(在您的情况下为RC5)设置为INPUT(TRISC5 = 1),以便它可以读取任何输入数据。您还应该考虑执行中断例程,而不是轮询接收器标志位。这样你肯定不会跳过任何输入数据。

答案 3 :(得分:0)

我添加了以下行,TXSTA =(0x4 | 0x20);到接收器PIC代码,它现在工作。

没有必要
CREN = 1;
SYNC = 0;
SPEN = 1;

设置相同的位。