Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    I2C and 24LC512 memory devices

    Scheduled Pinned Locked Moved WiPy 2&3
    i2cserialeeprom24lc512
    14 Posts 3 Posters 3.8k Views 3 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • R Offline
      RichardTXD
      last edited by

      Hi, Can anyone help please?
      I'm trying to interface a 24LC512 I2C eeprom to WiPy.
      I think I have connected it fine. The "scan" command returns [80] which is correct. I've got 2K2 pullups on SDA and SCL and left WP floating (documented to be enabled for write like this as it has an internal pulldown) - and bypassed Vcc to gnd with 2 off 100nF - powered from 3V3 of the WiPy - and soldered leads.
      I've tried the various commands and all I can read is 0xFF after write operations.
      I am concerned that these memories require 3 bytes written for each access; the first byte is an A0 or an A1 for write or read command resp for the 1st chip on the bus. Then 2 address bytes. Then read a value back or write a value for storing into eeprom.
      I note that a timing cycle can be initiated in that I get a bus error after a write operation unless I put in a delay - but the read operation still returns 0xff.

      Anyone actually used I2C on a WiPy to read/write these serial eeproms please?

      Any hints please?

      Thanks - Richard

      L R 2 Replies Last reply Reply Quote 0
      • L Offline
        livius @RichardTXD
        last edited by livius

        @RichardTXD said in I2C and 24LC512 memory devices:

        2K2 pullups can be too strong try with 10K or 4K7.

        think about people first, then computers

        R 1 Reply Last reply Reply Quote 0
        • R Offline
          RichardTXD @livius
          last edited by

          @livius
          Hi and thanks. I just now got round to working on this problem.
          I changed the resistors - no change in operation - always returning 0ffh.

          I FOUND IT... on the WiPy2 expansion board, I've not seen the circuit, but I think maybe there is something else connected to the I2C pins(?) I pulled the links for Led and Chg and Batt and all of a sudden I could read the I2C memory chip I'd written on something else.

          It was something on the expansion board.

          Thanks for the help - Richard

          1 Reply Last reply Reply Quote 0
          • R Offline
            RichardTXD
            last edited by

            Sorry false alarm.
            The issue is NOT fixed.
            The i2c.readfrom_mem command only works after power up then it fails every other time.
            I'm using a pre-written serial eeprom - I can read it the first time after power up sometimes. There after it appears to be locked up or similar.
            Spent hours on it.
            Anyone played with I2c serial memroies please?????

            1 Reply Last reply Reply Quote 0
            • R Offline
              RichardTXD @RichardTXD
              last edited by

              @RichardTXD
              Updated to 1.7.4.b1 and made no difference.

              Reading first 16 bytes of I2C occasionally works from power up. Thereafter a re-read returns rubbish.

              Must power down the WiPy and retry to read I2C memory again.

              L 1 Reply Last reply Reply Quote 0
              • L Offline
                livius @RichardTXD
                last edited by livius

                @RichardTXD
                can you post code used for init and read data from i2c?
                because i use it extensively and no isssues with reading from memory. Example i2c memory of gps.

                think about people first, then computers

                R 1 Reply Last reply Reply Quote 0
                • R Offline
                  RichardTXD @livius
                  last edited by livius

                  @livius
                  Sure.
                  The writing code is done in an Arduino app, fairly large, that I won't post. It is a work in progress. If you have the memory devices and an arduino I can send you something - it just uses the 'wire' library and does page writes etc.
                  This is the reading code. Absolutley nothing clever.

                  -----begin----------
                  from machine import I2C, UART
                  import time
                  
                  # Configure 2nd uart port
                  
                  uart1 = UART(1, baudrate=19200)
                  uart1.write('hello')
                  
                  
                   # read up to 5 bytes
                  # configure the I2C bus
                  # i2c = I2C(0, I2C.MASTER, baudrate=100000,  pins=('P9', 'P10'))
                  i2c = I2C(0, I2C.MASTER, baudrate=100000)
                  
                  print('scanning')
                  print(i2c.scan()) # returns list of slave addresses
                  
                  loops = 0
                  while 1:
                    result = i2c.readfrom_mem(80, 0, 32)
                    print(str(loops) + ' ' + str(result))
                    # print(str(loops))
                    time.sleep(1.0)
                    loops = loops + 1
                    # i2c.scan()
                    uart1.write('hello')
                  
                  ------ end -----
                  
                  L 1 Reply Last reply Reply Quote 0
                  • L Offline
                    livius @RichardTXD
                    last edited by livius

                    @RichardTXD said in I2C and 24LC512 memory devices:
                    looks ok

                    but what if you add
                    time.sleep(1)
                    after i2c.scan?

                    but i see that @jmarcelino found the reason of that? Post here findings :)

                    think about people first, then computers

                    R 1 Reply Last reply Reply Quote 0
                    • R Offline
                      RichardTXD @livius
                      last edited by

                      @livius
                      Ta. Fair comment. Shouldn't be needed but I'll try it.
                      In the post on the new version of firmware it was suggested that the Python code does not send the proper lead in code to address a memory chip. It is just generic code which is guaranteed to fail.
                      The 24LC512's I use demand an A1 or A0 for read or write then the address then the data.
                      I read all the PyCom/Python doc I could find and assumed it was the same as Arduino Wire library which works.
                      A poster showed me a command variation that allows "stop" to be conditional which would allow exaclty what I need to create the correct addressing.
                      I'll try that tomorrow - gotta leave for the day.
                      Thanks for the comments and taking an interest. I've used I2C memory chips for last 18 years and quite like them. We've found them to be very robust and reliable and low current though capacity is low by modern standards and somewhat slow.

                      J 2 Replies Last reply Reply Quote 0
                      • J Offline
                        jmarcelino @RichardTXD
                        last edited by

                        @RichardTXD
                        I only have old Atmel 24C32 EEPROMs in my parts bin, I mostly use much larger Cypress etc SPI NOR Flash or F-RAM, but I'll see if I can order some similar to yours and try it

                        Let us know if you get it working in the meantime.

                        1 Reply Last reply Reply Quote 0
                        • J Offline
                          jmarcelino @RichardTXD
                          last edited by jmarcelino

                          @RichardTXD
                          Can you try the new firmware 1.7.5b2 and see if it solves the problem?

                          I ordered a 24LC512 should get it tomorrow to try as well.

                          R 1 Reply Last reply Reply Quote 0
                          • R Offline
                            RichardTXD @jmarcelino
                            last edited by livius

                            @jmarcelino
                            Thank you so much for taking an interest and your effort.
                            Doesn't seem to change anything with same code.
                            I'm operating under the assumption that I need to manually send the leadin and addressing bytes for read and write.
                            As below. I tried a few variants but didn't get it working.

                            from machine import I2C
                            import time
                            
                            # configure the I2C bus
                            # i2c = I2C(0, I2C.MASTER, baudrate=100000,  pins=('P9', 'P10'))
                            i2c = I2C(0, I2C.MASTER, baudrate=100000)
                            
                            print('scanning')
                            print(i2c.scan())       # returns list of slave addresses, tells me chip is on the bus
                            
                            loops = 0
                            addressing = bytearray(3)
                            addressing[0] = 0xA0            # Write command, chip 0 on bus
                            addressing[1] = 0x00            # MSB address
                            addressing[2] = 0x00            # LSB address
                            print(str(addressing))
                            
                            i2c.writeto(80, addressing, stop=False) # setup chip, no stop means more to follow
                            i2c.writeto(80, '123hello world456')    # this should be a "page write" (assume)
                            time.sleep(1)                           # crazy long. 5mS should be enough
                            
                            addressing[0] = 0xA1            # make it a read command, chip 0 on bus
                            
                            while 1:
                              i2c.writeto(80, addressing, stop=False)   # setup chip, no stop means more to follow
                              time.sleep(0.1)                           # not necessary. "try anything"
                              result = i2c.readfrom(80, 32)             # clock out 32 bytes in page mode (assume)
                              print(str(loops) + ' ' + str(result))
                              time.sleep(1.0)
                              loops = loops + 1
                            
                            J 1 Reply Last reply Reply Quote 0
                            • J Offline
                              jmarcelino @RichardTXD
                              last edited by

                              Hi @RichardTXD,

                              I received the 24LC512 today and just had to do a quick test now before heading to bed :)

                              I adapted some existing EEPROM code to support the Pycom board and it all seems to be working very well, please have a look at my version:

                              https://github.com/jmarcelino/MicroPython/blob/master/EEPROM.py

                              I don't have time to package this into something better at the moment but can return to it later next week if no one else does it first :)

                              R 1 Reply Last reply Reply Quote 1
                              • R Offline
                                RichardTXD @jmarcelino
                                last edited by

                                @jmarcelino
                                Thank you so much - it is surprising though.
                                I had got majorly confused with if the memory comand actually sent out the proper sequence or not etc. It seems it does.
                                I've been away with other things this last month or so (earning money). Now it is time to come back to it. I'll get the breadboard happening again shortly.

                                1 Reply Last reply Reply Quote 0

                                Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                                Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                                With your input, this post could be even better 💗

                                Register Login
                                • 1 / 1
                                • First post
                                  Last post

                                Pycom on Twitter

                                Pycom