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;
}
1) 우리는 디버깅 서비스가 아닙니다. 2) "간단히 말하면, 와이어 연결 해제, TXEN 비활성화 및 TX IF는 하드웨어 또는 연결 문제가 아니며 ** PIC가 실제로 데이터를 미러링하고 있다는 것을 나타냅니다 **.그러나 ** PIC는 데이터 **를 받거나 데이터를 미러링하는 코드가 없으며 루프백이 활성화되어 있음을 깨닫지 못합니다. "- 모순되는 점이 무엇입니까? 3) 디버거 사용 – Olaf
흐름을 확인 했습니까? USB 직렬 포트의 제어 문제 PIC32의 흐름 제어가 없으면 RTS와 CTS가 연결되어 있어야하며 DTR, DSR 및 CD를 연결해야합니다. 이것은 USB 직렬 장치의 일반적인 문제이며 다른 코드를 디버깅하기 전에 확인하십시오 – janm
@Olaf 디버거를 사용하고 있는데 그 설명이 정확합니다. PIC는 데이터를 컴퓨터로 보내지 만 데이터가 어디서 온 것인지 표시하지 않습니다. 논리적으로는 처음부터 컴퓨터에서 논리적으로 만 올 수 있지만 데이터를받은 PIC의 상태 나 다른 레지스터에는 표시가 없습니다. – LucenNox