Shop OBEX P1 Docs P2 Docs Learn Events
BS2P and 24LC256 EEPROM — Parallax Forums

BS2P and 24LC256 EEPROM

ArchiverArchiver Posts: 46,084
edited 2001-06-02 21:33 in General Discussion
Hello group!

Does anyone have any experience with the I2CIN and I2COUT commands
for the BS2P? I've gotten the other "flavors" of BS2 to work with the
24LC256 using the routines from my I2C tutorial
http://www.high-techgarage.com/tutorial/i2c.php but cannot do the
same thing with the built-in commands. I2CIN and I2COUT are much more
compact (probably faster too).

This is the code I am using. It should just write 32 bytes and then
read them back. The '256 is physically wired for address A2,A1,A0 =
000.

<
Start code
>

' {$stamp bs2p}

dta var byte
idx var byte

pause 100

for idx = 0 to 31
I2COUT 0,$A0,$00\idx,[noparse][[/noparse]idx*2]
pause 5
next

pause 1000
debug cls

for idx = 0 to 31
I2CIN 0,$A1,$00\idx,[noparse][[/noparse]dta]
debug "Loc: ", dec idx,tab,tab,"Data: ",dec dta,cr
next

<
End code
>

Thanks in advance,
--Jeff Wallace

* Add a RTC, 256k EEPROM and an I2C bus to your BS2
http://www.high-techgarage.com/products/timekeeper.php

