2017-04-20 28 views
0

PIC32MX250F128D를 사용하여 장치를 구축 중입니다. 시스템 중 하나는 UART를 사용해야합니다. PIC에서 퍼티 터미널로 전송하면 문제가 없습니다. 그러나 다른 방향으로 데이터를 전송하는 것이 효과가 없으며 아이디어가 없습니다. CP2102 칩을 사용하는 값싼 USB-UART 어댑터를 사용하고 있습니다. Link if relevant UART 용으로 25 번과 26 번 핀 (RPC0/AN6과 RPC1/AN7)을 사용하고 있습니다.PIC32 UART 데이터 수신 안 함

  • TXEN 전송 활성화가 켜져 있으면 퍼티에 입력 된 모든 문자가 반환되어 퍼티에 인쇄됩니다. 이는 RX 및 TX 와이어가 스왑 된 경우에도 발생합니다. PIC의 송신 인터럽트 플래그가 트리거됩니다.
  • TXEN 송신 활성화가 해제 된 경우 퍼티는 문자를 출력하지 않습니다. 다시 말하지만, 와이어와 동일한 동작이 바뀌 었습니다. 인터럽트 플래그가 없습니다.
  • RX 또는 TX 와이어 중 하나를 연결 해제해도 퍼티에 대한 응답이 없습니다.
  • 디버거에서 URXDA RX 버퍼 데이터 플래그를 확인하면 설정에 관계없이 RX 버퍼에 아무 것도 보내지지 않는다는 것을 알았습니다.
  • UART 루프백을 사용할 수 없습니다. 이것은 실행 중에 디버거에서도 확인되었습니다.
  • TXREG에 쓰는 코드 루프를 넣으면 예상대로 작동하여 퍼티에 문자를 인쇄합니다.
  • 일반 코드는 TXREG 또는 RXREG와 상호 작용하지 않습니다. TX는 현재 우리 프로그램에서 사용되지 않고 RXREG는 인터럽트 루틴에서만 처리됩니다. RXIF 또는 심지어 URXDA도 플래그가 붙기 때문에 절대로 호출되지 않습니다.

간단히 말해서 와이어 연결 해제, TXEN 사용 중지 및 TX IF는 하드웨어 또는 연결 문제가 아니며 PIC가 실제로 수신하는 데이터를 미러링하고 있음을 나타냅니다. 그러나 PIC는 데이터를 수신하거나 데이터를 미러링 할 코드가 없으며 루프백을 사용할 수 있음을 인식하지 못합니다.

내 UART 관련 설정 코드는 다음과 같습니다. 주변 장치를 여러 개 사용하고 있으므로 주변 장치 충돌로 인해 문제가 발생할 경우 전체 셋업 코드를 하단에 포함합니다.

//includes 
#include <xc.h> 
#include <strings.h> 
#include <stdio.h> 
#include <sys/attribs.h>//necessary for Interrupt declarations 

//configuration 
#pragma config IOL1WAY = OFF//allows multiple(?) Peripheal cnfigurations 
#pragma config FNOSC = FRCPLL//use 8MHZ FRC with PLL as clock 
#pragma config FPLLIDIV = DIV_2//PLL input = 4MHZ 
#pragma config FPLLMUL = MUL_24//PLL output=96 MHZ 
#pragma config FPLLODIV = DIV_2//48 MHZ Sysclock 
#pragma config FPBDIV = DIV_2//24 MHZ peripheal Bus 
#pragma config FWDTEN=OFF, CP=OFF, BWP=OFF, OSCIOFNC = ON 
#pragma config JTAGEN = OFF   // Disable JTAG 

void setup_pps(void)   
{   
    //asm volatile ("di");//disable all interrupts 
    SYSKEY = 0x0;   
    SYSKEY = 0xAA996655;   
    SYSKEY = 0x556699AA;   

    CFGCONbits.IOLOCK = 0;   
    U1RXRbits.U1RXR = 0b0110; // Set U1RX to RPC1   
    RPC0Rbits.RPC0R = 0b0001; // Set U1TX to RPC0 
    CFGCONbits.IOLOCK = 1; 

    SYSKEY = 0x0; 
    //asm volatile ("ei");//re-enable interrupts 
} 

