Bei dem Versuch ein WLAN Modul über UART zu initialisieren habe ich
UART2 wie unten dargestellt initialisiert:
Bei debuggen habe ich jetzt festgestellt, dass beim Einlesen eines
Characters (z.B.
1
U2TXREG='1';
) das U2TXREG bzw U2RXREG, also das Transceive Register bzw. das
Transmit Register immer "leer bleiben" (also Value: 0xOOOO bzw Char:
"..."). Ich habe versucht beim Setup für UART Transmit mich genau an die
Schritte im Datenblatt zu halten, trotzdem scheint es noch irgendwo bei
der Initialisierung zu haken. Jemand ne Idee was ich falsch gemacht
haben könnte?
1
#define FCY 10000000 // FCY = FOSC/2
2
#define BAUDRATE 9600
3
#define BRGVAL ((FCY/BAUDRATE)/16)-1
4
5
U2MODEbits.BRGH=0;// Bit3 16 clocks per bit period, BRGH = 0: BRG generates 16 clocks per bit period (16x baud clock, Standard mode)
6
U2BRG=BRGVAL;// Baud Rate setting for 9600
7
8
9
// 9600 baud, 8 bits data, 1 stop bit, no parity, and no flow control
10
// 2.
11
U2MODEbits.PDSEL=0;// Bits1,2 8bit-data, No Parity, PDSEL = 0: 8-bit data, no parity
12
U2MODEbits.STSEL=0;// Bit0 One Stop Bit, STSEL = 0: One Stop bit
13
14
// Later, receive interrupts are enabled. Transmit interrupts remain disabled.
15
// 3.
16
IEC1bits.U2TXIE=0;// disable Transmit Interrupts
17
IEC1bits.U2RXIE=0;// disable Recieve InterruptsU2STAbits.URXISEL = 0; // UARTx Receive Interrupt Mode Selection bits; 0x = Interrupt flag bit is set when a character is received
18
U2MODEbits.UEN=0;// Bits8,9 TX,RX enabled, CTS,RTS not, -> no Flo Control
19
20
// Peripheral Pin Select
21
// URX
22
TRISFbits.TRISF4=1;// RF4 input - U2RX pin; /* Uart Rx is an input */
23
RPINR19=0;
24
RPINR19bits.U2RXR=0b1100100;// RF4 pin - RP100 assigned to U2RX function
25
26
27
// UTX
28
TRISFbits.TRISF5=0;// RF5 output - U2TX pin; /* Uart Tx is an output */
29
RPOR9=0;
30
RPOR9bits.RP101R=0b000011;// RF5 as U2TX; RP101 tied for UART2 transmit
31
32
// 5.
33
U2MODEbits.UARTEN=1;// 1 = UARTx is enabled; all UARTx pins are controlled by UARTx as defined by UEN<1:0>
34
// The UTXEN bit should not be set until the UARTEN bit has been set; otherwise UART transmissions will not be enabled.
35
36
// 6.
37
U2STAbits.UTXEN=1;// Bit10 TX pins controlled by periph, UTXEN = 1: Transmit is enabled, U2TXIF is set
Gisti schrieb:> Danke sehr. War leider erfolglos.
Ja was heißt es, kommt am TXPin nichts raus, hast du ein OSZI da?
Oder kommt was falsches raus, dann stimmen die Timings nicht, Zb.
Einstellung von QUARZ:
Hallo und vielen Dank für die ausführliche Antwort.
Dann mal von Anfang an:
Ich nutze internen FRC mit PLL.
1
_FOSCSEL(FNOSC_FRCPLL);// Internal FRC oscillator with PLL
2
_FOSC(FCKSM_CSDCMD&OSCIOFNC_ON&POSCMD_NONE);
3
// Clock Switching is enabled and Fail Safe Clock Monitor is disabled
4
// OSC2 Pin Function: OSC2 is Clock Output
5
// Primary Oscillator Mode: XT Crystanl
6
7
_FWDT(FWDTEN_OFF);// Watchdog Timer enabled/disabled by user software
8
_FICD(ICS_PGD1&JTAGEN_OFF);// Communication Channel: PGC1/EMUC1 and PGD1/EMUD1
Die Takteinstellung habe ich wie folgt vorgenommen:
Ich bekomme eine Oszillatorfrequenz von 21MHz -> Inputclock: Fcy=Fosc/2
= 10,5 MHz. Diese errechnete Frequenz nutze ich auch als define FCY
10500000 über die die Baudrate ermittelt wird.
1
// Fosc= 7.37M*40/(2*7)=21Mhz für 10,5 Mips Input Clock =Fcy; 7.37 da OSCTUN = 0b000000
2
PLLFBD=38;// M=40
3
CLKDIVbits.PLLPOST=0b00;// N2=2
4
CLKDIVbits.PLLPRE=0b00101;// N1=7
5
OSCTUN=0;// Tune FRC oscillator
6
RCONbits.SWDTEN=0;// Disable Watch Dog Timer " "RCON Control register; SWDT: 1: WDT is enabled 0: WDT disabled"
Das Peripheral Pin Select nehme ich für UTX bzw. RTX wie folgt vor:
1
// Peripheral Pin Select
2
// URX
3
TRISFbits.TRISF4=1;// RF4 input - U2RX pin; /* Uart Rx is an input */
4
RPINR19=0;
5
RPINR19bits.U2RXR=0b1100100;// RF4 pin - RP100 assigned to U2RX function
6
7
8
// UTX
9
TRISFbits.TRISF5=0;// RF5 output - U2TX pin; /* Uart Tx is an output */
10
RPOR9=0;
11
RPOR9bits.RP101R=0b000011;// RF5 as U2TX; RP101 tied for UART2 transmit
Abschließend die UART Einstellung:
1
#define FCY 10500000ULL // FCY = FOSC/2 unsigned long long
2
#define BAUDRATE 9600
3
#define BRGVAL ((FCY/BAUDRATE)/16)-1
4
5
// configure U2MODE
6
U2MODEbits.UARTEN=0;// Bit15 TX, RX DISABLED, ENABLE at end of func
7
//U2MODEbits.notimplemented; // Bit14
8
U2MODEbits.USIDL=0;// Bit13 Continue in Idle
9
U2MODEbits.IREN=0;// Bit12 No IR translation
10
U2MODEbits.RTSMD=0;// Bit11 Simplex Mode
11
//U2MODEbits.notimplemented; // Bit10
12
U2MODEbits.UEN=0;// Bits8,9 TX,RX enabled, CTS,RTS not
13
U2MODEbits.WAKE=0;// Bit7 No Wake up (since we don't sleep here)
14
U2MODEbits.LPBACK=0;// Bit6 No Loop Back
15
U2MODEbits.ABAUD=0;// Bit5 No Autobaud (would require sending '55')
16
// Load a value into Baud Rate Generator. Example is for 9600.
U2STAbits.UTXEN=0;//Bit10 TX pins controlled by periph
47
U2STAbits.UTXBF=0;//Bit9 *Read Only Bit*
48
U2STAbits.TRMT=0;//Bit8 *Read Only bit*
49
// U2STAbits.URXISEL = 0; //Bits6,7 Int. on character recieved
50
U2STAbits.ADDEN=0;//Bit5 Address Detect Disabled
51
U2STAbits.RIDLE=0;//Bit4 *Read Only Bit*
52
U2STAbits.PERR=0;//Bit3 *Read Only Bit*
53
U2STAbits.FERR=0;//Bit2 *Read Only Bit*
54
U2STAbits.OERR=0;//Bit1 *Read Only Bit*
55
U2STAbits.URXDA=0;//Bit0 *Read Only Bit*
56
57
U2STAbits.URXISEL=0;// UARTx Receive Interrupt Mode Selection bits; 0x = Interrupt flag bit is set when a character is received
58
U2MODEbits.UEN=0;// Bits8,9 TX,RX enabled, CTS,RTS not, -> no Flo Control
59
60
61
// 5.
62
U2MODEbits.UARTEN=1;// 1 = UARTx is enabled; all UARTx pins are controlled by UARTx as defined by UEN<1:0>
63
// The UTXEN bit should not be set until the UARTEN bit has been set; otherwise UART transmissions will not be enabled.
64
65
// 6.
66
U2STAbits.UTXEN=1;// Bit10 TX pins controlled by periph, UTXEN = 1: Transmit is enabled, U2TXIF is set
Ich versuche nun einen String einzu lesen über die beiden Funktionen:
1
voidConsolePut(charc)
2
{
3
// while( !ConsoleIsPutReady() );
4
while(!(U2STAbits.TRMT));// 1 = Transmit Shift Register is empty and the transmit buffer is empty
5
// while ( U2STAbits.UTXBF); // wait while Tx buffer full
6
// (i.e., the last transmission has completed)
7
U2TXREG=c;
8
}
9
voidConsolePutString(char*str)
10
{
11
charc;
12
13
while((c=*str++))
14
ConsolePut(c);
15
}
Ich lese folgenden String ein:
1
ConsolePutString("$$$");
Als Antwort der WLAN Moduls würde ich den String "CMD" erwarten.
Wie kann ich überprüfen, ob ich diesen String empfangen habe?
Ich habe mir das so überlegt, dass ich das U2RXREG Register in einem
Char speichere und diesen dann in einem Array ablege.
Das sieht dann im Code wie folgt aus:
1
chardata;
2
charoutput[256]={0};
3
inty=0;
4
5
while(1)
6
{
7
8
while(U2STAbits.URXDA)// 1 = Receive buffer has data; at least one more character can be read
9
{
10
data=U2RXREG;
11
output[y++]=data;
12
13
}
14
15
16
}
Dieses Array kann ich jetzt vermutlich nur im Debugg- Modus auslesen.
Ich hätte jetzt vermutet dass am Ende des Programms (d.h. nach einiger
Wartezeit nach Senden des Arrays) sich die erwartete Antwort "CMD" des
Moduls befinden müsste. Gibt es Möglichkeiten außerhalb des Debug Modus
das Array auszulesen?
Gibt es andere Alternativen das Received Register auszulesen und zu
illustrieren?
Vielen Dank schon mal!
Ist dein Aufbau korrekt, TX/RX Pins nicht verrauscht/kurzgeschlossen?
Was für ein µC Typ hast du? Guckmal die Errata, vielleicht steht ja was
über UART2 drinne.
Gisti schrieb:> Ich lese folgenden String ein:> ConsolePutString("$$$");> Als Antwort der WLAN Moduls würde ich den String "CMD" erwarten.> Wie kann ich überprüfen, ob ich diesen String empfangen habe?
Kannst du das mit einem Oszilloskop überprüfen, damit kannst du Fehler
auf Minimum einkreisen.
http://de.wikipedia.org/wiki/UART
Bitdauer korrekt, 104µs?
Gisti schrieb:> Dieses Array kann ich jetzt vermutlich nur im Debugg- Modus auslesen.
Ja genau unter "Watch" kannst die output[256] Array ansehen.
Gisti schrieb:> Gibt es Möglichkeiten außerhalb des Debug Modus> das Array auszulesen?
Ja zum Beispiel am Display, wenn du ein angeschlossen hast ;-)
Gisti schrieb:> Gibt es andere Alternativen das Received Register auszulesen
ja ich mach das im Interrupt, das musst du natürlich erst einschalten: