2014-02-05 7 views
2

pic32 제품군 디바이스에서 직렬 포트를 구성하는 코드를 작성하고 있습니다. 초기화는 대부분 작동하는 것으로 보입니다. 그러나 쓰는 처음 6 자 대신 가비지 데이터가 나타납니다. 그러나 초기화 함수가 끝날 때까지 임의로 긴 대기 시간을 추가하면이 작업이 사라집니다. 초기화가 끝날 때까지 기다려야 할 레지스터 플래그가 있습니까? 내 초기화 코드는 아래와 같습니다. 도움이된다면이 초기화를 pic32 reference manual의 UART 섹션을 기반으로하고 있습니다. 나는 내 전송 기능을 위해 아래 코드를 추가했다. 내 예상 출력 문자열은 "부트 로더 코드에서 안녕하세요 \ 연구 \ n."하지만 난 얻을 실제 바이트는 다음과 같습니다PIC32 UART가 초기화 후 가비지 문자를 전송합니다.

00000000 00 00 aa b1 b1 bd 81 66 72 6f 6d 20 74 68 65 20 |.......from the | 
00000010 62 6f 6f 74 6c 6f 61 64 65 72 20 63 6f 64 65 2e |bootloader code.| 
00000020 0d 0a 


void initializeUART2() 
{ 
    uint32 counter; 
    initialized = TRUE; 
    U2MODE = 0; 
    U2STA = 0; 
    U2BRG = 0; 

    IEC1bits.U2TXIE = 0; 
    IEC1bits.U2RXIE = 0; 
    IEC1bits.U2EIE = 0; 

    //disable UART transmission before config 
    U2STA &= ~UART_TRANSMIT_ENABLED_STATUS_FLAG; 

    //disable UART before config 
    U2MODE &= ~UART_ENABLED_MODE_FLAG; 

    RS232_RS485_TRIS=0; //set to output 
    RS232_RS485=0; //select RS-232 mode on MAX3161 

    //set baudrate BAUDRATE = CLOCK_FREQUENCY/(16*(U2BRG + 1)) 
    //solve for U2BRG value 
    U2BRG = (UINT16)(((PERIPHERAL_CLOCK_FREQUENCY/UART2_BAUDRATE)/16)-1); 

    //set mode to 8 bit no parity 
    U2MODE &= ~UART_PARITY_DATA_MODE_BITS; 

    //set number of stop bits to 1 
    U2MODE &= ~UART_EXTRA_STOP_MODE_BIT_FLAG; 

    //enable the UART port 
    U2MODE |= UART_ENABLED_MODE_FLAG; 

    //enable serial transmission 
    U2STA |= UART_TRANSMIT_ENABLED_STATUS_FLAG; 

    //without this loop, I get garbage in first 6 bytes of my first message 
    counter = 1000; 
    while(counter--); 
} 

void putUART2(uint32 value) 
{ 
    if(!initialized) 
    { 
     initializeUART2(); 
    } 

    //make sure value is in range of writable values 
    value &= UINT32_MASK(8); 

    //clear transmit interrupt flag 
    IFS1bits.U2TXIF = 0; 

    //wait for the transmit buffer to be empty 
    while((U2STA & UART_TRANSMIT_STATUS_FLAG) == 0); 

    //set the data byte to be written in the write register 
    //also starts transmission 
    U2TXREG = value; 

    //wait for the transmit buffer to be empty 
    //both of these waits are necessary to avoid missing bytes 
    while((U2STA & UART_TRANSMIT_STATUS_FLAG) == 0); 
} 

답변

3

MAX3161은 모드를 RS232로 전환 한 후 안정화하려면 최소 100ns가 필요합니다. 또한

이러한 라인 :

RS232_RS485_TRIS=0; //set to output 
RS232_RS485=0; //select RS-232 mode on MAX3161 

반전한다; 출력을 설정 한 다음 글리치를 피하기 위해 방향 레지스터를 설정하십시오.

+0

주문을 뒤집고 1 마이크로 초 지연을 추가했는데 완벽하게 작동한다는 것을 어떻게 알 수 있습니까? 감사 –

2

안정적인 운영에 도달하는 시간이 더 필요 차지 펌프가있는 MAX3161 칩을 의심 전압.

비트 시간 또는 2에 불과할 수 있지만 메시지가 너무 일찍 보내지면 조용한 시간이 발생할 때까지 직렬 출력이 엉망이됩니다.

덜 후보 :이 문제는 게시되지 않은 전송 루틴과 상호 작용합니다.

참고 : 게시되지 않은 '가비지 데이터'와 같은 정보를 사용하여 보는 것이 얼마나 도움이되는지는 놀랍습니다. 또한 "좋은"처음 6 바이트 정도가 유용하다는 것을 알고 있습니다.


[편집] @Doug Currie가 올바른 위치에 있습니다.

RS232_RS485_TRIS1이 출력으로 변경되면 데이터를 보내기 전에 제안 된 지연 시간이 필요합니다. 이것은 코드의 다른 장소뿐만 아니라 여기에 적용됩니다.

또한 RS232_RS485_TRIS1이 입력으로 변경되기 전에 코드는 모든 데이터가 완전히 전송되도록해야합니다. PIC가 xmit 버퍼를 공백으로 선언 한 후이 값은 10/baud 일 수 있습니다. 또는 버스를 돌리기 전에 적절한 xmit 상태 비트를 확인하십시오. (시프트 레지스터는 비어 있음 - 컴파일러에 따라 이름이 다릅니다.)

+0

S E 데이터를 저장해 주셔서 감사합니다. @Doug Currie와 함께이 솔루션을 갖기를 바랍니다. 1) 시스템이 파워 업시 안정화되고 2) 출력을 켜고 (잠재적으로 코드의 여러 위치에) 시간을 허용하고 3) 출력을 끄기 전에 시간을 허용하십시오. (잠재적으로 코드의 여러 위치) – chux

+0

감사합니다. 매우 도움이되었습니다. –