You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:55:31