PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   PIC32 - Bộ điều khiển tín hiệu số 32-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=61)
-   -   Dùng nhiều cổng UART của PIC32 (http://www.picvietnam.com/forum/showthread.php?t=6627)

tahi 06-07-2010 05:59 PM

Dùng nhiều cổng UART của PIC32
 
1 số PIC32 có đến 6 cổng UART, nhưng trong MPLAB hay các tài liệu chỉ thấy báo ngắt UART1 và UART2
Thấy người ta chỉ cho cách cấu hình để tạo ra cái gọi là Interrupt Group Priority Interrupt Subpriority
Nhưng em vẫn ko hiểu làm thế nào để dùng được hết cả 6 cổng này sử dụng ngắt...
Code:

void __ISR(_UART2_VECTOR, ipl2) IntUart2Handler(void)
{
        // Is this an RX interrupt?
        if(INTGetFlag(INT_SOURCE_UART_RX(UART2)))
        {
                // Clear the RX interrupt Flag
            INTClearFlag(INT_SOURCE_UART_RX(UART2));
                // Echo what we just received.
        //        PutCharacter(UARTGetDataByte(UART2));
        }
        // We don't care about TX interrupt
        if ( INTGetFlag(INT_SOURCE_UART_TX(UART2)) )
        {
                INTClearFlag(INT_SOURCE_UART_TX(UART2));
        }
}

Làm sao phân biệt được ngắt do UART2A hay UART2B
Cái ipl2 là gì, nhiều thằng ngắt cùng là ipl2 thì có vấn đề gì ko ạ?

tungnh 27-07-2010 06:28 PM

Trích:

Nguyên văn bởi tahi (Post 37147)
1 số PIC32 có đến 6 cổng UART, nhưng trong MPLAB hay các tài liệu chỉ thấy báo ngắt UART1 và UART2
Thấy người ta chỉ cho cách cấu hình để tạo ra cái gọi là Interrupt Group Priority Interrupt Subpriority
Nhưng em vẫn ko hiểu làm thế nào để dùng được hết cả 6 cổng này sử dụng ngắt...
Code:

void __ISR(_UART2_VECTOR, ipl2) IntUart2Handler(void)
{
        // Is this an RX interrupt?
        if(INTGetFlag(INT_SOURCE_UART_RX(UART2)))
        {
                // Clear the RX interrupt Flag
            INTClearFlag(INT_SOURCE_UART_RX(UART2));
                // Echo what we just received.
        //        PutCharacter(UARTGetDataByte(UART2));
        }
        // We don't care about TX interrupt
        if ( INTGetFlag(INT_SOURCE_UART_TX(UART2)) )
        {
                INTClearFlag(INT_SOURCE_UART_TX(UART2));
        }
}

Làm sao phân biệt được ngắt do UART2A hay UART2B
Cái ipl2 là gì, nhiều thằng ngắt cùng là ipl2 thì có vấn đề gì ko ạ?

cái ipl2 là khi bác cấu hình mức ưu tiên thì khi gọi hàm ngắt thằng C32 nó bắt bác phải gọi lai cai mức ưu tiên mà bác cấu hình thôi.
Cái này mình cũng đang ngâm cứu, mình cũng chỉ cấu hình và chạy được uar1 và uart2 còn các uart khác không chạy được mặc dù cấu hình giống nhau, trong tài liệu RFM pic32 mình không thể tìm thấy sự khác nhau giữa uart1,uart2 và uart1a,uart2a,uart3a,1b,2b,3b .
Còn khi uart 1a,hay 1b cấu hình chạy được rồi thì phần ngắt rất đơn giản chỉ thay _UART2_VECTOR thành _UART_2A_VECTOR...
Nhưng chú ý trong bảng vector ngắt, 1 số ngắt uart trùng với ngắt spi, ví dụ như ngắt UART2A trùng với ngắt SPI1,bác phải define lại , nêu cấu hình dùng ngắt uart2a và spi1 có thể sẽ làm reset pic nếu như ngắt xảy ra......
Bác nào cấu hình được uart1a,2a,3a,1b,2b,3b chạy được bảo tui với

tungnh 30-07-2010 02:06 PM

Đã fix được lỗi, mình đã cấu hình đươc cả 6 uart chạy, có điều nếu như cấu hình ngắt uart phải chú ý trong hàm ngăt phải xóa bit OERR trong thanh ghi UxSTA.
Nhưng lại gặp một vấn đề là khi dùng các UART 1B,2B,3B,2A,ngắt nhận xảy ra liên tục mặc dùng chân RX không co tín hiệu.
Anh Nam và mọi người giải thích cho mình với ạ
Code:

void initUart(UART_MODULE id,unsigned int baudrate)
{
UARTConfigure(id,UART_ENABLE_PINS_TX_RX_ONLY);           
UARTSetFifoMode(id,UART_INTERRUPT_ON_TX_NOT_FULL |  UART_INTERRUPT_ON_RX_NOT_EMPTY);
UARTSetLineControl(id, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
UARTSetDataRate (id, 10000000, baudrate); //simple 9600 baud
UARTEnable(id, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));               
// Configure UART2 RX Interrupt
INTEnable(INT_SOURCE_UART_RX(id), INT_ENABLED);
INTSetVectorPriority(INT_VECTOR_UART(id), INT_PRIORITY_LEVEL_3);
INTSetVectorSubPriority(INT_VECTOR_UART(id), INT_SUB_PRIORITY_LEVEL_0);           

}
void UART_send_byte(UART_MODULE id,unsigned char byte)
{
              while(!UARTTransmitterIsReady(id));
              UARTSendDataByte(id, byte);
              while(!UARTTransmissionHasCompleted(id));
}
void __ISR(_UART_2B_VECTOR, ipl3) IntUart2bHandle(void)
{       
        // Is this an RX interrupt?
        if(U2BSTAbits.FERR==0)
        {
        }else U2BSTAbits.FERR=0;
        if(IFS2bits.U2BRXIF ==1)
        {
        IFS2bits.U2BRXIF = 0;
        LED = 1;
        }
        U2BSTAbits.OERR=0;
}


tungnh 02-08-2010 05:31 PM

1 Attachment(s)
Đã tìm được nguyên nhân lôi. Cả 6 Uart của pic32 đều chạy. Nguyên nhân mình gặp phải là do dung Ethernet starter kit, mình test uart2b, cái chân RX của nó được nối với chân CLK của một con chíp nên cứ cấu hình ngắt nhận thì chíp đơ do cái bit OERR luốn là 1.
Code trên của mình chạy được cả 6 Uart.
Mình gửi các bạn một vài code test về một số module của pic32. thất ra trong cái thư viện plib có hết


Múi giờ GMT. Hiện tại là 02:59 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam