dsPic33E:RS485 通信问题

dsPic33E : RS485 Communication issue

我在通过 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 协议。 请帮我解决这个问题。

`Whenever I send "0x00" to controller, "0xFF" is received. Then I sent "0x01", "0xFD" is received on controller.

这似乎表明你的极性颠倒了。请参阅数据表或系列参考手册 (http://ww1.microchip.com/downloads/en/DeviceDoc/70000582e.pdf) 中的 U1MODEbits.URXINV 和 U1STAbits.UTXINV 位。