2017-02-23 97 views
1

我在通過RS485端口串行通訊時遇到問題。dsPic33E:RS485通訊問題

我正在使用帶有Max485的dsPic33E微控制器。

使用斷點我分析說,每當我送「0×00」到控制器,「0xFF的」被接收。然後我發送「0x01」,「0xFD」在controller.and上被接收。

此外,我試圖使用回送邏輯,意味着發回收到的字符,但每次我收到「0x00」發送的任何值。

我無法解決問題。以下是我正在使用的代碼的快照:

// RS485 
TRISBbits.TRISB6 = INPUT_PIN;  // RX - RB6/RP38 PIN<42> 
TRISBbits.TRISB7 = OUTPUT_PIN;  // TX - RB7/RP39 PIN<43> 
TRISBbits.TRISB8 = OUTPUT_PIN;  // !RE/DE Control Pin RB8/RP40 PIN<44> 

// RS485 Config 
#define RS485_TX PORTBbits.RB6   // RS485 Transmitter 
#define RS485_RX LATBbits.LATB7   // RS485 Reciever 
#define RS485_CTRL LATBbits.LATB8   // RS485 Control Pin 

void __attribute__((interrupt, no_auto_psv)) _U4RXInterrupt(void) 
{ 
    rs485Char = U4RXREG; 
    RS485_CTRL = 1;   // Enable driver 
    U4TXREG = rs485Char; 
    RS485_CTRL = 0;   // disable driver RE/DO 
} 

void InitClock(void) 
{ 
    PLLFBD = 63;      // M=65 
    CLKDIVbits.PLLPOST = 0;   // N2=2 
    CLKDIVbits.PLLPRE = 0;   // N1=2 

    // Initiate Clock Switch to FRC oscillator with PLL (NOSC=0b001) 
    __builtin_write_OSCCONH(0x01); 
    __builtin_write_OSCCONL(OSCCON | 0x01); 
    // Wait for Clock switch to occur 
    while (OSCCONbits.COSC!= 0b001); 
    // Wait for PLL to lock 
    while (OSCCONbits.LOCK!= 1); 
} 

void InitRs485(void){ 
      // configure U1MODE 
U4MODEbits.UARTEN = 0;  // Bit15 TX, RX DISABLED, ENABLE at end of func 

U4MODEbits.URXINV = 1;  // 1:URXINV Idle state is '0' ; 0=UxRX Idle state is '1'; 
U4MODEbits.ABAUD = 0;  // Bit5 No Auto baud (would require sending '55') 
U4MODEbits.BRGH = 0;  // Bit3 16 clocks per bit period 
U4MODEbits.PDSEL = 0;  // 0 : 8 bit,no parity; 1 : 8 bit,even parity; 2 : 8 bit,odd parity; 3 : 9 bit,no Parity 
U4MODEbits.STSEL = 1;  // 1 : 2 Stop bits; 0 : 1 Stop bits 

// Load a value into Baud Rate Generator. 
U4BRG = BRGVAL_RS485;    // 60Mhz osc, 9600 Baud 

// Load all values in for U1STA SFR 
U4STAbits.UTXISEL1 = 0;  // Bit15 Int when Char is transferred (1/2 config!) 
U4STAbits.UTXISEL0 = 0;  // Bit13 Other half of Bit15 
U4STAbits.UTXINV = 1;  // 1:UxTX Idle state is '0' ; 0=UxTX Idle state is '1'; 

U4STAbits.UTXBRK = 0;  // Bit11 Disabled 
U4STAbits.UTXEN = 0;  // Bit10 TX pins controlled by peripheral 
U4STAbits.URXISEL = 0;  // Bits6,7 Int. on character received 

IPC22bits.U4RXIP = 7; 
IPC22bits.U4TXIP = 7; 

IFS5bits.U4TXIF = 0;  // Clear the Transmit Interrupt Flag 
IEC5bits.U4TXIE = 1;  // Enable Transmit Interrupts 
IFS5bits.U4RXIF = 0;  // Clear the Receive Interrupt Flag 
IEC5bits.U4RXIE = 1;  // Enable Receive Interrupts 

RPOR2bits.RP39R = 0x1D;  // dsPic33EP512GM604 => RP39 as U4TX PIN<43> 
_U4RXR = 38;    // dsPic33EP512GM604 => RP38 as U4RX PIN<42> 

U4MODEbits.UARTEN = 1;  // And turn the peripheral on 
U4STAbits.UTXEN = 1; 

// Hardware control bits 
RS485_CTRL = 0;      // disable driver 
IEC5bits.U4RXIE = 1; 

} 

int main(int argc, char** argv) { 

InitClock(); // This is the PLL settings 
InitPorts(); // Configure all Input/Output Ports 
InitUarts(); // Initialize UART1 for 9600,8,N,1 TX/RX 

Rs485Initialise(0x10, 0x10); 

while(1) 
{    

} 

return (EXIT_SUCCESS); 
} 

這是一個測試代碼。實際的通信將使用Modbus協議。 請幫我解決問題。

回答

3

`每當我向控制器發送「0x00」時,都會收到「0xFF」。然後我發送「0x01」,在控制器上收到「0xFD」。

這似乎表明您的極性是相反的。請參閱數據表或系列參考手冊(http://ww1.microchip.com/downloads/en/DeviceDoc/70000582e.pdf)中的U1MODEbits.URXINV和U1STAbits.UTXINV位。

+0

感謝Mathiew。你的建議幫助我解決了「在微控制器上接收問題」。但是我仍然無法從微控制器傳輸數據。我使用Max485接收$傳輸。你能幫助我嗎? – skg