void setup(void) 
{ 
    asm("di");//disable interrupts while performing setup 
    //Interrupt vector priorities 

    IPC8CLR = 0x0000001F;   // clear priority/subpriority fields 
    IPC8SET = 0x0000000C;   // set UART priority = 3, IPC8<4:2> 
    IPC8SET = 0x00000000;   // set UART subpriority = 0, IPC8<1:0> 

    INTCONbits.MVEC = 1;//enable multivector interrupts 

    //***Pin Setup 
    setup_pps(); 
    //**Digital GPIO Setup 
    //set all port pins to digital 
    ANSELA=0x0; 
    //Set all port pins to output 
    TRISA=0x0; 
    //SNIP 
    //## End Digital GPIO Setup 

    //** UART Setup 
    U1MODEbits.UEN=0b00;//Use only U1TX and U1RX pins 
    U1MODEbits.BRGH=1;//TODO:Determine Baud rate for Reach//note: non-highspeed takes multiple samples->probably better for noise 
    U1MODEbits.PDSEL=0;//TODO: Reach parity and data select 
    //U1MODEbits.RXINV=1; 
    U1STAbits.UTXISEL=0;//Transmit Interrupt type 
    U1STAbits.URXISEL=0b01;//01;//Receive Interrupt type-Interrupt when 1/2 full (4 bytes) 
    int fpb=24000000; 
    int baudrate =38400;//change to set baud rate 
    U1BRG=fpb/(4*baudrate)-1;//Baud rate Generator//use 16x if brgh=0 
    //IEC1SET=0x0200;//Transmit Interrupt enable/ should not be needed 
    IEC1SET=0x0100;//Enable receive interrupt 
    U1STAbits.URXEN=1;//Receive Enable 
    U1MODEbits.ON=1;//Enable UART 
    U1STAbits.UTXEN=1;//Transmit Enable Enable TODO:Determine if needed for reach 
    U1STAbits.URXEN=1;//Receive Enable 
    //## End UART Setup 

    //SNIP 

    asm("ei");//re-enable interrupts 
    return; 
} 

전체 설치

//includes 
#include <xc.h> 
//#include <p32xxxx.h> 
//#include <proc/p32mx250f128d.h> 
#include "letters.h"//codes for 7 segment display 
#include "pins.h"//refer to ports/latches by function 
#include "other.h"//mainly state machine states 
#include <strings.h> 
#include <stdio.h> 
#include "gps.h"//contains variables and functions of gps data 
#include <sys/attribs.h>//necessary for Interrupt declarations 
//#include <string.h>//may be used for string manipulation, such as selecting files 
//#include <stdio.h>//will be needed for file open 

//configuration 
#pragma config IOL1WAY = OFF//allows multiple(?) Peripheal cnfigurations 
#pragma config FUSBIDIO = OFF//USB ID controlled by port, not USB Module 
#pragma config FVBUSONIO = OFF//USB VBUS controlled by port, not USB 
#pragma config FNOSC = FRCPLL//use 8MHZ FRC with PLL as clock 
#pragma config FPLLIDIV = DIV_2//PLL input = 4MHZ 
#pragma config FPLLMUL = MUL_24//PLL output=96 MHZ 
#pragma config FPLLODIV = DIV_2//48 MHZ Sysclock 
#pragma config UPLLIDIV = DIV_2//4 MHZ USB PLL input 
#pragma config UPLLEN = ON//Enable PLL for USB 
#pragma config FPBDIV = DIV_2//24 MHZ peripheal Bus 
#pragma config FWDTEN=OFF, CP=OFF, BWP=OFF, OSCIOFNC = ON 
#pragma config JTAGEN = OFF   // Disable JTAG 
#pragma config FSOSCEN = OFF  // Disable Secondary Oscillator 

void setup_pps(void)   
{   
    //asm volatile ("di");//disable all interrupts 
    SYSKEY = 0x0;   
    SYSKEY = 0xAA996655;   
    SYSKEY = 0x556699AA;   

    CFGCONbits.IOLOCK = 0;   
    U1RXRbits.U1RXR = 0b0110; // Set U1RX to RPC1   
    RPC0Rbits.RPC0R = 0b0001; // Set U1TX to RPC0 
    CFGCONbits.IOLOCK = 1; 

    SYSKEY = 0x0; 
    //asm volatile ("ei");//re-enable interrupts 
} 

