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 @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