SENT 메시지는 Falling edge 사이의 시간을
기반으로 데이터를 송수신합니다.
프로토콜(Protocol)의 타이밍은
Transmitter와 Receiver 사이에 약속된 시간을 기반으로 동작합니다.
(Tick 타임의 약속)
이것을 Ttick이라고 하며, Ttick은 3~90us 값을 사용할 수 있습니다.
SENT 통신은 1개의 선을 이용하여 통신하기 때문에
Transmitter와 Receiver가 서로 동일한 Ttick을 사용해야만 합니다.
(마치 UART 통신을 할 때 정해진 속도로만
통신을 하는 것과 동일합니다.)
"Ttick의 변동 범위"
SENT 통신에서는 Ttick 최대 20%까지 변동되어도 통신이 가능해야 합니다.
이러한 스펙(Specification)이 있는 이유는 시간이나 온도에 따른 Clock이 변할 수 있기 때문입니다.
SENT 메시지(Message)는 아래와 같이 구성됩니다.
"SENT Message Format"
Sync Period: 56 Tick
Status: 12~27 Tick
Data: 12 ~27 Tick
CRC: 12 ~ 27 Tick
Pause(Optional): 12~768 Tick
SENT Message Format은
Sync period부터 CRC까지로 구성됩니다.
(Pause는 Optional)
"Sync period"
Sync period는 메시지 프레레임의 시작을 의미하며,
Transmitter와 receiver 사이에 Ttick의 동기를 위해 사용됩니다.
Sync period에서
Transmit 모드에서는
5Tick 동안 low를 유지하고, 51Tick 동안 High를 유지합니다.
5Tick 동안 Low를 유지하면 Receiver에서는
5Tick 동안 Low 값의 시간으로 SENT 통신 속도를 알 수 있습니다.
"Status"
Sync puls 다음에 4bit로 구성되는 status는
Device의 상태(Status), Identification 또는
데이터처럼 사용할 수 있습니다.
Status는 데이터와 동일한 형태로 사용됩니다.
"Data"
Status 다음에는 최소 1개에서 최대 6개의 데이터로 구성됩니다.
각각은 4bit로 구성되며 0x00~0x0F까지 표현합니다.
Transmit 모드에서 5Tick 동안 low로 유지 후
나머지 시간 동안 7~22 Tick을 High로 유지하여 데이터를 표현합니다.
0x00은 5Tick 동안 Low 유지 후 7Tick 동안 High 유지
0x01은 5Tick 동안 Low 유지 후 8Tick 동안 High 유지
0x02는 5Tick 동안 Low 유지 후 9Tick 동안 High 유지
0x03은 5Tick 동안 Low 유지 후 10Tick 동안 High 유지
0x04는 5Tick 동안 Low 유지 후 11Tick 동안 High 유지
0x05는 5Tick 동안 Low 유지 후 12Tick 동안 High 유지
0x06은 5Tick 동안 Low 유지 후 13Tick 동안 High 유지
0x07은 5Tick 동안 Low 유지 후 14Tick 동안 High 유지
0x08은 5Tick 동안 Low 유지 후 15Tick 동안 High 유지
0x09은 5Tick 동안 Low 유지 후 16Tick 동안 High 유지
0x0A은 5Tick 동안 Low 유지 후 17Tick 동안 High 유지
0x0B은 5Tick 동안 Low 유지 후 18Tick 동안 High 유지
0x0C은 5Tick 동안 Low 유지 후 19Tick 동안 High 유지
0x0D은 5Tick 동안 Low 유지 후 20Tick 동안 High 유지
0x0E은 5Tick 동안 Low 유지 후 21Tick 동안 High 유지
0x0F은 5Tick 동안 Low 유지 후 22Tick 동안 High 유지
"CRC"
CRC는 Data 이후에 전송되며,
6개 데이터에 대한 4bit CRC로 만들어집니다.
"CRC의 Polynomial"
CRC의 Polynomial은
x^4 + x^3 + x^2 + 1을 사용합니다.
(Seed value는 '0101' 사용)
#define NUM_NIBBLES 6 // Array holding received nibbles rec_data[NUM_NIBBLES]; // CRC lookup table crc_table = {0,13,7,10,14,3,9,4,1,12,6,11,15,2,8,5}; // Initialize checksum to seed value Checksum = 5; // For each data nibble, bit-wise XOR with lookup value from table for(i=0;i<NUM_NIBBLES;i++) { Checksum = rec_data[i] ^ crc_table[Checksum]; } // Bit-wise XOR with additional 0 value Checksum = 0 ^ crc_table[Checksum]; |
CRC 코드 Example
참조: dsPIC33/PIC24 FRM, Single-Edge Nibble Transmission (SENT)
"SENT Message의 예제"
SENT 메시지 프레임은 항상 Status와 CRC를 사용합니다.
따라서 가장 짧은 메시지 프레임은
1개 데이터를 가지게 됩니다.
이때 1개 메시지 프레임은 Sync + Status + Data + CRC로 구성됩니다.