void setup(void) 
{ 
    asm("di");//disable interrupts while performing setup 
    //Interrupt vector priorities 
    IPC2CLR = 0x001f;   // clear priority/subpriority fields 
    IPC2SET = 0x0018;   // set timer 2 int priority = 6, IPC2<4:2> 
    IPC2SET = 0x0000;   // set timer 2 int subpriority = 0, IPC2<1:0> 

    IPC5CLR = 0x1f000000;   // clear priority/subpriority fields 
    IPC5SET = 0x10000000;   // set adc int priority = 4, IPC5<28:26> 
    IPC5SET = 0x00000000;   // set adc int subpriority = 0, IPC2<25:24> 

    IPC7CLR = 0x001F0000;   // clear priority/subpriority fields 
    IPC7SET = 0x00080000;   // set USB priority = 2, IPC7<20:18> 
    IPC7SET = 0x00000000;   // set USB subpriority = 0, IPC7<17:16> 

    IPC8CLR = 0x0000001F;   // clear priority/subpriority fields 
    IPC8SET = 0x0000000C;   // set UART priority = 3, IPC8<4:2> 
    IPC8SET = 0x00000000;   // set UART subpriority = 0, IPC8<1:0> 

    IPC8CLR = 0x001F0000;   // clear priority/subpriority fields 
    IPC8SET = 0x00140000;   // set Input Change priority = 5, IPC8<20:18> 
    IPC8SET = 0x00000000;   // set Input subpriority = 0, IPC8<17:16> 


    INTCONbits.MVEC = 1;//enable multivector interrupts 
// INTEnableSystemMultiVectoredInt(); //Enable multi vector interrupts 
    // INTEnableInterrupts();//enable interrupts 



    //Clock Setup 
    OSCCONbits.UFRCEN=0; //USE PLL for USB //Hopefully default, otherwise unlock sequence required to write-->move to setuppps 

    //***Pin Setup 
    setup_pps(); 
    //DEVCFG0bits.JTAGEN=0; 
    //DDPCONbits.JTAGEN = 0 
    //**Digital GPIO Setup 
    //set all port pins to digital 
    ANSELA=0x0; 
    ANSELB=0x0; 
    ANSELC=0X4;//leave C2/AN8 as analog 
    //Set all port pins to output 
    TRISA=0x0; 
    TRISB=0x0; 
    TRISC=0x4; 
    //Set Controller Ports to inputs 
    TRISBbits.TRISB5=1; 
    TRISBbits.TRISB7=1; 
    TRISBbits.TRISB8=1; 
    TRISBbits.TRISB9=1; 
    TRISCbits.TRISC6=1; 
    TRISCbits.TRISC7=1; 
    TRISCbits.TRISC8=1; 
    TRISCbits.TRISC9=1; 

    CNCONBbits.ON=1;//enable input change notification of port B 
    CNENBSET=0x0180;//enable input change notification on RB7 and RB8 (kill and mode switch) 
    tmp=PORTB;//clear mismatch 
    IFS1CLR=0x4000;//clear interrupt flag 
    IEC1SET=0x4000;//enable interrupt 

    //## End Digital GPIO Setup 

    //** UART Setup 
    U1MODEbits.UEN=0b00;//Use only U1TX and U1RX pins 
    U1MODEbits.BRGH=1;//TODO:Determine Baud rate for Reach//note: non-highspeed takes multiple samples->probably better for noise 
    U1MODEbits.PDSEL=0;//TODO: Reach parity and data select 
    //U1MODEbits.RXINV=1; 
    U1STAbits.UTXISEL=0;//Transmit Interrupt type 
    U1STAbits.URXISEL=0b01;//01;//Receive Interrupt type-Interrupt when 1/2 full (4 bytes) 
    int fpb=24000000; 
    int baudrate =38400;//change to set baud rate 
    U1BRG=fpb/(4*baudrate)-1;//Baud rate Generator//use 16x if brgh=0 
    //UxBRG = FPB/(4 * BAUDRATE) - 1//FPB = 24MHZ in current setup 
    //IEC1SET=0x0200;//Transmit Interrupt enable/ should not be needed 
    IEC1SET=0x0100;//Enable receive interrupt 
    U1STAbits.URXEN=1;//Receive Enable 
    U1MODEbits.ON=1;//Enable UART 
    U1STAbits.UTXEN=1;//Transmit Enable Enable TODO:Determine if needed for reach 
    U1STAbits.URXEN=1;//Receive Enable 
    //## End UART Setup 

    //** ADC Setup 
    //Behavior-Samples AN8 8 times automatically, then generates interrupt. Can read samples either in lower or upper half of buffer at a time. 
    ANSELCbits.ANSC2=0b1;//Set C2 as analog 
    TRISCbits.TRISC2=0b1;//Set C2 as input 
    AD1CON1bits.FORM=0b000;//16 bit integer result 
    AD1CON1bits.SSRC=0b111;//auto convert at end of sampling 
    AD1CON1bits.CLRASAM=0b1;//When interrupt happens, ASAM will automatically be cleared 
    AD1CON1bits.ASAM=0b1;//Auto start sampling at conversion end 
    AD1CON2bits.VCFG=0b000;//Use AVSS and AVDD as reference 
    AD1CON2bits.SMPI=0b1111;//Interrupt every 16th sample 
    AD1CON2bits.BUFM=0b0;//Buffer is not split 
    AD1CON3bits.ADCS=0b11;//TAD=4*TPB=167ns 
    AD1CON3bits.SAMC=0b01111;//Samples for 15 TAD=2.5uS 
    AD1CHSbits.CH0SA=0b1000;//Samples AN8 
    IEC0SET=0x10000000;//ADC1 INterrupt enable 
    AD1CON1bits.ADON=1;//Enable ADC 
    //## END ADC Setup 

    //**USB Setup 
    //TODO 
    //## END USB setup 

    //###END pin setup 

    //***Timer2 setup 
    //This will generate an interrupt every 10 ms to change the display. 
    T2CONbits.TCKPS=0b101;//1 Timer clock per 32 peripheral bus clocks 
    PR2=3750; //Interrupt flag every 10 ms at pbclk=24mhz 
    IEC0SET=0x0200;//Timer 2 Interrupt enable 
    T2CONbits.ON=0b1;//enable timer 

    asm("ei");//re-enable interrupts 
    return; 
} 
+0

