Sanyo CCB Close Enough to SPI For Logic Analyzer
I'm examining the control signals for a Sanyo LC75853N LCD driver chip, which uses a Sanyo proprietary protocol they call CCB. (Computer Control Bus.) It's popular enough that I could find CCB reference material online, but it's not popular enough to be natively understood by Saleae's Logic Analyzer software. Beyond Saleae's set is a list of Community Shared Analyzers but Sanyo CCB didn't make the cut there, either. Those additional analyzers were written using Saleae's Protocol Analyzer SDK so there is the option to write one for CCB. For the purpose of initial experimentation, though, their default SPI analyzer is close enough.

Before we even try using the SPI analyzer, we can look at the raw data. CCB transmits the peripheral address before raising CE. Here I can see 0x42 hexadecimal, or 0b01000010 binary. (The white binary numbers were not part of Saleae software, I drew it in afterwards.) In an unfortunate bit of coincidence, this binary value is symmetric so it alone couldn't tell us if CCB transfer least-significant bit first or most-significant-bit first. According to spec, it is least-significant-bit first. Seeing this gave me the confidence I've wired up everything correctly for further probing.
The clock pulses measured out to be in the ballpark of 400kHz, which I can probably work with. But more importantly, I was relieved to see that the clock pulse widths varied somewhat between transmitted bits. This is encouraging because it meant the protocol is graceful under irregular clock pulses, making it more likely I can successfully communicate using CCB in software. Which is great because I don't have dedicated CCB communication peripheral hardware.
The next step was to activate SPI analyzer with the following parameters. The biggest difference between CCB and SPI is the behavior of CE line, and thankfully Saleae's SPI analyzer can be configured to ignore CE. ("Enable" set to "None".) I set the SPI analyzer options to the following values to decode all the values regardless of CE status:
SPI Analyzer Option | Value |
---|---|
MOSI | LCD-DI |
MISO | LCD-DO |
Clock | LCD-CLK |
Enable | None |
Significant Bit | Least Significant Bit First |
Bits per Transfer | 8 Bits per Transfer |
Clock State | Clock is High when inactive |
Clock Phase | Data is Valid on Clock Trailing Edge |
Enable Line | (Doesn't matter when "Enable" is "None") |
Now the software can decode data for us. This time, the decoded values 0x42, etc. in this image was drawn by the software.

This was the start of the very first data transmission after I applied power to the tape deck. Which is why CLK started as low even though it is normally high when inactivity. When Enable is set to None, I see all the data regardless of CE status.
First question to answer: the B in CCB is "Bus". How many devices are on this bus? Taking advantage of the difference between CCB and SPI, I can tell the SPI analyzer to decode just the CCB address by saying CE is Active Low:
SPI Analyzer Option | Value |
---|---|
Enable | LCD-CE |
Enable Line | Enable is Active Low |
The decoded values on LCD-DI were all 0x42, which tells me the LCD control chip is the only peripheral on this bus, which makes things simpler. I won't have to worry about reading data intended for the wrong device. And once I decided I didn't have to worry about different addresses anymore, I can switch the SPI Analyzer over to Active High CE. This will cause the analyzer to ignore addresses (since I expect them to all be 0x42) transmitted while CE is low and decode just the data.
SPI Analyzer Option | Value |
---|---|
Enable | LCD-CE |
Enable Line | Enable is Active High |
Within the ~3/4 second of the faceplate getting power, something is transmitted repeatedly approximately once every 5 milliseconds. Zooming in, I see they are three consecutive CCB transmissions to address 0x42:
Address | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
0x42 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0xC0 | 0x10 |
0x42 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x80 |
0x42 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x40 |
Next: compare this captured data to the LC75853N datasheet to see if they make sense.