UKHAS Wiki

UK High Altitude Society

User Tools

Site Tools


code:i2c_eeprom

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
code:i2c_eeprom [2008/11/26 15:44] laurencebcode:i2c_eeprom [2009/03/20 04:50] (current) laurenceb
Line 2: Line 2:
  
  
-<code c> +<code c>#include "i2cmem.h"
-#include "i2cmem.h"+
 #ifdef EEPROM #ifdef EEPROM
  
Line 12: Line 11:
 void init_i2c() void init_i2c()
 { {
- TWBR=(u08)(((float)F_CPU/(2.0*(float)SCL))-8.0); //sets the correct clock rate defined as SCL + TWBR=(u08)(((float)F_CPU/(2.0*(float)SCL))-8.0);//sets the correct clock rate defined as SCL 
-} //we dont need to enable the hardware - its done in write+} //we dont need to enable the hardware - its done in write
  
 void i2cstart() void i2cstart()
Line 19: Line 18:
  u16 timeout=1;  u16 timeout=1;
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //send start  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //send start
- while (!(TWCR & (1<<TWINT)) && timeout);+ while (!(TWCR & (1<<TWINT)) && timeout)
  timeout++; //wait for a start to be transmitted  timeout++; //wait for a start to be transmitted
  if(!timeout)  if(!timeout)
  I2Cerr|=16; //timeout out waiting for start error  I2Cerr|=16; //timeout out waiting for start error
- TWCR = (1<<TWEN ); //clear the start condition+ TWCR = (1<<TWEN ); //clear the start condition
  if (((TWSR & 0xF8) != TW_START)&&((TWSR & 0xF8) != TW_REP_START))  if (((TWSR & 0xF8) != TW_START)&&((TWSR & 0xF8) != TW_REP_START))
  I2Cerr|=1; //error  I2Cerr|=1; //error
Line 32: Line 31:
  u16 timeout=1;  u16 timeout=1;
  TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);  TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
- while (!(TWCR & (1<<TWSTO)) && timeout);//wait for stop to be sent+ while (!(TWCR & (1<<TWSTO)) && timeout) //wait for stop to be sent
  timeout++;  timeout++;
  if(!timeout)  if(!timeout)
Line 43: Line 42:
  TWDR = c; //load the data  TWDR = c; //load the data
  TWCR = (1<<TWINT)|(1<<TWEN);  TWCR = (1<<TWINT)|(1<<TWEN);
- while (!(TWCR & (1<<TWINT)) && timeout);//wait for it to be sent+ while (!(TWCR & (1<<TWINT)) && timeout) //wait for it to be sent
  timeout++;  timeout++;
  if(!timeout)  if(!timeout)
Line 51: Line 50:
 } }
  
-u08 i2cread(u08 AK)+u08 i2cread(u08 ak)
 { {
  u16 timeout=1;  u16 timeout=1;
- TWCR=AK;+ TWCR=ak;
  while ((!(TWCR & (1<<TWINT))) && timeout)  while ((!(TWCR & (1<<TWINT))) && timeout)
  timeout++; //wait for it to be recieved  timeout++; //wait for it to be recieved
Line 70: Line 69:
 { {
  i2cstart();  i2cstart();
- i2cwrite(SLA_W|(((*address)>>15)&0x02)); //the block+ i2cwrite(SLA_W|(((*address)>>15)&0x02)); //the block
  i2cwrite((u08)((*address)>>8)); //address write MSB  i2cwrite((u08)((*address)>>8)); //address write MSB
- i2cwrite((u08)(*address)); //address write LSB+ i2cwrite((u08)(*address)); //address write LSB
 }  }
  
 void write_data(u08 * c, u08 datasize, u32 * address)//The address will be incremented as the data is written void write_data(u08 * c, u08 datasize, u32 * address)//The address will be incremented as the data is written
 { {
- u08 n; //up to 256 bytes can be written at once+ u08 n; //up to 256 bytes can be written at once
  for(n=0;n<datasize;n++,(*address)++)  for(n=0;n<datasize;n++,(*address)++)
  {  {
- if(!((u08)*address)) //check the address for overflow for the 8 LSB (Atmel)+ if(!((u08)*address)) //check the address for overflow for the 8 LSB (Atmel)
  {  {
- i2cstop(); //triggers a page write+ i2cstop(); //triggers a page write
  _delay_loop_2( (u16) ( (float)F_CPU*0.006/4.0 ) );//delay 6 ms for page write  _delay_loop_2( (u16) ( (float)F_CPU*0.006/4.0 ) );//delay 6 ms for page write
- set_address(address); //set the new address+ set_address(address); //set the new address
  }  }
- i2cwrite(c[n]); //write the data+ i2cwrite(c[n]); //write the data
  }  }
 } }
Line 95: Line 94:
  datasize--;  datasize--;
  i2cstart();  i2cstart();
- i2cwrite(SLA_R|(((*address)>>15)&0x02)); //set read to the correct block + i2cwrite(SLA_R|((u08)((*address)>>15)&0x02)); //set read to the correct block 
- for(n=0;n<datasize;n++)+ for(n=0;n<datasize;n++) //the eeproms address pointer should have been setup already
  {  {
  destination[n]=i2cread(_AK_);  destination[n]=i2cread(_AK_);
- (*address)++; //increment our pointer + (*address)++; //increment our pointer 
- /*if(!(u16)(*address)) //we reached the end of the block+ /*if(!(u16)(*address)) //we reached the end of the block
  {  {
  i2cstop();   i2cstop(); 
Line 106: Line 105:
  }This isn't needed on the Atmel chips*/  }This isn't needed on the Atmel chips*/
  }  }
- destination[datasize+1]=i2cread(_NAK_); //send NAK for the last byte recieved+ destination[datasize]=i2cread(_NAK_); //send NAK for the last byte recieved
  i2cstop();  i2cstop();
 + (*address)++;
 } }
  
  
