LIN 2.0

LIN2.0 통신 프로그래밍 강좌 3 - 응답 송/수신

BLDC 2013. 2. 20. 13:01

 

● 응답 전송 (TX_STEP)

 

노드 자신이 응답 데이터를 전송하는 단계이다. 즉 노드 자신이 데이터의 발간자(publisher),생산자(producer)가 되는 것이다.

LIN에서는 자신이 보낸 데이터도 수신하므로 이전에 linStep이 PID_STEP에서 첫 전송 데이터 D0를 전송하고 linStep은 TX_STEP으로 전환했으므로, 전송이 완료되면 UART_RX 인터럽트가 발생하고, TX_STEP으로 전환된다. 인터럽트 서비스 루틴 UART_RX()이 수행되면 TX_STEP이 수행되며, 먼저 해야할 일은 전송한 데이터와 수신한 데이터가 같은지 조사하는 것이다. 만일 같으면 정상적으로 송신된 것으로 판단지만, 다르면 클러스터의 다른 노드와 동시에 데이터를 전송하려는 전송 충돌(collision)이 발생한 것이므로 오류 처리한다.

전송할 응답 데이터가 남아 있으면 계속 전송하고, check sum을 갱신한다. 응답 데이터를 모두 전송하면 마지막으로 check sum을 전송하고, 다음 linStep은 CRC_STEP으로 전환한다.

 

------------------------------------------------------------------------------------------------

else if (linStep == TX_STEP){

if (RX_BUFFER != tx_data[txCount])
{

// 수신한 데이터가 송신한 데이터와 같이 않으면 오류처리

.....

}

else

{

txCount++;

 

// 전송할 데이터 남음.

if (txCount < dataLength)

{

TX_BUFFER = tx_data[txCount];    // 데이터 전송

 

checkSum += tx_data[txCount];    // 첵섬 갱신

if (checkSum > 255)

checkSum = checkSum - 256 + 1;

}

 

// 응답 데이터 전송 완료, checkSum 전송

else

{

checkSum &= 0x00ff;

checkSum ^= 0x00ff;    // checkSum 반전

TX_BUFFER = checkSum;    // checkSum 전송

 

linStep = CRC_STEP;  // 다음 단계 전환

}

}

}

------------------------------------------------------------------------------------------------

 

● 첵섬 수신 (CRC_STEP)

 

이 부분은 TX_STEP에서 마지막으로 보낸 첵섬을 수신하였을 때 수행된다. 우선 전송한 첵섬과 수신한 데이터가 다르면 버스 충돌(collision)로 판단하고 오류처리한다. 두 데이터가 같으면 전송을 성공적으로 마친 것으로 판단하고, dormant 상태(BREAK_STEP)로 전환한다.

------------------------------------------------------------------------------------------------

else {  //linStep == CRC_STEP

if (RX_BUFFER == checkSum)

{

// 응답 데이터 전송 완료

....... // 전송 완료 처리

}

 

// 버스 충돌

else

{

// 오류처리

....

}

 

linStep = BREAK_STEP;

}

 

------------------------------------------------------------------------------------------------

 

● 응답 수신 (RX_STEP)

 

다른 노드나 마스터에서 전송하는 메시지의 응답 데이터를 수신하는 단계이다. 즉 노드 자신이 수신하는 데이터의 구독자(subscribe), 소비자(consumer)가 된다.

응답 데이터를 수신하면 임시 저장소 rx_data[]에 저장하고, 매 바이트마다 check sum을 계산한다. 수신할 데이터의 길이 dataLength(PID_STEP에서 결정) 만큼 수신되면 마지막으로 check sum을 수신한다. 수신한 check sum과 계산된 check sum이 같으면 수신 데이터를 임시 저장소 rx_data[]에서 수신 메시지 저장소 RX_DATA[]로 일괄 복사한다. 만일 첵섬이 틀리면 오류로 처리한다.

첵섬까지 수신 처리하면 다음 프레임 수신을 위해 BREAK_STEP로 전환한다.

 

------------------------------------------------------------------------------------------------

else if (linStep == RX_STEP)

{

if (rxCount < dataLength)    // 응답 데이터 수신

{

rx_data[rxCount] = RX_BUFFER;    // 수신 데이터 저장

 

checkSum += rx_data[rxCount];

if (checkSum > 255)

checkSum = checkSum - 256 + 1;

}

else    // check sum 수신

{

if (checkSum + RX_BUFFER == 255)    // check sum 맞음.

{

for(i=0; i<dataLength; i++)

RX_DATA[i] = rx_data[i]; // 수신 프레임 저장

....... // 메시지 수신 처리 신호

 

}

else

{

// 계산한 것과 수신한 check sum이 틀림

// 오류처리

.....

}

 

// 응답 데이터 수신 완료, dormant 상태로 전환

.....

}

}

 

------------------------------------------------------------------------------------------------