2017-02-23 91 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