【问题标题】:UART RX not working on PIC16F1704UART RX 在 PIC16F1704 上不起作用
【发布时间】:2014-07-03 04:27:54
【问题描述】:

我已经让 UART TX 在一张图片上工作,但无法让 UART RX 在另一张图片上工作。我的计划是让第一个 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 配置。

拉胡尔

【问题讨论】:

  • 您是否启用了中断?如果可以包含更多细节,例如初始化等,任何人都会得到更多的理解。
  • 在这种情况下不需要中断来读取 RCIF 和 TXIF 寄存器,无论如何都设置了它们。

标签: embedded microcontroller pic uart mplab


【解决方案1】:
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),以便它可以读取任何输入的数据。您还应该考虑执行中断程序而不是轮询接收器标志位。这样您就一定不会跳过任何输入数据。

【讨论】:

  • 请看我修改后的代码,我不确定我是否正确使用了PPS uart,我解锁了pps,将RA2PPS 设置为tx 端口,然后锁定了pps。我还将所有相关引脚设置为数字。
  • 获得工作接收器的唯一区别是启用连续接收器位 CREN。 RC1STA = 0b10010000; //启用串口(SPEN)和连续接收(CREN)。确保将 RX 引脚(在您的情况下为 RC5)设置为 INPUT(TRISC5 = 1),以便它可以读取任何输入的数据。您还应该考虑执行中断程序而不是轮询接收器标志位。这样您就一定不会跳过任何输入数据。
  • 感谢您的回复,您的回答与我编辑的代码中的相同。我想知道是否需要设置 TXSTA 和 RCSTA 寄存器(设置位),或者是否可以显式设置 CREN 值?
  • 通常,设置寄存器对您来说会更容易,因为您不会跳过任何特定位(例如 TXSTA 中的 TXEN),我一直这样做,而且大多数时候更容易在看到写入寄存器的值后立即进行调试,您可以依靠数据表查看这是否是您所需操作的正确值。在您的 uart 接收例程中,使用连接到该端口的 LED 进行轮询,以查看是否有任何活动。你用的是两张相同的照片?相同的波特率?也许您启用了中断并且它卡在那里?
【解决方案2】:

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

【讨论】:

  • 我已将相关引脚设置为数字,问题仍然存在。
【解决方案3】:

您似乎正在对SYNC = 0 使用异步模式,但不要设置TXEN = 1

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

【讨论】:

  • 我将 SYNC = 0 用于异步模式。
  • 我已经让 TX 部分使用上述代码,请参阅编辑,我现在在单独的 PIC 上遇到 RX 代码问题。这个想法是第一个 PIC 将数据发送到第二个 PIC。谢谢。
【解决方案4】:

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

CREN = 1;
SYNC = 0;
SPEN = 1;

设置相同的位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 2018-10-11
    • 2019-01-13
    • 2020-03-23
    • 1970-01-01
    相关资源
    最近更新 更多