MPLAB X中PIC18F458的RCREG未捕获串口数据,求正确位发送间隔
问题
在MPLAB X v.5.05中使用SCL文件模拟PIC18F458通过RX引脚接收ASCII字符'Z'(0x5A),当前配置为9600bps波特率、XTAL=10MHz,代码中每位发送间隔设为104us,但RCREG寄存器未捕获到RX引脚上的数据。需明确:为使RCREG识别为有效串口数据帧,应设置怎样的位发送间隔?
当前测试平台SCL代码
testbench for "pic18f458" is begin process is begin loop RX <= '0'; wait for 104 us; RX <= '0'; wait for 104 us; RX <= '1'; wait for 104 us; RX <= '0'; wait for 1042 us; RX <= '1'; wait for 104 us; RX <= '1'; wait for 104 us; RX <= '0'; wait for 104 us; RX <= '1'; wait for 104 us; RX <= '0'; wait for 104 us; RX <= '1'; wait for 104 us; end loop; wait; end process; end testbench;
PIC18F458配置代码
ORG 0000H ; burn into ROM starting at 0 MOVLW B'10010000' ; load wreg with 0x90 MOVWF RCSTA ; enable receive and serial port itself MOVLW D'15' ; load wreg 0xF MOVWF SPBRG ; 9600 bps (Fosc / (64 * Speed) - 1) BSF TRISC, RX ; make RX pin of PORTC an input pin CLRF TRISB ; make PORTB an output port ; get a byte from the serial port and place it on PORTB R1 BTFSS PIR1, RCIF ; check for ready BRA R1 ; stay in loop MOVFF RCREG, PORTB ; send value to PORTB BRA R1 ; keep doing that END
解答
1. 位间隔的正确值计算
9600bps对应单一位的理论持续时间为:1 / 9600 ≈ 104.1667 μs
你当前使用的104us接近理论值,误差在UART接收允许范围内,问题核心不在位间隔本身,而在串口帧格式错误。
2. 串口帧格式修正(关键)
标准异步UART帧格式为:1个起始位(低电平)+ 8个数据位(LSB先传)+ 1个停止位(高电平),你的RCSTA配置为8位无校验,符合该格式。
ASCII 'Z'的十六进制为0x5A,二进制是01011010,因此正确的帧传输顺序应为:
- 起始位:0
- 数据位(从LSB到MSB):0(bit0)、1(bit1)、0(bit2)、1(bit3)、1(bit4)、0(bit5)、1(bit6)、0(bit7)
- 停止位:1
你当前的测试代码帧顺序完全混乱,还存在1042us的超长间隔,会被PIC的UART判定为无效帧。
3. 修正后的测试代码
将所有位的间隔统一设置为104.17μs(或近似104μs),同时按正确帧顺序发送:
testbench for "pic18f458" is begin process is begin loop -- 起始位(低电平) RX <= '0'; wait for 104.17 us; -- 数据位:0x5A的LSB到MSB依次传输 RX <= '0'; wait for 104.17 us; -- bit0 RX <= '1'; wait for 104.17 us; -- bit1 RX <= '0'; wait for 104.17 us; -- bit2 RX <= '1'; wait for 104.17 us; -- bit3 RX <= '1'; wait for 104.17 us; -- bit4 RX <= '0'; wait for 104.17 us; -- bit5 RX <= '1'; wait for 104.17 us; -- bit6 RX <= '0'; wait for 104.17 us; -- bit7 -- 停止位(高电平) RX <= '1'; wait for 104.17 us; -- 帧间空闲(可选,保持高电平即可) wait for 104.17 us; end loop; wait; end process; end testbench;
4. 额外验证点
- SPBRG配置正确:10MHz晶振+64分频下,SPBRG=(10000000/(64*9600))-1≈15.27,取整数15符合要求,波特率误差在接收容忍范围内。
- RCSTA配置正确:
MOVLW B'10010000'已置位SPEN(串口使能)和CREN(接收使能),无需调整。
内容的提问来源于stack exchange,提问作者aLoHa
相关产品推荐
相关产品推荐

