Newhaven Products > Graphic LCDs

NHD-C160100DiZ and Raspberry Pi

(1/3) > >>

tinkerer1359:
Hi-

I've been trying to add a NHD-C160100DiZ to my Raspberry Pi. I have interfaced the display using I2C with CSB tied low and RST tied high (always selected, not reset). The I2C bus detect finds the address (0x3F). Using the following program (which I hope is a faithful adaptation of the example code), I get nothing on the screen:

--- Code: ---import time
import smbus

bus = smbus.SMBus(1)        # Bus declaration

#=============================================================================
# I2C
#   I2C communication class
#     I2C.write(Dev, Length, Reg, Val)  - writes to a device via I2C
#     I2C.read(Dev, Length, Reg)        - reads from a device via I2C
#
#     Dev - Device I2C address, Length - "Block"|"Word"|"Byte"|"None"
#     Reg - Register address for device, Val - Value to be set in the Dev/Reg
#     http://erazor-zone.de/wiki:linux:python:smbus:doc
#     https://www.kernel.org/doc/Documentation/i2c/smbus-protocol
#=============================================================================
class I2C(object):
  """I2C Communication Class"""
#-----------------------------------------------------------------------------
# I2C.write
  def write(self, Dev, Length, Reg, Val):
    if Length == "Block":           #     Block - uses addressed reg, array
      bus.write_block_data(Dev, Reg, Val)
    elif Length == "Word":          #     Word  - uses addressed reg, 16-bit
      bus.write_word_data(Dev, Reg, Val)
    elif Length == "Byte":          #     Byte  - uses addressed reg, 8-bit
      bus.write_byte_data(Dev, Reg, Val)
    elif Length == "None":          #     None  - no addressed reg, 8-bit
      bus.write_quick(Dev)
    return -1
   
#-----------------------------------------------------------------------------
# I2C.read
  def read(self, Dev, Length, Reg):
    if Length == "Block":           #     Block - uses addressed reg, array
      value = bus.read_block_data(Dev, Reg)
    elif Length == "Word":          #     Word  - uses addressed reg, 16-bit
      value = bus.read_word_data(Dev, Reg)
    elif Length == "Byte":          #     Byte  - uses addressed reg, 8-bit
      value = bus.read_byte_data(Dev, Reg)
    elif Length == "None":          #     None  - no addressed reg, 8-bit
      value = bus.read_byte(Dev)
    return value

#=============================================================================
# Main

RC = [0 for x in range(13)]                     # Initializes RC
I = I2C()
Adr = 0x3F
Com = 0x00
Dat = 0x40

I.write(Adr, "Block", Com, [0xE2])

I.write(Adr, "Block", Com, [0x48, 0x64, 0xA0, 0xC8, 0x44, 0x00, 0xAB, 0x26, 0x81, 0x15, 0x56, 0x64])

time.sleep(2)

I.write(Adr, "Block", Com, [0x2C, 0x66])

time.sleep(2)

I.write(Adr, "Block", Com, [0x2E])

time.sleep(2)

I.write(Adr, "Block", Com, [0x2F, 0xF3, 0x00, 0x96, 0x38, 0x75, 0x97])

i = 0
j = 0
gs = [0x00, 0x06, 0x0B, 0x10, 0x15, 0x1A, 0x1E, 0x23, 0x27, 0x2B, 0x2F, 0x32, 0x35, 0x38, 0x3A, 0x3C]
for x in range(0x80, 0xC0):
  i = i + 1
  # print("%02X %02X %02X %02X" % (Adr, Com, x, gs[j]))
  I.write(0x3F, "Block", Com, [x, gs[j]])
  if (i % 4) == 0:
    j = j + 1

I.write(Adr, "Block", Com, [0x38, 0x74, 0xAF])

I.write(Adr, "Block", Dat, [0x26, 0x26, 0x26, 0x26, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x31, 0x31, 0x31, 0x31])

--- End code ---

Can anyone please direct me on how to resolve this?

Thanks!

SpiralP:
I've done alot of I2C stuff with other microprocessors and i have an idea for you to try.

The slave address they provide within the datasheet is 0x3F, which i see you define in your code.

The way I2C works is the Address is 7 bits. However it is left shifted by 1 bit.
So the total address is an 8 bit value.
The 7 most significant bits are the address of the device and the Least significant bit (0) is the Read / Write bit which tells the slave device if you're going to be sending it data or trying to retrieve data from it.

You might want to try left shifting the address by 1 bit and setting that in your code as the slave address.
Hence 0x3F will be 0x7E

tinkerer1359:
Thanks for the reply. I had already thought of that, and have checked and verified the I2C address using the detect command on the RPi. Also, the I2C commands throw an error if the address is invalid, so I'm fairly confident that I have communication.

Paul_B:
Hello,

Sounds like your I2C connection is correct, this tells me there must be an issue in your initialization.  Can you please share your initialization code?

Thanks!

tinkerer1359:
Hi-

The entire code is included above.

I may have found the issue: the RPi uses a 1.8k pull-up on its lines, which may be too severe. I am experimenting with removing the 1.8k and using 10k. I'll post the results when I determine them.

Navigation

[0] Message Index

[#] Next page

Go to full version