2017-02-23 6 views
1

RS485ポート経由でシリアル通信中に問題が発生しました。dsPic33E:RS485通信の問題

私はMax485でdsPic33Eマイクロコントローラを使用しています。私はコントローラに「は0x00」を送信するたびに、「の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"はコントローラで受信されました。

これは極性が逆になっているようです。データシートのU1MODEbits.URXINVおよびU1STAbits.UTXINVビット、またはファミリリファレンスマニュアル(http://ww1.microchip.com/downloads/en/DeviceDoc/70000582e.pdf)を参照してください。

+0

ありがとうございました。あなたの提案は、私が「micrcontrollerに関する問題を受け取った」ことを解決するのに役立ちました。しかし、私はまだマイクロコントローラから価値を伝えることができません。私は受信$送信にMax485を使用しています。あなたはそれで私を助けることができますか? – skg

関連する問題