Need help. Similer to LIN but not LIN?

I have a GM15042969 key-less entry receiver and GM15042968 key-fob that i scavenged from an 02 Chevy Tahoe that I'm wanting to use to start/stop my generator in my RV. the signals coming out of the receiver should be easy enough to recognize with the Arduino, but I'm trying to figure out if this is some proprietary protocol or something already established. being that its a rolling code key-fob and that there's only one "data" wire on the receiver my first thought was LIN because it connected to the body control module and there has to be a way to tell the receiver to "learn" new key-fobs.
it appears each bit is 10ms long for 14 bits total.
it looks like LIN but is missing the sync, identifier, and checksum frames if it is LIN. any help, thoughts and/or advice is greatly appreciated :slight_smile:

From my understanding, these keyless fobs uses something like this

Mouser doc

thanks for the info. the fob is not the issue tho.
the fob itself is working flawlessly with the receiver. whats on the scope is whats coming out of the receiver and im trying to figure out what this protocol is that the receiver is using. i would like to figure out how to tell the receiver to learn a new key fob. only 3 wires on the receiver gnd, pwr, and data. the data line is constantly held high and can be pulled low, but i don't know what to send it to tell it to learn a new rolling code fob


Looks like 7 LOW bits, 1 HIGH bit, and 6 bits of data. Or possibly 7 LOW bits and 7 bits of data.

You should get
7F (1111111) if there is a timeout.
49 (1001001) for the red oval button
6E (1101110) for the grey oval button
5B (1011011) for the grey round button

const byte CommPin = 4; // Pick a data pin

byte Receive()
  byte value = 0;
  unsigned long waitStart = millis();
  // Wait for the pin to go low or a timeout
  while (digitalRead(CommPin) == HIGH &&
         millis() - waitStart < 5000) {};

  // Since the non-delay() code takes some
  // time, we aim to start sampling a little
  // before the cengter of the 8th bit.

  for (int i = 0; i < 7; i++)
    value <<= 1;
    value += digitalRead(CommPin);
  return value;

void Send(byte value)
  // Send the 70ms of LOW
  pinMode(CommPin, OUTPUT);

  for (int i = 6; i >= 0; i--)
    if (value & _BV(i))
      pinMode(CommPin, INPUT); // HIGH
      pinMode(CommPin, OUTPUT); // LOW

  pinMode(CommPin, INPUT); // idle HIGH

void setup()

  pinMode(CommPin, INPUT);
  digitalWrite(CommPin, LOW);

void loop()
  Serial.println(Receive(), HEX);

thank you! i will try this out today. might be a few days or more before i can get back and let you know how it works out...reverse engineering is never easy lol. thank
you again for helping!

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.