I have been trying to get a 18F2620 to run as a slave. i ran across this in the ERRATA for this device.
Code:
43. Module: MSSP (I2C Slave)
The MSSP module operating in I2C, 7-Bit Slave
mode (SSPM3:SSPM0 = 0110) may not send a
NACK bit (/ACK) in response to receiving the slave
address loaded in SSPADD<7:1>. Addresses are
in one of these ranges:
• 0x00 to 0x07
• 0x78 to 0x7F
These addresses were reserved by Philips® Semiconductors
in “The I2C Specification”, Version 2.1,
released January 2000. Section 10.1 “Definition of
bits in the first byte” defines the purposes of these
addresses.
This specification can be found at:
http://www.semiconductors.philips.com/i2c
Work around
This version of the silicon does not respond to
slave addresses in the ranges previously listed.
Use either of these work arounds:
• Change the 7-bit slave address in SSPADD to
an address in the range of 0x08 to 0x77.
• Use Revision B silicon. This version of silicon
removes this issue’s addressing restrictions.
I have gotten sporadic results for the master reading the slave in the following code.

Darrell's Instant Interrupt

Code:
    '   Interrupt definition   
    '   ====================
        '   USB interrupt used to keep USB connection alive
INCLUDE "DT_INTS-18.bas"    ' Base Interrupt System
INCLUDE "ReEnterPBP-18.bas"     ' Include if using PBP interrupts

ASM
INT_LIST  macro    ; IntSource,         Label,  Type, ResetFlag?
        INT_Handler    SSP_INT,  _I2C_Int,   PBP,  yes

    endm
    INT_CREATE               ; Creates the interrupt processor
endasm

''----------------- Initialization Done! -----------------------------

@ INT_ENABLE  SSP_INT     ; Master Synchronous Serial Port Interrupt Flag bit. The transmission/reception is complete
'txbuffer = 0
The Interrupt handler

Code:
I2C_Int:
If R_W = 0 then
    if D_A = 0 then
       address = SSPBUF
    else

Still working on master to slave write
'        if bf = 1 then
'           if rxcnt <= rxbufferlen then
'              datain[rxcnt] = SSPBUF
'              rxcnt = rxcnt + 1
'              if rxcnt = rxbufferlen then rxcnt = 0
'           endif   
          
          
        EndIF 
    endif
else
    dataout = SSPBUF     'dummy read
    if txcnt > 0 then
       SSPBUF = txbuffer[txoutptr]
       txoutptr = txoutptr + 1       
              if txoutptr = txbufferlen then txoutptr = 0
       txcnt = txcnt - 1
    else
    'no byte to send
    endif       
endif
CKP = 1 
@ INT_RETURN
and the main loop. I want to send three bytes to the master. In this case "three sevens".

Code:
Main:
SSPOV = 0
WCOL = 0
     
     if txcnt < txbufferlen - 1 then
                    
            TxBuffer[txinptr] = 7
            txinptr = txinptr + 1
            if txinptr = txbufferlen then txinptr = 0
           
            txcnt = txcnt + 1
            
    endif

WrData=0 



goto main 
end
I did the same slave program in "C" and it works well.

The Master is reading and writing to a RTC module and a bank of 4 24lc256 EEProms and a I2C Port expander with out any problems.

It is getting close

Take care

Dave