485通信收不到数据,求支招

2019-08-01 14:06发布

代码如下:

#include <msp430f149.h>
#include "AD_convert.h"

#define DRE_out     P3DIR |= BIT3     //连接485芯片的DE,RE端口的IO设置为输出状态
#define DE          P3OUT |= BIT3     //设置485芯片处于发送状态
#define RE          P3OUT &= ~BIT3    //设置485芯片处于接收状态

void Init_UART1(void);

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  DRE_out;

  Init_UART1();
  _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/ interrupt
/*    while (1)
    {
        TXBUF1 = 0xAA;
        while(!(IFG2 & UTXIFG1));         //等待发送结束
        IFG2 &= ~UTXIFG1;
    }
  */
}


/*******************************************
函数名称:Init_UART0
功    能:设置MCU的UART0对应的寄存器
参    数:无
返回值  :无
********************************************/
void Init_UART0(void)
{
  P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
  ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD
  UCTL0 |= CHAR;                            // 8-bit character
  UTCTL0 |= SSEL0;                          // UCLK = ACLK
  UBR00 = 0x03;                             // 32k/9600 - 3.41
  UBR10 = 0x00;                             //
  UMCTL0 = 0x4A;                            // Modulation
  UCTL0 &= ~SWRST;                          // Initialize USART state machine
  IE1 |= URXIE0;                            // Enable USART0 RX interrupt
}


/*******************************************
函数名称:Init_UART1
功    能:设置MCU的UART1对应的寄存器
参    数:无
返回值  :无
********************************************/
void Init_UART1(void)
{
    P3SEL |= 0xC0;                            //将P3.6,P3.7选做UART1的通信端口
    ME2 |= UTXE1 + URXE1;                     //使能USART1的TXD和RXD
    UCTL1 |= CHAR;                            //选择8-bit字符
    UTCTL1 |= SSEL0;                          //驱动时钟选择ACLK
    UBR01 = 0x03;                             // 32k/9600 - 3.41
    UBR11 = 0x00;                             //
    UMCTL1 = 0x4A;                            // Modulation
    UCTL1 &= ~SWRST;                          //初始化UART状态机
    IE1 |= URXIE1;                            // Enable USART0 RX interrupt
}

// UART0 RX ISR will for exit from LPM3 in Mainloop
#pragma vector=USART0RX_VECTOR
__interrupt void usart0_rx (void)
{
  _BIC_SR_IRQ(LPM3_bits);                   // Clear LPM3 bits from 0(SR)
}

#pragma vector=USART1RX_VECTOR
__interrupt void usart1_rx (void)
{
  while (!(IFG2 & UTXIFG1));                // USART1 TX buffer ready?
  DE;                                       //发送
  TXBUF1 = RXBUF1;
  while (!(IFG2 & UTXIFG1));                //等待发送结束
  RE;                                       //接收
}

测试时MCU向PC发数据,PC能收到,但是PC向MCU发数据,好像没反应。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
dirtwillfly
1楼-- · 2019-08-02 16:29
在void Init_UART1(void)初始化函数中:
    IE1 |= URXIE1;                            // Enable USART0 RX interrupt

这句代码是不是有问题?会不会是IE2 |= URXIE1;?
小小小小白
2楼-- · 2019-08-02 18:08
 精彩回答 2  元偷偷看……
小小小小白
3楼-- · 2019-08-02 23:18
dirtwillfly 发表于 2014-11-12 08:26
在void Init_UART1(void)初始化函数中:
    IE1 |= URXIE1;                            // Enable USART0 ...

现在能进入中断了。但是同样的代码用232能实现通信,485却不行。您看一下中断服务函数的代码。
#pragma vector=USART1RX_VECTOR
__interrupt void usart1_rx (void)
{
  DE;                                       //发送
  TXBUF1 = RXBUF1;                          // RXBUF1 to TXBUF1
  while (!(IFG2 & UTXIFG1));                // USART1 TX buffer ready?
  RE;                                       //接受
}
dirtwillfly
4楼-- · 2019-08-03 03:18
小小小小白 发表于 2014-11-12 11:16
现在能进入中断了。但是同样的代码用232能实现通信,485却不行。您看一下中断服务函数的代码。
#pragma v ...

只看代码看不出什么的。
:funk:

能进入中断了,就可以慢慢调试。看数据传递是否正确,还有寄存器变化
longquanboy
5楼-- · 2019-08-03 06:53
没有用过这个芯片,只是程序中while (!(IFG2 & UTXIFG1)),是不是状态位错了哦,我看你收与发都是判断的同一个状态位,只是怀疑
小小小小白
6楼-- · 2019-08-03 08:30
现在问题基本解决了。但是又遇到一个奇怪的问题。一个数据要发两次才能成功,发一次的话PC就收不到,请问这是什么原因啊?

一周热门 更多>