#include #include "my_i2c_v4.h" void IdleI2C( void ) //OKOK { while ( ( SSP1CON2 & 0x1F ) | ( SSP1STATbits.R_nW ) ) continue; } void OpenI2C( unsigned char sync_mode, unsigned char slew ) // { /* SSP1STAT &= 0x3F; // power on state SSP1CON1 = 0x00; // power on state SSP1CON2 = 0x00; // power on state SSP1CON1 |= sync_mode; // select serial mode SSP1STAT |= slew; // slew rate on/off */ SSPSTAT = 0x80; /* Slew rate disabled */ SSPCON1 = 0x28; /* Master mode */ SSPCON2 = 0x00; I2C_SCL = 1; // Set SCL1 (PORTC,3) pin to input I2C_SDA = 1; // Set SDA1 (PORTC,4) pin to input SSP1CON1 |= SSPENB; // enable synchronous serial port } signed char getsI2C( unsigned char *rdptr, unsigned char length ) //OK { while ( length-- ) // perform getcI2C1() for 'length' number of bytes { *rdptr++ = getcI2C(); // save byte received while ( SSP1CON2bits.RCEN ); // check that receive sequence is over if ( PIR2bits.BCL1IF ) // test for bus collision { return ( -1 ); // return with Bus Collision error } if( ((SSP1CON1&0x0F)==0x08) || ((SSP1CON1&0x0F)==0x0B) ) //master mode only { if ( length ) // test if 'length' bytes have been read { SSP1CON2bits.ACKDT = 0; // set acknowledge bit state for ACK SSP1CON2bits.ACKEN = 1; // initiate bus acknowledge sequence while ( SSP1CON2bits.ACKEN ); // wait until ACK sequence is over } } } return ( 0 ); // last byte received so don't send ACK } unsigned char ReadI2C( void ) //OKOK { if( ((SSP1CON1&0x0F)==0x08) || ((SSP1CON1&0x0F)==0x0B) ) //master mode only SSP1CON2bits.RCEN = 1; // enable master for 1 byte reception while ( !SSP1STATbits.BF ); // wait until byte received return ( SSP1BUF ); // return with read byte } signed char putsI2C( unsigned char *wrptr ) //OKOK { unsigned char temp; while ( *wrptr ) // transmit data until null character { if ( SSP1CON1bits.SSP1M3 ) // if Master transmitter then execute the following { temp = putcI2C ( *wrptr ); if (temp ) return ( temp ); //if ( putcI2C1( *wrptr ) ) // write 1 byte //{ // return ( -3 ); // return with write collision error //} //IdleI2C1(); // test for idle condition //if ( SSP1CON2bits.ACKSTAT ) // test received ack bit state //{ // return ( -2 ); // bus device responded with NOT ACK //} // terminate putsI2C1() function } else // else Slave transmitter { PIR1bits.SSP1IF = 0; // reset SSP1IF bit SSP1BUF = *wrptr; // load SSP1BUF with new data SSP1CON1bits.CKP = 1; // release clock line while ( !PIR1bits.SSP1IF ); // wait until ninth clock pulse received if ( ( SSP1CON1bits.CKP ) && ( !SSP1STATbits.BF ) )// if R/W=0 and BF=0, NOT ACK was received { return ( -2 ); // terminate PutsI2C1() function } } wrptr ++; // increment pointer } // continue data writes until null character return ( 0 ); } void NotAckI2C( void ) //OKOK { SSP1CON2bits.ACKDT = 1; // set acknowledge bit for not ACK SSP1CON2bits.ACKEN = 1; // initiate bus acknowledge sequence } void CloseI2C( void ) //OKOK { SSP1CON1 &= 0xDF; // disable synchronous serial port } signed char WriteI2C( unsigned char data_out ) //OKOK { SSP1BUF = data_out; // write single byte to SSP1BUF if (SSP1CON1bits.WCOL) { // test if write collision occurred return ( -1 ); // if WCOL bit is set return negative # } else { if( ((SSP1CON1&0x0F)!=0x08) && ((SSP1CON1&0x0F)!=0x0B) ) {//slave mode only SSP1CON1bits.CKP = 1; // release clock line while ( !PIR1bits.SSP1IF ); // wait until ninth clock pulse received { if ( ( !SSP1STATbits.R_nW ) && ( !SSP1STATbits.BF ) ) {// if R/W=0 and BF=0, NOT ACK was received return ( -2 ); //Return NACK } else { return(0); //Return ACK } } } else if( ((SSP1CON1&0x0F)==0x08) || ((SSP1CON1&0x0F)==0x0B) ) { //master mode only while( SSP1STATbits.BF ); // wait until write cycle is complete IdleI2C(); // ensure module is idle if ( SSP1CON2bits.ACKSTAT ) {// test for ACK condition received return ( -2 ); //Return NACK } else { return ( 0 ); //Return ACK } } } return (0); //OVO SAM DODAO DA NE BACA WARNING } void StartI2C( void ) //OKOK { SSP1CON2bits.SEN = 1; // initiate bus start condition } void RestartI2C( void ) //OKOK { SSP1CON2bits.RSEN = 1; // initiate bus restart condition } void StopI2C( void ) { SSP1CON2bits.PEN = 1; // initiate bus stop condition }