發新話題
打印

C8051F530 LIN SLAVE 回傳問題

C8051F530 LIN SLAVE 回傳問題

您好:
    問題:我在實驗LIN SLAVE端接收傳送資料,碰到SLAVE無法回傳給MASTER。
    MCU:C8051F530
   LIN BUS Protocol:
      Master端(傳送):0x3c  0x01  0x02  0x03  0x04  0x05  0x06  0x07  0x08
     Slave端(回傳) : 0x3d  0x11  0x12  0x13  0x14  0x15  0x16  0x17  0x18
   動作描述:
      1. Master端傳送資料給Slave端  
      2. Slave端接收到完整資料
      3. Slave端比對接收資料無誤,回傳資料給Master端(附上的程式監視不到回傳的資料)
   
   請問Slave端回傳資料給Master端程式流程那裡出問題?
    期待您的回信,謝謝!

   程式內容如下:只附上LIN中斷內容,其餘主程式是複製silabs的example code
unsigned char buf[8];
INTERRUPT (LIN0_ISR, INTERRUPT_LIN)
{
  static U8 ID, status;
  U8 i, ctrl;
  LINADDR = LIN0ST;
  status = LINDATA;

  if (status & LININTREQ)             // If LIN interrupt request
  {
    if(status & DTREQ)               // If ID field received
    {
      LINADDR = LIN0ID;
      ID = LINDATA;
      switch(ID)
      {
        case 0x3c :
           LINADDR = LIN0CTRL;        
           LINDATA &= ~TXRX;          // Select to receive data
                      
                 LINADDR = LIN0SIZE;
                 LINDATA = (LINDATA & 0xF0) | 0x08;  //receive 8 data byte
          break;
        default :
          break;
       }
    }
    else if(status & DONE)           // If reception or transmission completed
    {
       LINADDR = LIN0CTRL;
       ctrl = LINDATA;
       // If in recieve mode and ID is correct
       if ((ctrl & TXRX) == 0)
       {
              switch(ID) {
                case 0x3c :
             // Reception complete from Master
             for(i = 0; i < 8; i++) {
                       LINADDR = i;
                       buf = LINDATA;
                     }
                     // 準備回傳
                      if((buf[0] == 0x01) &&
                        (buf[1] == 0x02) &&
                        (buf[2] == 0x03) &&
                        (buf[3] == 0x04) &&
                        (buf[4] == 0x05) &&
                        (buf[5] == 0x06) &&
                        (buf[6] == 0x07) &&
                        (buf[7] == 0x08)) {
               
                LINADDR = LIN0CTRL;           
                LINDATA |= TXRX;              // Select to transmit data
         
                LINADDR = LIN0ID;
                LINDATA = 0x3d;                // LIN ID
         
                LINADDR = LIN0SIZE;
                LINDATA = (LINDATA & 0xF0) | 0x08;   // Transmitting 8 byte
         
                LINADDR = LIN0DT1;
                LINDATA = 0x11;                                                               
                LINADDR = LIN0DT2;
                LINDATA = 0x12;                                                                                          
                LINADDR = LIN0DT3;
                LINDATA = 0x13;                                                                  
                LINADDR = LIN0DT4;
                LINDATA = 0x14;                                                                  
                LINADDR = LIN0DT5;
                LINDATA = 0x15;                                                                  
                LINADDR = LIN0DT6;
                LINDATA = 0x16;                                                               
                LINADDR = LIN0DT7;
                LINDATA = 0x17;                                                                  
                        LINADDR = LIN0DT8;
                LINDATA = 0x18;                                                                    }
                  break;                          
                default :
                  break;
              }
      }
    }
  }
  LINADDR = LIN0CTRL;         
  LINDATA |= DTACK;                   // Acknowledge data

  LINADDR = LIN0CTRL;
  LINDATA |= 0x0C;                    // Reset interrupt request, error flag
}

TOP

您可以 交叉比對~ master的 INT 程式的內容~ 應該是這邊出了問題

TOP

發新話題