CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

How to check number of/size of I2C EEPROM chips installed

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
edhaslam



Joined: 15 Jul 2005
Posts: 89
Location: UK

View user's profile Send private message

How to check number of/size of I2C EEPROM chips installed
PostPosted: Thu Sep 22, 2005 5:11 am     Reply with quote

Hi all,

I'm currently designing a datalogger that can have a maximum of 8 24LCXXX memory chips installed and I'd like to know if there is a way of checking how many are installed and also the size of chip is installed, when the firmware first loads up. Does anyone have any ideas/code on how to do this?

Cheers,
Ed
treitmey



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

View user's profile Send private message Visit poster's website

PostPosted: Thu Sep 22, 2005 7:54 am     Reply with quote

I'm not sure if I'm the best to answer this, but...
I would try a test for "ready". You can find this in some of the drivers included in compiler. Basicly it write the device address and waits for an i2c ack (ackknowlege). If you get it, then you know that chip exisits. If you don't((timer involved here)) then that chip isn't installed.
Guest








PostPosted: Thu Sep 22, 2005 11:21 am     Reply with quote

treitmey wrote:
I'm not sure if I'm the best to answer this, but...
I would try a test for "ready". You can find this in some of the drivers included in compiler. Basicly it write the device address and waits for an i2c ack (ackknowlege). If you get it, then you know that chip exisits. If you don't((timer involved here)) then that chip isn't installed.


Thanks, I'll have a look through the data sheet and see what I can find out about this.

Does anyone know if there is a way to find out the size of the device?
newguy



Joined: 24 Jun 2004
Posts: 1909

View user's profile Send private message

PostPosted: Thu Sep 22, 2005 1:00 pm     Reply with quote

As far as the size of the EEPROM is concerned, what I'd look at is the chip's response to a memory read from an address "above" its maximum.

My gut feeling is that the MSb would be ignored. Say that you have a 32kbit eeprom - it only recognizes the least significant 12 bits of the 16 bit address (2^12 = 4096 bytes = 32kbits).

Hmm. What I'd do is read, and remember, the data from the first 8 memory addresses (addresses 0 - 7) in the eeprom. This would require 3 address bits. Then try reading from addresses 0x0010 - 0x0017. If these 8 bytes are different from the ones you read from addresses 0-7, then the eeprom has at least 2^4 bytes of memory. Repeat the process for addresses of 0x0020 - 0x0027, 0x0040 - 0x0047, and 0x0080 - 0x0087. When you read back the same data as you did from addresses 0-7, then the address has wrapped, and you know the max size of your eeprom.

For my 32kbit eeprom example, I'd read the same data as from addresses 0 - 7 as soon as I hit an address of 0x1000 - 0x1007 because the 4 MS bits of the address would be ignored by the eeprom, which would interpret 0x1000 as 0x0000.

There are probably quicker ways, but this should give you an idea of how to solve the problem.
asmallri



Joined: 12 Aug 2004
Posts: 1635
Location: Perth, Australia

View user's profile Send private message Send e-mail Visit poster's website

PostPosted: Thu Sep 22, 2005 3:01 pm     Reply with quote

newguy wrote:
As far as the size of the EEPROM is concerned, what I'd look at is the chip's response to a memory read from an address "above" its maximum.

My gut feeling is that the MSb would be ignored. Say that you have a 32kbit eeprom - it only recognizes the least significant 12 bits of the 16 bit address (2^12 = 4096 bytes = 32kbits).

Hmm. What I'd do is read, and remember, the data from the first 8 memory addresses (addresses 0 - 7) in the eeprom. This would require 3 address bits. Then try reading from addresses 0x0010 - 0x0017. If these 8 bytes are different from the ones you read from addresses 0-7, then the eeprom has at least 2^4 bytes of memory. Repeat the process for addresses of 0x0020 - 0x0027, 0x0040 - 0x0047, and 0x0080 - 0x0087. When you read back the same data as you did from addresses 0-7, then the address has wrapped, and you know the max size of your eeprom.

