微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 跪求指点

跪求指点

时间:10-02 整理:3721RD 点击:
我将3485芯片与149单片机的相连,用modbus协议进行通讯,用异步通信串口0来接受数据,程序里头用定时器中断来定时收完8个字节,之后进行数据处理(CRC之类的)
max3485初始化程序为:
bool Init_Max3485(void)
{
  ME1 |= (UTXE0 + URXE0); // Enable USART0 TXD/RXD
UCTL0 = CHAR + SPB + SWRST; //  8位数据 两位停止位  无校验
  UTCTL0 |= SSEL0;// UCLK = ACLK
  URCTL0 |= 0x08; // sleep mode
  UBR00 = 0x41;   
  UBR10 = 0x03;   // 波特率设置为9600
//  UMCTL0 = 0x00;  // no modulation
  UCTL0 &= ~SWRST;   // Initialize USART state machine
IE1 |= URXIE0 + UTXIE0;  // 使能接受和发送中断

  IFG1&=~UTXIFG0;//使UTXIFG0复位
  return true;
}
然后处理的程序为:串口中断为:
#pragma vector = UART0RX_VECTOR               //串口0接收中断函数
__interrupt void Uart0Rx_Isr(void)
{
//    CCR1 =TARA+5000;        //CCR1中断允许
    TACTL|=TACLR;           //ACLK,清TAR  
    CCTL1 &=(~CCIFG);
    CCTL1|=CCIE;   
    receBuf[receCount]= RXBUF0;
    receCount++;          //接收地址偏移寄存器加1   
}   
定时器A1中断处理
#pragma vector = TIMERA1_VECTOR                         //定时器A1中断函数
__interrupt void Timer_A1_Isr(void)
{
      TACTL|=TACLR;
      CCR1 =TAR+1000;        //CCR1中断允许
         if(receCount==8)
         {
           receTimeOut++;
            if(receTimeOut>=1)
            {
            receTimeOut=1;
            MAX3485_TRNS_ENA();       //将485置为发射状态
            }
         }
            CCTL1 &=(~CCIE);
            CCTL1 &=(~CCIFG);      
//     UART_ENTER_SLEEPA();
}
其他的程序太多感觉跟我遇到的问题关系不大,现在的问题就是,我用串口调试器通讯的时候总通讯不成功,总提示超时,波特率之类的设置应该也没问题,我从串口调试器读数据的时候 发送的是01 03 00 01 00 01 D5 CA , 这是8个字节,按道理说,我的单片机串口应该会进入8次中断,但是就是只进去一次中断,并且进去的这一次中断收到的数跟发送的数也对不上,
都困扰死我了,还望高手给予指教,谢谢了!

电路连接图


这是串口调试精灵的图,读数据的时候总是提示超时,就是连不通,写数据也是这样

串口调试图


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top