PIC24FJ128GA202 UART2 und UART3 funktionieren nicht?

Ich arbeite in einem Mikrocontroller pic24fj128ga202 mit L80- und M95-Modul. hier L80-Modul verbunden mit uart2 und M95-Modul verbunden mit uart3. Jetzt funktioniert uart1 normal, aber uart2 und uart3 funktionieren nicht (dh) ich habe keine gps- und gprs-Daten erhalten. Unten habe ich sowohl die uart.h- als auch die ioconfig.h-Datei main.c angehängt

#include "p24FJ128GA202.h"           
#include <stdio.h> 
#define led PORTAbits.RA2
#include "UART.h"
#include "IOCONFIG.h"
int main()
{
    GSMPwrkey=1;
    init_processor();
    uartx1( uart2rx());
   return 0;
}

UART.h
#include<stdio.h>
/* transmit a character in uart1 */
void uartx1(char in_c)
{
    while(U1STAbits.UTXBF == 1);
    U1TXREG = in_c;
}
/* transmit a character in uart1 */
void uartx2(char in_c)
{
    while(U2STAbits.UTXBF == 1);
    U2TXREG = in_c;
}
/* transmit a character in uart3 */
void uartx3( char in_c)
{             
    while(U3STAbits.UTXBF == 1);
    U3TXREG = in_c;       
}
/* Receive a character in uart1 */
char uart1rx()
{
    char c;
    while(U1STAbits.URXDA == 0);
    c = U1RXREG;
    return c;       
}
/* Receive a character in uart2 */
char uart2rx()
{
    char c;
    while(U2STAbits.URXDA == 0); 
    c =U2RXREG; 
    return c;
}
/* Receive a character in uart3 */
char uart3rx()
{  
    char c;
    while(U3STAbits.URXDA == 0); 
    return U3RXREG; 
    return c;
}
/* transmit a string in uart1 */
void uartstr1( char *s)
{
    while(*s!='\0')
    {
        uartx1(*s);
        s++;
    }
}
/* transmit a string in uart3 */
void uartstr3( char *s)
{
    while(*s!='\0')
    {
        uartx3(*s);
        s++;
    }
}


IOCONFIG.h

#include<stdio.h>
#include<stdint.h>
#define GSMPwrkey PORTBbits.RB12
#define GPSreset PORTBbits.RB15
void Timer1DelaymsInit(void);
void Delayms(uint16_t delay);
void init_Processor(void);
void Timer1DelaymsInit(void)
{
    T1CONbits.TCKPS = 0; //Timer1 Prescale Select bit
    T1CONbits.TCS = 0;   //Timer1 Clock source(FOSC/2)
    PR1 = 3760;
    TMR1 = 0;
    IEC0bits.T1IE = 0;
    T1CONbits.TON = 1;

}
void Delayms(uint16_t delay)
{

    while(delay>0)
    {
        TMR1 = 0;
        IEC0bits.T1IE = 0;  //Reset interrupt flag
        while(!IEC0bits.T1IE);// Wait here for timeout
        delay--;
    }

}
void init_Processor(void)
{

  /* uart1 Tx and Rx pin setup */ 
    RPINR18bits.U1RXR = 7;      //portB RB7 RX pin
    RPOR4bits.RP8R   = 3;       //portB RB8 TX  pin
 /* uart2 tx and rx pin setup */    
    RPINR19bits.U2RXR = 14;     //portB RB14 RX pin
    RPOR6bits.RP13R   = 5;      //portB RB13 TX pin
 /* uart3 tx and rx pin setup */    
    RPINR17bits.U3RXR = 10;     //portB RB10 RX pin
    RPOR5bits.RP11R   = 19;     //portB RB11 TX pin
    //Congifure analog and digital 
    ANSA = 0x0003;                                                  
    ANSB = 0x0000;
    PORTA = 0x0000;                                                 
    TRISA = 0X001B;                                                 
    PORTB = 0x0000;                                                 
    TRISB = 0x4680;
    // Init UART1
    U1MODE = 0x8000;                                                 
    U1STA = 0x3400;
    U1BRG = 25;                                                     
    // Init UART2
    U2MODE = 0x8000;                                                
    U2STA = 0x3400;
    U2BRG = 25;                                                     
    // Init UART3
    U3MODE = 0x8000;                                                
    U3STA = 0x3400;
    U3BRG = 25;
    IFS5bits.U3RXIF   = 0;            
    IEC5bits.U3RXIE   = 1;            
    U3MODEbits.UARTEN = 1;            
    U3STAbits.UTXEN   = 1;
    // Init ADC
    Timer1DelaymsInit();
    GSMPwrkey=1;    
}
Sie haben keine Warnungen für die Verwendung der Registernamen in Ihrem UART-Header erhalten, obwohl Sie die PIC-Header-Datei dort nicht eingefügt haben?
Sollen wir wissen, was L80- und M95-Module sind? Geben Sie einen Kontext..
l80 ist ein gps-modul und m95 ist ein gsm-modul, beides sind quectel-produkte
Sie haben wahrscheinlich vergessen, die Peripherie-Pin-Auswahl einzurichten.
nach einigen änderungen pps einstellung uart2 funktioniert und aber uart3 funktioniert nicht
Periphere Bibliothek verwenden, siehe this

