我已经让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
答案 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;
设置相同的位。