Comments

  • ArchiverArchiver Posts: 46,084
    edited 2001-05-31 17:55
    [font=arial,helvetica]Do you have 4.7k pullups on pins 0 and 1? SDA on i2c chip must be connected
    to stamp pin 0 and SLC on i2c chip must be on stamp pin 1.
    Chuck[/font]
  • ArchiverArchiver Posts: 46,084
    edited 2001-05-31 18:00
    Yes. It is wired correctly and has the resistors. That is what makes
    this so frustrating!

    --- In basicstamps@y..., CHIPKEN@a... wrote:
    > Do you have 4.7k pullups on pins 0 and 1? SDA on i2c chip must be
    connected
    > to stamp pin 0 and SLC on i2c chip must be on stamp pin 1.
    > Chuck
  • ArchiverArchiver Posts: 46,084
    edited 2001-05-31 18:25
    Doesn't the address variable need to be word length?

    -Steve




    At 05:00 PM 05/31/2001 -0000, you wrote:
    >Yes. It is wired correctly and has the resistors. That is what makes
    >this so frustrating!
    >
    >--- In basicstamps@y..., CHIPKEN@a... wrote:
    >> Do you have 4.7k pullups on pins 0 and 1? SDA on i2c chip must be
    >connected
    >> to stamp pin 0 and SLC on i2c chip must be on stamp pin 1.
    >> Chuck
    >
    >
    >To UNSUBSCRIBE, just send mail to:
    > basicstamps-unsubscribe@yahoogroups.com
    >from the same email address that you subscribed with. Text in the Subject
    and Body of the message will be ignored.
    >
    >
    >Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
    >
    >
  • ArchiverArchiver Posts: 46,084
    edited 2001-05-31 18:27
    Oh Yeah,

    Nice web site you have....

    Regards,

    -Steve




    At 12:25 PM 05/31/2001 -0500, you wrote:
    >Doesn't the address variable need to be word length?
    >
    >-Steve
    >
    >
    >
    >
    >At 05:00 PM 05/31/2001 -0000, you wrote:
    >>Yes. It is wired correctly and has the resistors. That is what makes
    >>this so frustrating!
    >>
    >>--- In basicstamps@y..., CHIPKEN@a... wrote:
    >>> Do you have 4.7k pullups on pins 0 and 1? SDA on i2c chip must be
    >>connected
    >>> to stamp pin 0 and SLC on i2c chip must be on stamp pin 1.
    >>> Chuck
    >>
    >>
    >>To UNSUBSCRIBE, just send mail to:
    >> basicstamps-unsubscribe@yahoogroups.com
    >>from the same email address that you subscribed with. Text in the Subject
    >and Body of the message will be ignored.
    >>
    >>
    >>Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
    >>
    >>
    >
    >To UNSUBSCRIBE, just send mail to:
    > basicstamps-unsubscribe@yahoogroups.com
    >from the same email address that you subscribed with. Text in the Subject
    and Body of the message will be ignored.
    >
    >
    >Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
    >
    >
  • ArchiverArchiver Posts: 46,084
    edited 2001-05-31 18:33
    Hi Steve,

    Thanks for checking out the website! The 24LC256 does need a word
    address. However, the I2C bus can only handle bytes (8-bits) at a
    time. That was what the $00\idx part of the code did. The highbyte
    was $00 and the lowbyte was idx. The word address is then (when
    idx=1) $0001.

    Thanks again!
    --Jeff Wallace

    *Add a RTC, 256k EEPROM and an I2C bus to your BS2
    http://www.high-techgarage.com/products/timekeeper.php

    --- In basicstamps@y..., sargent@s... wrote:
    > Oh Yeah,
    >
    > Nice web site you have....
    >
    > Regards,
    >
    > -Steve
    >
    >
    >
    >
    > At 12:25 PM 05/31/2001 -0500, you wrote:
    > >Doesn't the address variable need to be word length?
    > >
    > >-Steve
    > >
    > >
    > >
    > >
    > >At 05:00 PM 05/31/2001 -0000, you wrote:
    > >>Yes. It is wired correctly and has the resistors. That is what
    makes
    > >>this so frustrating!
    > >>
    > >>--- In basicstamps@y..., CHIPKEN@a... wrote:
    > >>> Do you have 4.7k pullups on pins 0 and 1? SDA on i2c chip must
    be
    > >>connected
    > >>> to stamp pin 0 and SLC on i2c chip must be on stamp pin 1.
    > >>> Chuck
    > >>
    > >>
    > >>To UNSUBSCRIBE, just send mail to:
    > >> basicstamps-unsubscribe@y...
    > >>from the same email address that you subscribed with. Text in
    the Subject
    > >and Body of the message will be ignored.
    > >>
    > >>
    > >>Your use of Yahoo! Groups is subject to
    http://docs.yahoo.com/info/terms/
    > >>
    > >>
    > >
    > >To UNSUBSCRIBE, just send mail to:
    > > basicstamps-unsubscribe@y...
    > >from the same email address that you subscribed with. Text in the
    Subject
    > and Body of the message will be ignored.
    > >
    > >
    > >Your use of Yahoo! Groups is subject to
    http://docs.yahoo.com/info/terms/
    > >
    > >
  • ArchiverArchiver Posts: 46,084
    edited 2001-05-31 18:56
    Hi jeff,

    It was a shot in the dark, I've never used the Stamps built in I2C
    commands. After glancing at the manual, it sure appears to be complicated
    sending a word sized variable for the address? The manual has some examples
    on writing and reading, which I'm sure you have seen... You may want to
    start out just trying to write a single byte? I've found the 24LC256 to be
    a very forgiving and robust part

    good luck,

    Steve
  • ArchiverArchiver Posts: 46,084
    edited 2001-05-31 22:34
    Hi Steve,

    I agree with you on the I2C commands. They aren't very flexible....
    Maybe I'm just not understaning them. For example, most EEPROM have a
    sequential read/write feature which allows you to write 16,32,64 etc.
    bytes in a "burst mode." As far as I can tell, you cannot do that
    with the I2C commands. I took the sample routines from the tutorial
    and the data wrote/read perfectly. It takes up more room and is
    slightly slower, but it DOES work.

    Thanks for the input!
    --Jeff

    * Add a RTC, 256k EEPROM and an I2C bus for under $40!
    http://www.high-techgarage.com/products/timekeeper.php
  • ArchiverArchiver Posts: 46,084
    edited 2001-05-31 22:37
    [font=arial,helvetica]Your software is OK. I tried it out on a 24LC64 and it worked fine. You may
    have a bad pin connection on the stamp. Try stamp pins 8 and 9 instead.
    Chuck[/font]
  • ArchiverArchiver Posts: 46,084
    edited 2001-06-01 00:45
    [font=arial,helvetica]In a message dated 5/31/01 5:49:13 PM Central Daylight Time, bs2web@yahoo.com
    writes:


    I agree with you on the I2C commands. They aren't very flexible....
    Maybe I'm just not understaning them. For example, most EEPROM have a
    sequential read/write feature which allows you to write 16,32,64 etc.
    bytes in a "burst mode." As far as I can tell, you cannot do that
    with the I2C commands. I took the sample routines from the tutorial
    and the data wrote/read perfectly. It takes up more room and is
    slightly slower, but it DOES work.



    You can move an number of bytes from an I2C device into the BS2P's scratchpad
    RAM with this syntax:

    I2CIN pin,slave_addr,hi_addr\lo_addr,[noparse][[/noparse]SPSTR x]

    Where x is the number of bytes you want to transfer from the I2C device into
    the Stamp's scratchpad RAM. ·Once it's there, you can deal with it
    accordingly (retrieve with GET). ·You can also use this technique to transfer
    data into a byte array.

    HTH

    -- Jon Williams
    -- Dallas, TX
    -- Applications Engineer, Parallax[/font]
  • ArchiverArchiver Posts: 46,084
    edited 2001-06-01 02:34
    Thanks Jon!

    Thank you for the pointer! That significantly increases the power of
    the I2C commands (and my understanding of them!). Regarding the
    sample code you gave: can you specify what part of the RAM it starts
    transfering from? Does it always start at 0 or can you specify an
    offset?

    If you have a minute, would you mind looking at the original code I'm
    using? (It looks OK to me, but now I'm pullin' clumps of hair) I have
    the EEPROM set up with slave address (A2,A1,A0), with pull-up
    resistors (4.7k) and WP grounded. The SDA and SCL lines are properly
    connected. My I2C routines work fine, so I know it isn't the chip or
    the connections.

    Here is the original code:

    <
    Start code
    >

    ' {$stamp bs2p}

    dta var byte
    idx var byte

    pause 100

    for idx = 0 to 31
    I2COUT 0,$A0,$00\idx,[noparse][[/noparse]idx*2]
    pause 5
    next

    pause 1000
    debug cls

    for idx = 0 to 31
    I2CIN 0,$A1,$00\idx,[noparse][[/noparse]dta]
    debug "Loc: ", dec idx,tab,tab,"Data: ",dec dta,cr
    next

    <
    End code
    >


    >
    > You can move an number of bytes from an I2C device into the BS2P's
    > scratchpad RAM with this syntax:
    >
    > I2CIN pin,slave_addr,hi_addr\lo_addr,[noparse][[/noparse]SPSTR x]
    >
    > Where x is the number of bytes you want to transfer from the I2C
    > device into the Stamp's scratchpad RAM. Once it's there, you can
    > deal with it accordingly (retrieve with GET). You can also use
    > this technique to transfer data into a byte array.
  • ArchiverArchiver Posts: 46,084
    edited 2001-06-01 02:45
    Hi Chuck,

    You check, and you check, and then recheck.... I was concentrating so
    hard on the code, I neglected to check the value of the resistor. It
    works now....

    Thanks for the help!

    --- In basicstamps@y..., CHIPKEN@a... wrote:
    > Your software is OK. I tried it out on a 24LC64 and it worked fine.
    > You may have a bad pin connection on the stamp. Try stamp pins 8
    > and 9 instead.
  • ArchiverArchiver Posts: 46,084
    edited 2001-06-01 03:54
    [font=arial,helvetica]In a message dated 5/31/01 9:24:58 PM Central Daylight Time, bs2web@yahoo.com
    writes:


    Thank you for the pointer! That significantly increases the power of
    the I2C commands (and my understanding of them!). Regarding the
    sample code you gave: can you specify what part of the RAM it starts
    transfering from? Does it always start at 0 or can you specify an
    offset?



    SPSTR always starts at address 0 in the scratchpad and works its way up. ·If
    you're using PUT to save things the SPRAM, it's a good idea to save those
    things toward the top (from location 126 and on down) to avoid any conflicts.


    If you have a minute, would you mind looking at the original code I'm
    using? (It looks OK to me, but now I'm pullin' clumps of hair) I have
    the EEPROM set up with slave address (A2,A1,A0), with pull-up
    resistors (4.7k) and WP grounded. The SDA and SCL lines are properly
    connected. My I2C routines work fine, so I know it isn't the chip or
    the connections.



    So...what's the problem? ·Did Chuck Gracey not comment on an earlier thread
    that you may have a bad pin on your BS2p? ·Have you tried the pin 8/9 group?


    Here is the original code:

    <
    Start code
    >

    ' {$stamp bs2p}

    dta ···var ···byte
    idx ···var ···byte

    pause 100

    for idx = 0 to 31
    I2COUT 0,$A0,$00\idx,[noparse][[/noparse]idx*2]
    pause 5
    next

    pause 1000
    debug cls

    for idx = 0 to 31
    I2CIN 0,$A1,$00\idx,[noparse][[/noparse]dta]
    debug "Loc: ", dec idx,tab,tab,"Data: ",dec dta,cr
    next



    Looks good to me too....[/font]
  • ArchiverArchiver Posts: 46,084
    edited 2001-06-01 03:58
    I was too preoccupied with the code to notice that the resistor
    values were wrong. Swapped them with 10k and the code works on both
    ports. Thanks for the help!

    --JW
  • ArchiverArchiver Posts: 46,084
    edited 2001-06-02 21:33
    > You can move an number of bytes from an I2C device into the BS2P's
    > scratchpad RAM with this syntax:
    >
    > I2CIN pin,slave_addr,hi_addr\lo_addr,[noparse][[/noparse]SPSTR x]
    >
    > Where x is the number of bytes you want to transfer from the I2C
    > device into the Stamp's scratchpad RAM. Once it's there, you can
    > deal with it accordingly (retrieve with GET). You can also use
    > this technique to transfer data into a byte array.

    Does this SPSTR modifier continue generating ACK's after each byte is
    received, or does it go through the START-STOP procedure for each
    byte? Also, most of the EEPROMs I've used require a NACK during
    reads. Does the I2CIN routine generate a NACK? (There is no mention
    of it in the manual, and the timing diagrams show an ACK before a
    STOP). Is there anyway to use the SPSTR command in reverse? I.e. can
    I write 64 bytes sequentially without needing a START and STOP
    condition for each byte?

    I'm trying to get this snippet of code which uses the SPSTR modifier,
    but I'm running into a wall. When I get each of the 64 bytes
    individually, I can debug the proper value on the screen. However,
    when I use the SPSTR modifier, all of the values are 255 with the
    exception of the 64th byte which is 0. Here is the code I'm using:

    <
    Start code snippet
    >

    for index = 0 to 63
    I2COUT 0,$A0,$00\index,[noparse][[/noparse]index]
    pause 10
    next

    pause 1000

    I2CIN 0,$A1,$00\$00,[noparse][[/noparse]SPSTR 64]

    for index = 0 to 63
    get index,i2cbyte
    debug "Loc: ",dec index,tab,tab,"Data: ", dec i2cbyte,cr
    next

    <
    End of code snippet
    >

    Thanks in advance!
    --Jeff Wallace
    http://www.high-techgarage.com/
Sign In or Register to comment.