Antworten (1)

Ich werde zumindest meine Erfahrungen mit Mikrochip, peripherer Pinauswahl und dem UART teilen, vielleicht hilft es Ihnen, das Problem zu lösen. (kann wegen mangelnder Bekanntheit keine Aussage machen)

Ich habe einmal angefangen, auf einem dsPIC33F-Mikrocontroller mit PPS zu programmieren. Ich dachte, dass jeder Pin für den UART wählbar wäre. Nun ja.. Es stellte sich heraus, dass dies nicht der Fall war. Ich habe ein paar Tage gebraucht, um das Problem in meinem System zu finden, aber schließlich fand ich heraus, dass nicht jeder Pin jede Funktion haben kann.

Tipp: Ändern Sie Ihre Pins und schauen Sie genau hin, ob Sie alle Register entsprechend Ihrer Anwendung eingestellt haben. Einige Register haben eine Art Priorität.

Wenn ich mich richtig erinnere, hat die Funktion, die dem Mikrocontroller am nächsten liegt (Pin-Diagramm im Datenblatt), die höchste Priorität, wenn zwei Funktionen auf denselben Pin gesetzt sind.

Hoffe das hilft.

Sie sollten beachten, dass Sie über neu zuordenbare Ausgangspins sprechen . Einige abbildbare Pins sind nur für Eingänge. Diese sind eindeutig als solche gekennzeichnet, indem sie RPIxx statt RPxx heißen. Außerdem kann eine beliebige Anzahl von Peripheriegeräten denselben Pin als Eingang verwenden. Die einzige periphere Regel gilt nur für Ausgangspins. Natürlich verhindert die Art und Weise, wie Ausgangspins zugeordnet werden, dies, da Sie für abbildbare Ausgangspins die Peripheriefunktions-ID in ein Register für diesen Pin schreiben. Dieser ganze PPS-Mechanismus mag kompliziert erscheinen, aber er ergibt Sinn, wenn man darüber nachdenkt.
Richtig, aber ich habe einmal eine einzelne UART-Verbindung mit einem vom PPS-Register zugewiesenen Pin verbunden und es hat nicht funktioniert. Ich habe genau dasselbe mit einem anderen Stift gemacht und hatte überhaupt keine Probleme. Ich habe wirklich versucht, irgendwo im Datenblatt nach einer Notiz zu suchen, die besagt, dass der Pin nicht für UART-Zwecke oder ähnliches verwendet werden kann, aber ohne Erfolg. Ich habe mich deswegen auch an Microchip gewandt, aber ihre Antwort ergab für mich nicht viel Sinn. Ich könnte einen anderen Stift verwenden, also hatte ich keine Schwierigkeiten, aber Vorsicht vor PPS.
Das klingt, als hättest du ein anderes Problem. Ich glaube nicht, dass der UART-Ausgang keinem RPx-Pin oder der Eingang keinem RPIx- oder RPx-Pin zugewiesen werden kann.
Das mag sein, aber es ist seltsam, dass es sofort funktionierte, als ich den Pin änderte. Das bedeutet, dass alles, was ich in meinem Code getan habe (möglicherweise völlig anders als die PPS-Einstellungen), mich davon abgehalten hat, den UART an diesen RPIx- oder RPx-Pins zu verwenden. Nur ein Hinweis darauf, dass die Probleme durch Austauschen der Pins behoben werden könnten. Trotzdem danke für deine Kommentare :)