-u32 findtop() //Find the address of record number where we enter painted eeprom+u32 findtop() //Find the address of record number where we enter painted eeprom
 { {
- u32 top=12*((u32)(((u32)1<<16)/12)); //half way through rounded down to nearest 12 + u32 top=12*((u32)1<<13); //half way through rounded down to 12 
- u08 n+ u08 n,endcond=TRUE; 
- u08 endcond=TRUE; //used to solve the problem of running with n=0 + u16 place=1<<13; 
- for(n=16;endcond;) //start by probing half way through+ for(n=14;endcond;) //start by probing half way through - place is in records
  {  {
- set_address(&top); //the probe address+ set_address(&top); //the probe address
  if(n)  if(n)
- n--; //need to decr here to get 1 byte resolution+ n--; //need to decr here to get 1 byte resolution
  else  else
- endcond=FALSE; //terminate the loop after completion + endcond=FALSE; //terminate the loop after completion //need to decr here to get 1 byte resolution 
- i2cstart(); + i2cstart(); //read the slave 
- i2cwrite(SLA_R); //setup the slave device to allow us to read+ i2cwrite(SLA_R);
  if(i2cread(_NAK_)==MAGIC_NUMBER) //see if its painted  if(i2cread(_NAK_)==MAGIC_NUMBER) //see if its painted
- top-=1<<n; //set or clear the nth bit + place&=~(1<<n); //clear the nth bit in the place holder 
- else + if(n) 
- top+=1<<n;+ place|=(1<<(n-1)); //set the next bit
  i2cstop();  i2cstop();
- top = 12*( (u32) (top/12) ); //round down to nearest 12+ if(place>10922) 
 + place=10922; 
 + top = 12*( (u32)place ); //place is in units of 12
  }  }
 + set_address(&top);
 + i2cstart();
 + i2cwrite(SLA_R);
 + if(i2cread(_NAK_)!=MAGIC_NUMBER) //check the location to make sure its blank
 + place++;
 + top = 12*( (u32)place );
  return top;  return top;
 } }
  
-void painteeprom() //Paints every 12th location with the magic number+void painteeprom() //Paints every 12th location with the magic number
 { {
- u08 magic=MAGIC_NUMBER; //magic is our painting value + u08 magic=MAGIC_NUMBER; //magic is our painting value 
- u32 n; + u32 n=0
- for(n=0;n<131072;n+=12) //this writes every 12th byte+ for(;n<131072;n++/*n+=12*/) //this writes every (12thbyte
  {  {
 + /*
  set_address(&n);  set_address(&n);
- i2cwrite(magic); //write the data + i2cwrite(magic); //write the data 
- if((u08)n>243) //our next n will be across a page boundary+ if((u08)n>243) //our next n will be across a page boundary
  {  {
  i2cstop();  i2cstop();
  _delay_loop_2( (u16) ( (float)F_CPU*0.006/4.0 ) );//delay 6 ms for page write  _delay_loop_2( (u16) ( (float)F_CPU*0.006/4.0 ) );//delay 6 ms for page write
 + }*/
 + if(!((u08)n)) //this code is for writing every byte
 + {
 + i2cstop();
 + _delay_loop_2( (u16) ( (float)F_CPU*0.006/4.0 ) );//delay 6 ms for page write
 + set_address(&n);
  }  }
 + i2cwrite(magic);
  wdt_reset();  wdt_reset();
  }  }
 + i2cstop();
 } }
 #endif #endif
- 
 </code> </code>
  
code/i2c_eeprom.1227714269.txt.gz · Last modified: 2008/11/26 15:44 by laurenceb

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki