Bonjour à tous,
je souhaite transférer des données d'un capteur vers serveur via une liaisons GPRS.
Pour cela, mon capteur est relié à un PIC24Fj128GB206 programmer en langage C qui est à son tour relié à un module GPRS.
Le débit du GPRS étant variable, j'utilise des UART câblé en HardWare Flow control ( RX/TX/CTS/RTS).
mon problème est le suivant :
le RTS/CTS ne semble pas fonctionner, pour simuler le probleme, je reçois des données de l'UART2 ( en 115200 bauds) et le recopie sur l'UART3 (9600 bauds).
Malgré l'utilisation du flow control le programme plante au bout de quelques octets, il semblerai que le passage à 0 du CTS engendre bien un arrêt des envoie mais son passage à 1 ne le relance pas.
voici mon programme :
Code:#include <p24Fxxxx.h> #include <uart.h> #include <PPS.h> #include <libpic30.h> #include <stdio.h> //fichier dans le sous rιpertoire du compilateur #include "main.h" //fichier crιι pour le projet #include "init.h" //fichier crιι pour le projet //watchdog OFF //use PGx1 //jtag off _CONFIG1(FWDTEN_OFF & ICS_PGx1 & JTAGEN_OFF); //quartz <10 MHz //Primary Oscillator without PLL module // no clk switching _CONFIG2(POSCMOD_XT & OSCIOFNC_OFF & FCKSM_CSDCMD & FNOSC_PRI); //************************************************************************************************************************* // ZE MAIN //************************************************************************************************************************** int main(void) { /////////////////// //INITIALISATIONS// /////////////////// IOmap(); UARTinit(); IOinit(); INTinit(); IFS1bits.U2RXIF = 0; // Clear U2RX_Int flag IEC1bits.U2RXIE = 1; // Enable U2RX_Int while(1) { } } //********************************************************************************************************************************************************************************* // This is UART2 receive ISR (UART2RX INTERRUPTION) //********************************************************************************************************************************************************************************* void __attribute__((interrupt,no_auto_psv)) _U2RXInterrupt(void) { while(!U3STAbits.TRMT); U3TXREG = U2RXREG; IFS1bits.U2RXIF = 0; // Clear U2RX_Int flag } //********************************************************************************************************************************************************************************* // This is UART3 tranceive ISR (UART3TX INTERRUPTION) //********************************************************************************************************************************************************************************* void __attribute__((interrupt,no_auto_psv)) _U3TXInterrupt(void) { IFS5bits.U3TXIF = 0; //UART3 Tranceiver Interrupt Flag set to 0 } #include <p24Fxxxx.h> #include <uart.h> #include <PPS.h> #include <libpic30.h> #include <stdio.h> //fichier dans le sous rιpertoire du compilateur #include "main.h" //fichier crιι pour le projet #include "init.h" //fichier crιι pour le projet //********************************************************************************************************************************************************************************* // fonction qui effectue le mapping des uarts //********************************************************************************************************************************************************************************* void IOmap() { //************************************************* // STEP 1: Unlock the Reprogrammable Pin Mechanism //*************************************************/ IOunlock(); // ### //************************************************* // STEP 2: configuration UART 1 = DEBUG //************************************************* RPOR10bits.RP21R=3; //attribue RP21 ΰ U1Tx RPINR18bits.U1RXR=26; //attribue RP26 ΰ U1Rx //************************************************* // STEP 3: configuration uart 2 //************************************************* iPPSInput(IN_FN_PPS_U2RX,IN_PIN_PPS_RP17); //Assing U2RX to pin RP17 iPPSInput(IN_FN_PPS_U2CTS,IN_PIN_PPS_RP4); //Assing U2CTS to pin RP4 iPPSOutput(OUT_PIN_PPS_RP16,OUT_FN_PPS_U2TX); //Assing U2TX to pin RP16 iPPSOutput(OUT_PIN_PPS_RP2,OUT_FN_PPS_U2RTS); //Assing U2RTS to pin RP2 //************************************************* // STEP 4: configuration uart 3 //************************************************* iPPSInput(IN_FN_PPS_U3RX,IN_PIN_PPS_RP22); //Assing U3RX to pin RP22 iPPSInput(IN_FN_PPS_U3CTS,IN_PIN_PPS_RP24); //Assing U3CTS to pin RP23 iPPSOutput(OUT_PIN_PPS_RP25,OUT_FN_PPS_U3TX); //Assing U3TX to pin RP25 iPPSOutput(OUT_PIN_PPS_RP23,OUT_FN_PPS_U3RTS); //Assing U3RTS to pin RP24 //************************************************* // STEP 6: Lock the Reprogrammable Pin Mechanism //*************************************************/ IOlock(); // ### } //********************************************************************************************************************************************************************************* //fonctions de Lock unlock du mapping //********************************************************************************************************************************************************************************* void IOlock(){ asm volatile ("mov #OSCCON,w1 \n" "mov #0x46, w2 \n" "mov #0x57, w3 \n" "mov.b w2,[w1] \n" "mov.b w3,[w1] \n" "bset OSCCON, #6":::"w1","w2","w3"); } void IOunlock() { asm volatile ("mov #OSCCON,w1 \n" "mov #0x46, w2 \n" "mov #0x57, w3 \n" "mov.b w2,[w1] \n" "mov.b w3,[w1] \n" "bclr OSCCON, #6":::"w1","w2","w3"); } //********************************************************************************************************************************************************************************* //FonctionS d'initalisation des interruptions //********************************************************************************************************************************************************************************* void INTinit() { //UART3 IEC5bits.U3RXIE = 0; //Enable(1)/Disable(0) UART3 Receiver Interrupt IEC5bits.U3TXIE = 0; //Enable(1)/Disable(0) UART3 Tranceiver Interrupt //UART2 IEC1bits.U2RXIE = 0; //Enable(1)/Disable(0) UART2 Receiver Interrupt IEC1bits.U2TXIE = 0; //Enable(1)/Disable(0) UART2 Tranceiver Interrupt IPC20bits.U3RXIP = 6; IPC7bits.U2RXIP = 7; //UART2 Receiver Interrupt priority 7 of 7 //////////////////////////////////////////////////////////////////////// } //********************************************************************************************************************************************************************************* //fonctions d'initalisation des Entrιes / Sorties //********************************************************************************************************************************************************************************* void IOinit(void) { TRISEbits.TRISE4=0; //RE4 en SORTIE pour la Led rouge TRISEbits.TRISE3=0; //RE3 en SORTIE pour la Led verte ANSB=0x0000; //deactivate analog } //********************************************************************************************************************************************************************************* //fonctions d'initalisation des UART //********************************************************************************************************************************************************************************* void UARTinit() { TRISGbits.TRISG6 = 0; // configure pin RG6 en sortie UART1TX TRISGbits.TRISG7 = 1; // configure pin RG6 en entrιe UART1RX TRISFbits.TRISF3 = 0; // configure pin RF3 en sortie UART2TX TRISFbits.TRISF5 = 1; // configure pin RG6 en entrιe UART2RX TRISDbits.TRISD8 = 0; // configure pin RD8 en sortie U2RTS TRISDbits.TRISD9 = 1; // configure pin RD8 en entrιe U2CTS TRISDbits.TRISD4 = 0; // configure pin RG6 en sortie UART3TX TRISDbits.TRISD3 = 1; // configure pin RD3 en entrιe UART3RX TRISDbits.TRISD2 = 0; // configure pin RD8 en sortie U3RTS TRISDbits.TRISD1 = 1; // configure pin RD8 en entrιe U3CTS //******************************************************************************** // Load the count to get 9600 baudrate // BRG = Fcy/(16*BaudRate)-1 where Fcy = Fosc/2 = 4MHz //********************************************************************************/ U1BRG = BRGVAL1; U2BRG = BRGVAL2; // automatic macro computation = 0x19; U3BRG = BRGVAL3; //******************************************************************************** // Hardware Flow Control OFF(sur U1 et ON sur U2 et U3), No Loop-Back // No Auto-Baud, No Rx-Inversion // Low BaudRate, 1 Stop-bit // 8-bit, no parity //********************************************************************************/ U1MODE = 0x8000; U2MODE = 0x8200; U3MODE = 0x8200; //******************************************************************************** // Tx Interrupt to interrupt when at least one location is free in Tx buffer // No Tx Inversion, Disable Sync Break // Enable Transmit, Disable Address Detect // Interrupt on every receive. //********************************************************************************/ U1STA = 0x0400; U2STA = 0x0400; // 0b0000 0100 0000 0000 U3STA = 0x0400; IFS0bits.U1RXIF = 0; // Clear U1RX_Int flag IFS1bits.U2RXIF = 0; // Clear U2RX_Int flag IFS5bits.U3RXIF = 0; // Clear U3RX_Int flag }
-----