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 support@ccsinfo.com

write a 64K xmodem file to a 24c512 using i2c on a PIC16F690

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



Joined: 31 May 2010
Posts: 5

View user's profile Send private message

write a 64K xmodem file to a 24c512 using i2c on a PIC16F690
PostPosted: Thu Dec 09, 2010 11:13 am     Reply with quote

Hi folks.
I am not able to do a full write of a 64KB .bin file of a 24c512 i2c eeprom using a XMODEM 128 protocol.

Write work fine until 0x2000h (8192bytes) address, the pic hang-up.
If i comment the 4 lines with write_ext_eeprom the file is received fine, but of course isn't write.

here is the code:

Code:
void receive(void)
{
  byte c=0,a=0;

  if(rxchar<3)//SOH + BLOQ + C-1
       buffer1[rxchar]=getc();
  if ((rxchar>=3) && (rxchar<35))
       buffer2[rxchar-3]=getc();
  if ((rxchar>=35) && (rxchar<67))
       buffer3[rxchar-35]=getc();
  if ((rxchar>=67) && (rxchar<99))
       buffer4[rxchar-67]=getc();
  if ((rxchar>=99) && (rxchar<131))
       buffer5[rxchar-99]=getc();
  if (rxchar==131)
      chk=getc();
  rxchar++;       
  switch (buffer1[0]) { 
            case SOH:
                 if (rxchar>131) // we have whole frame
                 {
                    c=~buffer1[1];
                    if (buffer1[2]==c) //checksum of no.frame correct
                    {
                      for (c=0;c<32;c++)
                      {                              a+=buffer2[c];
                        a+=buffer3[c];
                        a+=buffer4[c];
                        a+=buffer5[c];
                      }
               
                      if(a==chk)   //Checksum data correct
                      {
                         for (c=0;c<32;c++)
                         {
               write_ext_eeprom(page+c, buffer2[c]);
                            write_ext_eeprom(page+c+32, buffer3[c]);
                            write_ext_eeprom(page+c+64, buffer4[c]);
                            write_ext_eeprom(page+c+96, buffer5[c]);
                          }
            page+=128; //pages of buffers
                         rxchar=0;  //Number of bytes of the frame
                         putc(ACK);
                      }
                      else
                 {   
                         putc(NAK); //retransmit frame chksum error
                     }               

                    }//chk.frame correct
                    else
                       putc(NAK);  //retransmit frame header error
                 }
                 break;   
            case EOT:
               putc(ACK);
               rx=0;
               break;
            case CAN:
               putc(ACK);
               break;
            }
}


any idea???
temtronic



Joined: 01 Jul 2010
Posts: 9173
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Thu Dec 09, 2010 1:11 pm     Reply with quote

Since you say that it works 'fine' for the first 8KB then ...

Off the top of my head, I'd say the function write_ext_eeprom is limited to 8KB, perhaps a 'page' worth of data.

Would have to look at it in detail to see though.
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