1) 우리는 디버깅 서비스가 아닙니다. 2) "간단히 말하면, 와이어 연결 해제, TXEN 비활성화 및 TX IF는 하드웨어 또는 연결 문제가 아니며 ** PIC가 실제로 데이터를 미러링하고 있다는 것을 나타냅니다 **.그러나 ** PIC는 데이터 **를 받거나 데이터를 미러링하는 코드가 없으며 루프백이 활성화되어 있음을 깨닫지 못합니다. "- 모순되는 점이 무엇입니까? 3) 디버거 사용 – Olaf

+0

흐름을 확인 했습니까? USB 직렬 포트의 제어 문제 PIC32의 흐름 제어가 없으면 RTS와 CTS가 연결되어 있어야하며 DTR, DSR 및 CD를 연결해야합니다. 이것은 USB 직렬 장치의 일반적인 문제이며 다른 코드를 디버깅하기 전에 확인하십시오 – janm

+0

@Olaf 디버거를 사용하고 있는데 그 설명이 정확합니다. PIC는 데이터를 컴퓨터로 보내지 만 데이터가 어디서 온 것인지 표시하지 않습니다. 논리적으로는 처음부터 컴퓨터에서 논리적으로 만 올 수 있지만 데이터를받은 PIC의 상태 나 다른 레지스터에는 표시가 없습니다. – LucenNox

답변

0

는 I는 pic32mz을 사용하고 주변 선택 레지스터와 함께 I는 핀 방향을 설정. 예 :

//UART2_RXl 
TRISCbits.TRISC3 = 1; 
ANSELCbits.ANSC3 = 0; 
U2RXR = 0b1100; 
//UART2_TX 
TRISGbits.TRISG9 = 0; 
ANSELGbits.ANSG9 = 0; 
RPG9R = 0b0010;  
0

오류 인터럽트를 활성화하고 Rx ISR을 트리거하는 것을 볼 수 있습니까? 문제를 추적하는 데 도움이 될 수 있습니다.

IEC1bits.U1EIE = 1; 

그렇지는 마이크로 칩 주변 장치 라이브러리를 사용하고, 여기에 좋은 예가있다, 당신은 새로운 xc32 컴파일러에 따로 다운로드해야합니다.

https://people.ece.cornell.edu/land/courses/ece4760/PIC32/PLIB_examples/plib_examples/uart/uart_interrupt/source/uart_interrupt.c

플러스, 당신은 입력으로 수신 핀을 설정하는? PortC1에 있지만 입력으로 명시 적으로 설정하지 않습니다.