Cordless Handset LCD is I2C Device

I’m working to understand how to control the LCD on the handset of an AT&T CL84209 landline phone system, and I started by observing the behavior of its eight IO pins (plus one pin already established to be ground) using the analog mode of my Saleae Logic 8 analyzer. Two pins were immediate candidates for a serial data pin and its corresponding clock pin, so I switched my analyzer to digital mode observing those two pins specifically.

Mouse hovering over the clock line, the analyzer software told me it started at a frequency of 7.2kHz and then sped up to 100kHz during the startup sequence. 100kHz is very promising, because it matches “Standard Mode” speed of I2C. The previous LCD controller I played with used a proprietary Sanyo protocol called CCB, but I’m hopeful this unknown chip uses Philips I2C. So in the spirit of “be sure to check the easy thing first” I activated I2C protocol analyzer built in to Saleae’s software. This presented a stream of decoded bytes and no sign of error.

Good news: it is indeed I2C!

Bad news: within less than ten seconds of powerup, there are 2569 captured and decoded messages. That is a lot of raw data to wade through when I don’t datasheets to make sense of it all. But the situation isn’t quite as bad as it initially looked. While I’ve tapped pins directly connected to the LCD, that doesn’t mean all the data we see on those lines are relevant. I2C is a data bus for multiple devices to communicate, and I see multiple addresses listed in the I2C decoder output.

I wanted to filter messages by address, but I failed to find such an option in Saleae software. Instead, I copied the data output into a Jupyter notebook and wrote a bit of quick-and-dirty Python to parse them. There were ten unique I2C addresses in this output:

{'0x52', '0x51', '0x50', '0x56', '0x3E', '0x53', '0x54', '0x55', '0x4B', '0x57'}

Scrolling through the decoder output, traffic to address 0x3E stood out because they were the longest. Many of these I2C messages had only one or two bytes, but some messages to 0x3E were much longer. The long messages have a pattern, they come in sets of three: two 18-byte messages followed by one with 19 bytes.

write to 0x3E ack data: 0x80 0x81 0x40 0x20 0x43 0x4F 0x4E 0x4E 0x45 0x43 0x54 0x49 0x4E 0x47 0x2E 0x2E 0x2E 0x20 
write to 0x3E ack data: 0x80 0xC1 0x40 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 
write to 0x3E ack data: 0x80 0x40 0x40 0x00 0x00 0x10 0x02 0x01 0x04 0x00 0x10 0x00 0x04 0x01 0x00 0x02 0x10 0x04 0x00 

These messages won’t have enough bits to control individual dots on the dot-matrix display. However, they might contain alphanumeric data for the LCD controller to use a font lookup table. Again, in the spirit of trying the easy thing first, I compared the first line of data against an ASCII chart.

0x800x810x400x200x430x4F0x4E0x4E0x450x430x540x49ox4E0x470x2E0x2Eox2E0x20
[?][?]@[space]CONNECTING...[space]

“CONNECTING…” is the first line displayed on the LCD! We have a winner, time to dig into traffic addressed 0x3E for this I2C LCD.

13 thoughts on “Cordless Handset LCD is I2C Device

  1. Hi, there,
    I found that my handset has eight I2C addresses:
    {‘0x52’, ‘0x51’, ‘0x50’, ‘0x56’, ‘0x53’, ‘0x54’, ‘0x55’, ‘0x57’}
    There are no ‘0x3E’ and ‘0x4B’ showing up as yours. Does it means that my handset LCD is not I2C , or the one in the 8 addresses may be the I2C address?
    I’d appreciate your help.

    Like

    1. Well, one thing is certain: data has to get to the LCD somehow. Beyond that… I don’t know enough to speculate about your handset. (I barely know enough to poke around my own!)

      Like

      1. my handset is also AT&T handset, and the LCD is very similar to yours. I see that you talk to your handset LCD using Arduino and wire library. Can we talk to the handset LCD using Raspberry PI 3b+ and python library? Did you ever try that?

        Like

  2. Another question: I see that you have unsoldered the LCD from the board. When you talk to the LCD, do you need to replicate the circuit of pin 6, pin 7 and pin 8, so that the LCD can still get the square waves? If yes, could you show the circuit diagram? thanks.

    Like

      1. thanks for the answers. do you know if the handset LCD has a driver with it? if yes, where is the LCD driver at? is it on the LCD itself or on the handset PCB board? also, where is the character set stored? is it stored on a memory of LCD driver itself or some place, like EEPROM, on the handset PCB board?

        Like

  3. so, you mean that all the DDRAM, CGRAM, and display drivers of the handset LCD module are integrated under the tiny epoxy blob, but not on the PCB board, correct?

    Like

  4. the wiring looks complicated. there are ESP8266, capacitors, resistors, and Arduino. the wiring picture is not clear, and it looks that you only connected 8 LCD pins but not 9. could you send me a clear circuit diagram, so that I may replicate the wiring connections?

    Like

      1. I see that you captured the 18-byte message to 0x3E:
        write to 0x3E ack data: 0x80 0x81 0x40 0x20 0x43 0x4F 0x4E 0x4E 0x45 0x43 0x54 0x49 0x4E 0x47 0x2E 0x2E 0x2E 0x20
        what does the first three-byte sequence, 0x80 0x81 0x40, mean? it looks like that 0x80 means “write to”, 0x81 means “start from first line”, and 0x40 means “show a 15 bytes of alphanumeric data on the LCD. what do you think the guess?

        Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s