单片机/MCU论坛
直播中

realmh

2年用户 5经验值
擅长:制造/封装
私信 关注
[问答]

DSPIC33FJ32GP204串口通讯失败,求解

以下程序运行时,电脑串口可以收到测试板发出的字符串,但是还没从电脑向测试板发出字符时,接收中断就响应了一次。再从从电脑向测试板发出字符时,接收中断就没反应了。
作为一个新手,特向各位老师求教,程序是哪里有错误呢?

#include

_FOSCSEL(FNOSC_PRI);            // 外部晶振

_FOSC(FCKSM_CSDCMD & OSCIOFNC_ON  & POSCMD_XT);  
                                // Clock Switching is disabled and Fail Safe Clock Monitor is disabled
                                // OSC2 Pin Function: OSC2 is Clock Output
                                // Primary Oscillator Mode: XT Crystal



#define FCY 4000000          //外部晶振频率Fin=Fosc=8MHz,Fcy=Fosc/2
#define BAUDRATE 9600         //设定波特率
#define BRGVAL ((FCY/BAUDRATE)/16)-1

#define SENSE PORTCbits.RC2
#define LED PORTCbits.RC1
#define TEACH PORTBbits.RB9
#define DIST_ON PORTBbits.RB8

const char commandsendT[]="Send T to continue.rn";    //设置回传的字符串
const char recv='T';                //设置接收比较的字符

unsigned int recdata;// 接收数据寄存器




void __attribute__((__interrupt__, no_auto_psv)) _U1RXInterrupt(void)
{
    while(U1STAbits.URXDA==1)
{
    IFS0bits.U1RXIF = 0;
    recdata=U1RXREG;// 接收数据并存储
    LED=1;      //点亮
    U1TXREG=recdata;// 返送接收到的数据
}

}




void UART_Init()
{

    // configure U1MODE
    U1MODEbits.UARTEN = 0;    // Bit15 TX, RX DISABLED, ENABLE at end of func
    //U1MODEbits.notimplemented;    // Bit14
    U1MODEbits.USIDL = 0;    // Bit13 Continue in Idle
    U1MODEbits.IREN = 0;    // Bit12 No IR translation
    U1MODEbits.RTSMD = 0;    // Bit11 Simplex Mode
    //U1MODEbits.notimplemented;    // Bit10
    U1MODEbits.UEN = 0;        // Bits8,9 TX,RX enabled, CTS,RTS not
    U1MODEbits.WAKE = 0;    // Bit7 No Wake up (since we don't sleep here)
    U1MODEbits.LPBACK = 0;    // Bit6 No Loop Back
    U1MODEbits.ABAUD = 0;    // Bit5 No Autobaud (would require sending '55')
    U1MODEbits.URXINV = 0;    // Bit4 IdleState = 1  (for dsPIC)
    U1MODEbits.BRGH = 0;    // Bit3 16 clocks per bit period
    U1MODEbits.PDSEL = 0;    // Bit1 Bit2 8bit, No Parity
    U1MODEbits.STSEL = 0;    // Bit0 One Stop Bit

    U1BRG = BRGVAL;   

    // Load all values in for U1STA SFR
    U1STAbits.UTXISEL1 = 0;    //Bit15 Int when Char is transferred (1/2 config!)
    U1STAbits.UTXINV = 0;    //Bit14 N/A, IRDA config
    U1STAbits.UTXISEL0 = 0;    //Bit13 Other half of Bit15
    //U1STAbits.notimplemented = 0;    //Bit12
    U1STAbits.UTXBRK = 0;    //Bit11 Disabled
    U1STAbits.UTXEN = 0;    //Bit10 TX pins controlled by periph
    U1STAbits.UTXBF = 0;    //Bit9 *Read Only Bit*
    U1STAbits.TRMT = 0;    //Bit8 *Read Only bit*
    U1STAbits.URXISEL = 0;    //Bits6,7 Int. on character recieved
    U1STAbits.ADDEN = 0;    //Bit5 Address Detect  Disabled
    U1STAbits.RIDLE = 0;    //Bit4 *Read Only Bit*
    U1STAbits.PERR = 0;        //Bit3 *Read Only Bit*
    U1STAbits.FERR = 0;        //Bit2 *Read Only Bit*
    U1STAbits.OERR = 0;        //Bit1 *Read Only Bit*
    U1STAbits.URXDA = 0;    //Bit0 *Read Only Bit*

    IPC2bits.U1RXIP = 0b100;   //接收中断优先级设置为4  
    IPC3bits.U1TXIP = 0b101;      // U1TXIP 发中断优先级:5级 Mid Range Interrupt Priority level, no urgent reason

    IFS0bits.U1TXIF = 0;    // Clear the Transmit Interrupt Flag
    IEC0bits.U1TXIE = 0;    // Disable Transmit Interrupts
    IFS0bits.U1RXIF = 0;    // Clear the Recieve Interrupt Flag
    IEC0bits.U1RXIE = 1;    // Enable Recieve Interrupts

    U1MODEbits.UARTEN = 1;    // And turn the peripheral on
    U1STAbits.UTXEN = 1;

}



void Ports_Init()
{

    TRISCbits.TRISC2 = 1;  //设置RC2为输入,RC2为采集电平输入
    TRISCbits.TRISC1 = 0;  //设置RC1为输出,RC1为状态灯输出

    TRISBbits.TRISB2 = 1;  //设置RB2为输入,RXD
    TRISBbits.TRISB3 = 0;  //设置RB3为输出,TXD

    RPOR1bits.RP3R = 0b00011;   //选择为TX模式,设置24脚RB3作为串口输出
    RPINR18bits.U1RXR = 0b00010; //设置23脚RP2/RB2作为串口输入
   
   
}


void waitsendT(const char commandsendT[])
{    while(*commandsendT)
    {
        U1TXREG=*commandsendT;
        while(!(U1STAbits.TRMT));    //TRMT=0,说明发送缓冲器TXREG的数据装满TSR,字节发送结束后TSR为空,此时TRMT=1
        commandsendT++;
    }


}


int main(void)
{
    UART_Init();    // Initialize UART1 for 9600,8,N,1 TX/RX

    Ports_Init();    //
   

    waitsendT(commandsendT);


    while(1){;// 等待中断
                    }
}




已退回1积分

回帖(1)

realmh

2022-1-25 17:14:59
本帖最后由 realmh 于 2022-1-27 09:46 编辑

补充故障现象:程序运行到“U1MODEbits.UARTEN = 1;”后,IFS4的U1EIF为1(U1EIF: UART1 Error Interrupt Flag Status bit,1 = Interrupt request has occurred)。

请哪位高手给指点一下,谢谢!

举报

更多回帖

发帖
×
20
完善资料,
赚取积分