This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

P89LPC932 Auto Buad Detect

My project uses a P89LPC932 @ 11.0592 MHz
and CCLK equal to Fosc (11.0592MHz).

UART uses BGRG1:BGRG0 as Baud Rate Generator.

Buad = CCLK/((BRGR1,BRGR0)+16)

I want to mensurate width of pulse by ICA of CCU. A series pulses comes from a 'U' (55 HEX).

When Down edge of Start Bit comes, ICA capture first value T1.

When Up edge of First Data Bit comes, ICA capture second value T2.

So we have got a Count , Count = T2 - T1.

My question :

How can we set BGRG1:BGRG0 from Count ?

e.g. BGRG1:BGRG0 = Count * x +/- y ?

Parents
  • Your functional description states:
    "My target MCU who sended 'U' will send 'U'
    always until P89LPC93 get correctly BAUD.
    After P89LPC93 has got correctly BAUD, it
    send 0xAA to my target MCU."

    I am sorry for my description, it shoulds be following :

    There are a few MCU at bus, and every MCU
    has a individual Address Word, 01, 02,
    03 ... FF. My MCU is a tester, it inits MCU
    by Address Word @ 5 bps. After the
    corresponding MCU received it's Address
    Word, it send a series, e.g. 55 xx yy @ xxxx
    bps . 55 for Baud Detect. it repeats three
    times only (not always, I am sorry).
    
    After Received Address Word,Delay 30 ms,
    sends 55 xx yy ; Delay 30 ms, Wait Ack of my
    MCU , if not or Baud Error, then sends 55 xx
    yy again; then Delay 30 ms, Wait Ack of my
    MCU , if not or Baud Error, then sends 55 xx
    yy again, and Wait ....
    
    
    if No reply from My MCU, and Communication
    building Fail !
    
    

    So We must Detect Baud of MCU addressed immediately.

    if We can get Count = T2 - T1, and set BGRGx
    from Count, it is fast !

Reply
  • Your functional description states:
    "My target MCU who sended 'U' will send 'U'
    always until P89LPC93 get correctly BAUD.
    After P89LPC93 has got correctly BAUD, it
    send 0xAA to my target MCU."

    I am sorry for my description, it shoulds be following :

    There are a few MCU at bus, and every MCU
    has a individual Address Word, 01, 02,
    03 ... FF. My MCU is a tester, it inits MCU
    by Address Word @ 5 bps. After the
    corresponding MCU received it's Address
    Word, it send a series, e.g. 55 xx yy @ xxxx
    bps . 55 for Baud Detect. it repeats three
    times only (not always, I am sorry).
    
    After Received Address Word,Delay 30 ms,
    sends 55 xx yy ; Delay 30 ms, Wait Ack of my
    MCU , if not or Baud Error, then sends 55 xx
    yy again; then Delay 30 ms, Wait Ack of my
    MCU , if not or Baud Error, then sends 55 xx
    yy again, and Wait ....
    
    
    if No reply from My MCU, and Communication
    building Fail !
    
    

    So We must Detect Baud of MCU addressed immediately.

    if We can get Count = T2 - T1, and set BGRGx
    from Count, it is fast !

Children
  • "So We must Detect Baud of MCU addressed immediately.

    if We can get Count = T2 - T1, and set BGRGx from Count, it is fast !"


    Personally, I'd still use 'Count' to look up BGRG values out of a table like Michael suggests in his last paragraph.

    If you want to calculate it, assuming you have the CCU configured with 1:1 prescale, wouldn't that be:

    BGRG1:BGRG0 = Count * 8 - 16?