Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
04/05/07 10:26
Read: times


 
Msg Score: +1
 +1 Good Answer/Helpful
#136670 - Asif,s C Code for I2C
Responding to: ???'s previous message
dear Asif,

I have looked at your C code (but not your assembler). I have some (untested) suggestions that may help. Unlike Erik, I think that it is far easier to write your code in C and then rewrite in assembler if required.

make both iic_start() and ack() return the status of SDA line instead of being void functions. And change your no_ack(void) to read_more(char more) function.

so: iic_start() returns with "is bus free?"
so: ack() is rewritten as:
char iic_start(void)
{
    sda = 1;
    if (scl == 0 || sda == 0) return 0;   // bus is BUSY
    scl = 1;
    _nop_();
    sda = 0;      // START condition
    _nop_();
    scl = 0;      // tell everyone that we have the bus  
    return 1;     // yes we are free
}

char ack(void)
{
    char ret;
    sda = 1;      // let SDA line float
    scl = 1;
    ret = sda;    // read the ACK bit
    _nop_();
    scl = 0;      // keep hold of the bus
    return ret;   // now you know if you succeeded
}

void read_more(char more)  // was the no_ack() function
{
    sda = !more;  // your example only wanted to read one byte.
    scl = 1;
    _nop_();
    scl = 0;      // keep hold of bus
}


you should find that calling iic_start() will now tell you if the bus is free. and you should always check a send_byte() operation by seeing if you have an ACK. Your call to no_ack() will be replaced by a read_more(0) because you only want to read a single byte.

The eeprom needs about 5mS to complete its write-page operation. Either call a 10mS delay() to be safe, or you can poll the eeprom as per the data sheet. You do this by waiting for both iic_start() && send_byte()/ack() to return true.

I personally use a char i2c_write(unsigned char j) function that combines your send_byte() and ack() functions.
I also suggest that you replace the _nop_() macro with something different. Then you can alter your timing with editing one macro. Your 12MHz micro does not really need the delays except in the start and stop conditions. However if you ever change to a one-clock micro then you will need to slow things down.

Once you have our code working, then you can use page-write and multiple read functions of your eeprom. Even the larger 64k eeproms can be written quite fast if you do it a page at a time. And having set a start address, you can read consecutive bytes ad-infinitum.

I hope that this helps.

David

List of 74 messages in thread
TopicAuthorDate
How To Write the Data to EEPROM (Seial)            01/01/70 00:00      
   Slow the i2c clock            01/01/70 00:00      
      Well i am using 12 MHz with 8051            01/01/70 00:00      
         Speed            01/01/70 00:00      
         this is upon you to determine            01/01/70 00:00      
   the poor developer's "logic analyzer"....            01/01/70 00:00      
   What happens in the real hardware?            01/01/70 00:00      
      writing IS broken - but in several ways            01/01/70 00:00      
         I I Sir, i will use spaces for next, :-)            01/01/70 00:00      
            delay for write plus the real error            01/01/70 00:00      
      Sir i'v used P1 to see that data is written or not            01/01/70 00:00      
         Order of magnitude!            01/01/70 00:00      
         is it 100kHz or 1000kHz?            01/01/70 00:00      
      I dont have osciloscop :-(            01/01/70 00:00      
   In real world the P1 is High,            01/01/70 00:00      
   Code Comments            01/01/70 00:00      
      again "I I SIR", well sir i have got your Point,            01/01/70 00:00      
         to Asif (and others)            01/01/70 00:00      
   I2C Part number ...            01/01/70 00:00      
   Even the NOPs and delay wont working            01/01/70 00:00      
   I have Codded this in C,But still not working :-(            01/01/70 00:00      
      not a good idea            01/01/70 00:00      
      Asif,s C Code for I2C            01/01/70 00:00      
         You missed the point            01/01/70 00:00      
            Point taken            01/01/70 00:00      
   are you sure they are IIC, not SMB            01/01/70 00:00      
      To be very Honest i dont know tha its IIC or SMB            01/01/70 00:00      
         try this            01/01/70 00:00      
   Have you looked here?            01/01/70 00:00      
      Working code...            01/01/70 00:00      
         advice to Asif            01/01/70 00:00      
            i know that i dont have to Copy Paste,, :-)            01/01/70 00:00      
               WoW i have EEPROM Programmer,            01/01/70 00:00      
                  is it working at all?            01/01/70 00:00      
            What about the A0, A1... pins on the 24C04            01/01/70 00:00      
   Well sir Here are Comparision of C and ASM(My Way)            01/01/70 00:00      
      I few I2C questions            01/01/70 00:00      
         it is not uncommon to list IIC addresses this way,            01/01/70 00:00      
            I was askin for schematics...            01/01/70 00:00      
               Here is the Schematics,            01/01/70 00:00      
                  Pardon??            01/01/70 00:00      
                     Well sir it means this ckt is Dummy            01/01/70 00:00      
                        OK            01/01/70 00:00      
                           Well i am straight forward programmer :-)            01/01/70 00:00      
                           Well the Hardware Circuit is Exactly same as it.            01/01/70 00:00      
                              Not at all!            01/01/70 00:00      
                     Recheck it Sir i have added labels, :-)            01/01/70 00:00      
                        but            01/01/70 00:00      
                        and blinkey?            01/01/70 00:00      
                           It really worked :-) MCu is stucked at ACK            01/01/70 00:00      
                              Stuck at ACK            01/01/70 00:00      
                              Stuck in no ACK            01/01/70 00:00      
                                 Sorry i havent understood, forgive my dumbness            01/01/70 00:00      
                                    Stuck in ACK (Reminds me of work)            01/01/70 00:00      
                                    Still Stuck?            01/01/70 00:00      
                                       Sir i am gonna use the Acknowledge polling tech:-)            01/01/70 00:00      
                                          one note            01/01/70 00:00      
                                             Nice note:-) but it Clocking was wrong,            01/01/70 00:00      
                                       Sir i am gonna use the Acknowledge polling tech:-)            01/01/70 00:00      
   Here is working Code, :-)            01/01/70 00:00      
      for your benefit and others            01/01/70 00:00      
         Havent Gotten your Idea ?            01/01/70 00:00      
            The idea is            01/01/70 00:00      
               WoW i have Gotten the IDEA , thanks            01/01/70 00:00      
   The Problem Solved Successfully,Thanks everybody            01/01/70 00:00      
      You have the code working now            01/01/70 00:00      
         Thanks David            01/01/70 00:00      
         Partially agree            01/01/70 00:00      
            100% agreed            01/01/70 00:00      
            I was rying to help !!            01/01/70 00:00      
               true and untrue            01/01/70 00:00      
                  C Loops are not Perfect, agreed            01/01/70 00:00      
                  C timing loops            01/01/70 00:00      
                     then don't call it C            01/01/70 00:00      

Back to Subject List