For my 32kbit eeprom example, I'd read the same data as from addresses 0 - 7 as soon as I hit an address of 0x1000 - 0x1007 because the 4 MS bits of the address would be ignored by the eeprom, which would interpret 0x1000 as 0x0000.

There are probably quicker ways, but this should give you an idea of how to solve the problem.


An erased EEPROM or one initialised to a constant value will also pass this test. Also, in some of my projects, I deliberately duplicate EEPROM data so that I have current user modified paramters and "as built' paramters to enable the user modified paramaters to be "factory reset". So the above test would fail.

I suggest you read the first location and save it to memory. Call this "reference" Then starting at the next smallest EEPROM size, test the first value at the page boundary (call this "current").

    If the value is different then we are still within the EEPROM so repeat the test at the next boundary.

    If it is the same as "reference" then you have a potential wrap condition and therefore the previous EEPROM size is a candidate. Write the compliment of the reference value to the first location in EEPROM. Test if the value of current location has changed. If it has changed then a wrap condition has occurred. Restore the original contents of the first location. If a wrap occurred then you have discovered the size of the EEPROM. If not then continue this process upto the maximum possible EEPROM size.

_________________
Regards, Andrew

http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!!
edhaslam



Joined: 15 Jul 2005
Posts: 89
Location: UK

View user's profile Send private message

PostPosted: Fri Sep 23, 2005 1:35 am     Reply with quote

Thanks guys, good food for thought there. I'll let you know how I get on...
edhaslam



Joined: 15 Jul 2005
Posts: 89
Location: UK

View user's profile Send private message

PostPosted: Fri Sep 23, 2005 1:52 am     Reply with quote

treitmey wrote:
I'm not sure if I'm the best to answer this, but...
I would try a test for "ready". You can find this in some of the drivers included in compiler. Basicly it write the device address and waits for an i2c ack (ackknowlege). If you get it, then you know that chip exisits. If you don't((timer involved here)) then that chip isn't installed.


Strangely, the 2401 - 2465 drivers have the following code in them:

Code:


BOOLEAN ext_eeprom_ready() {
   int1 ack;
   i2c_start();            // If the write command is acknowledged,
   ack = i2c_write(0xa0);  // then the device is ready.
   i2c_stop();
   return !ack;
}



But the 24128 and 24256 don't - which is strange. Is there a reason for this? It looks as though it would possible to add this code into those drivers?
treitmey



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

View user's profile Send private message Visit poster's website

PostPosted: Fri Sep 23, 2005 7:24 am     Reply with quote

Don't add code to the driver file. Add the code to your program file. otherwise when you install a new compiler your modified driver file will be overwritten with the new compilers' driver file.

Last edited by treitmey on Fri Sep 23, 2005 7:51 am; edited 1 time in total
Mark



Joined: 07 Sep 2003
Posts: 2838
Location: Atlanta, GA

View user's profile Send private message Send e-mail

PostPosted: Fri Sep 23, 2005 7:27 am     Reply with quote

They put it at the end
Code:

   status=i2c_write(0xa0);
   while(status==1)
   {
   i2c_start();
   status=i2c_write(0xa0);
   }


Not the best way. The code will sit there until the write is complete wasting processor time. It also leaves the bus with a Start condition. Not a good thing when you have multi masters on the bus.
treitmey



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

View user's profile Send private message Visit poster's website

PostPosted: Fri Sep 23, 2005 7:47 am     Reply with quote

Right. In my post(sencond in this list) I put in a blip that says he needs a timer for that check. I didn't want to write the whole thing for him. I just wanted to point him in the right direction.
edhaslam



Joined: 15 Jul 2005
Posts: 89
Location: UK

View user's profile Send private message

PostPosted: Sat Sep 24, 2005 10:08 am     Reply with quote

treitmey wrote:
Right. In my post(sencond in this list) I put in a blip that says he needs a timer for that check. I didn't want to write the whole thing for him. I just wanted to point him in the right direction.


Thanks for the shove in the right direction guys. Much appriciated. I think implementing a timeout is definitely the way forward.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group