Hallo Leute,
ich weiß, das Thema ist schon etliche male behandelt worden, konnte aber
leider keine Lösung für mein Problem finden.
Und zwar geht es um folgendes:
Ich sende mit einem PIC33FJ16GS404 über UART daten an ein
Bluetoothmodul. Um das Modul nicht zu überfordern möchte ich den
Hardware-Handshake über RTS/CTS machen.
An meinem PIC ist das CTS-Signal ein Input(Port B, Bit 0), auf dem die
RTS-Leitung des Bluetoothmoduls hängt und umgekehrt.
Aktuell habe ich probleme beim senden. So wie es aussieht überfordert
mein PIC das Bluetoothmodul....
So sieht meine Senderoutine aus:
1 | int Bluetooth_Send(int Lang,char senden[])
|
2 | {
|
3 | static int i = 0;
|
4 | static int finish = 0;
|
5 |
|
6 | //Send data
|
7 | if ((i <= Lang)&&(PORTBbits.RB0 == 0))
|
8 | {
|
9 | //__delay_us(80); //Verzögerung um Bluetoothmodul nicht zu überfordern (80µs)
|
10 | if(!IFS0bits.U1TXIF) //Wenn Interrupt Flag nicht gesetzt
|
11 | {
|
12 | U1TXREG=senden[i];
|
13 | i++;
|
14 | }
|
15 | else
|
16 | {
|
17 | IFS0bits.U1TXIF = 0; //Rücksetzen der Interruptflag
|
18 | }
|
19 | }
|
20 | if (i==Lang)
|
21 | {
|
22 | finish = 1;
|
23 | i=0;
|
24 | }
|
25 | else
|
26 | {
|
27 | finish = 0;
|
28 | }
|
29 |
|
30 | return (finish);
|
31 | }
|
Diese Routine wird von der main-funktion immer wieder aufgerufen (ist in
einer Schleife)
Wenn ich den Delay von 80µs rein mache kommen so gut wie alle Daten an.
Ich möchte das ganze aber mit Handshake machen um sicher zu gehen.
Mit dem Oszi habe ich am CTS-Pin des µC gemessen... es kommt immer mal
wieder ein High-Pegel, was für mich ja "nicht senden" heisen würde.
Dies würde ich ja über die Abfrage "if ((i <= Lang)&&(PORTBbits.RB0 ==
0))" gewährleisten.
Ich habe mir gedacht, dass es eventuell auch an meiner
UART-Initialisierung liegen könnte. Die sieht wie folgt aus:
1 | /*Initialisieren UART*/
|
2 | U1MODEbits.STSEL = 0; // 1-Stop bit
|
3 | U1MODEbits.PDSEL = 0; // No Parity, 8-Data bits
|
4 | U1MODEbits.ABAUD = 0; // Auto-Baud disabled
|
5 | U1MODEbits.BRGH = 0; // Standard-Speed mode
|
6 | U1MODEbits.RTSMD = 0; // Flow Control mode
|
7 | U1MODEbits.UEN1 = 0; // UxTX, UxRX and UxRTS pins are enabled and used; UxCTS pin is controlled by port latches
|
8 | U1MODEbits.UEN0 = 1;
|
9 | U1BRG = BRGVAL; // Baud Rate setting for 115200
|
10 |
|
11 | U1MODEbits.UARTEN = 1; // Enable UART
|
12 | U1STAbits.UTXEN = 1; // Enable UART TX
|
13 | __delay_ms(10); // Delay von 10ms
|
14 |
|
15 | IFS0bits.U1TXIF = 0; // Interruptflag auf 0 setzen
|
Hat jemand ne Idee was der Fehler sein könnte?