#include "reg52modified.h" #include "types.h" #include "tusb2136.h" extern WORD pmb_clk_low_stretch_timer; extern BYTE previous_crc8; extern bit PMBus_Busy; // 1 - busy; 0 - idle extern bit PMBus_Group_Command_Busy; // 1 - busy; 0 - idle extern bit Set_400KHz; // 1 for 400KHz; 0 for 100KHz extern BYTE xdata pbOutBufferAddress[EP_MAX_PACKET_SIZE]; // ENDPOINT 1 OUT X buffer extern BYTE xdata pbInBufferAddress[EP_MAX_PACKET_SIZE]; //EndPoint 1 in x buffer BYTE i2c_start(void); BYTE i2c_restart(void); BYTE i2c_stop(void); BYTE i2c_write_bytes(BYTE num_of_bytes, BYTE * source_buf); BYTE i2c_read_bytes(BYTE num_of_bytes, BYTE * destination_buf, BYTE nack_byte); void i2c_reset(void); BYTE easyScale_write_166Kbps(BYTE * requestAck, BYTE * requestLineHigh, BYTE * source_buf); BYTE easyScale_write_100Kbps(BYTE * requestAck, BYTE * requestLineHigh, BYTE * source_buf); BYTE easyScale_write_10Kbps(BYTE * requestAck, BYTE * requestLineHigh, BYTE * source_buf); BYTE easyScale_write_1_6Kbps(BYTE * requestAck, BYTE * requestLineHigh, BYTE * source_buf); void easyScale_Byte_166Kbps(BYTE theData); void easyScale_Byte_100Kbps(BYTE theData); void easyScale_Byte_10Kbps(BYTE theData); void easyScale_Byte_1_6Kbps(BYTE theData); BYTE volatile bdata i2c_bits; sbit i2c_bit7 = i2c_bits ^ 7; sbit i2c_bit6 = i2c_bits ^ 6; sbit i2c_bit5 = i2c_bits ^ 5; sbit i2c_bit4 = i2c_bits ^ 4; sbit i2c_bit3 = i2c_bits ^ 3; sbit i2c_bit2 = i2c_bits ^ 2; sbit i2c_bit1 = i2c_bits ^ 1; sbit i2c_bit0 = i2c_bits ^ 0; BYTE delay_count; // function: write 1 byte of data to slave, whereas the data is from source_buf // return: 1 if fail // 0 if success BYTE easyScale_write_166Kbps(BYTE * requestAck, BYTE * requestLineHigh, BYTE * source_buf) { //create a start condition ********************************* PMB_DATA = 1; // set it high so that we can make it an input //delay 2.5 us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; if (!PMB_DATA) return ERROR; // PMB_DATA should never be held low by any slave //end of start condition ********************************** //*****************************first byte******************* easyScale_Byte_166Kbps(*source_buf); //create a End of start condition ********************************* PMB_DATA = 0; //delay 2.5us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; //end of end of start condition *********************************** //next byte source_buf++; //create another start condition ********************************* PMB_DATA = 1; // set it high so that we can make it an input //delay 2.5us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; if (!PMB_DATA) return ERROR; // PMB_DATA should never be held low by any slave //end of start condition ********************************** //*******************************2nd byte*************************** easyScale_Byte_166Kbps(*source_buf); //create a End of start condition ********************************* PMB_DATA = 0; //delay 2.5 us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; //end of end of start condition ********************************* //check for ack request if (*requestAck == 0 && *requestLineHigh == 0){ //special case pull low and no delay PMB_DATA = 0; // pull low and return with no ack //no slave ack pbInBufferAddress[2] = 0; //exit return NO_ERROR; //success }else{ //every other case we pull the line high PMB_DATA = 1; // release PMB_DATA for floating and configure it for input //delay to give time to the slave to pull down and ack for (delay_count = 255; delay_count; delay_count--) _nop_(); // WW for (delay_count = 255; delay_count; delay_count--) _nop_(); // WW //check for ack if (PMB_DATA){ //no slave ack pbInBufferAddress[2] = 0; }else{ //slave ack pbInBufferAddress[2] = 1; } //pull the line high or low depending on request if (*requestLineHigh){ PMB_DATA = 1; // pull PMB_DATA high }else{ PMB_DATA = 0; // pull PMB_DATA low } return NO_ERROR; // success } } BYTE easyScale_write_100Kbps(BYTE * requestAck, BYTE * requestLineHigh, BYTE * source_buf) { //create a start condition ********************************* PMB_DATA = 1; // set it high so that we can make it an input //delay 2.5 us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; if (!PMB_DATA) return ERROR; // PMB_DATA should never be held low by any slave //end of start condition ********************************** //*****************************first byte******************* easyScale_Byte_100Kbps(*source_buf); //create a End of start condition ********************************* PMB_DATA = 0; //delay 2.5us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; //end of end of start condition *********************************** //next byte source_buf++; //create another start condition ********************************* PMB_DATA = 1; // set it high so that we can make it an input //delay 2.5us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; if (!PMB_DATA) return ERROR; // PMB_DATA should never be held low by any slave //end of start condition ********************************** //*******************************2nd byte*************************** easyScale_Byte_100Kbps(*source_buf); //create a End of start condition ********************************* PMB_DATA = 0; //delay 2.5 us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; //end of end of start condition ********************************* //check for ack request if (*requestAck == 0 && *requestLineHigh == 0){ //special case pull low and no delay PMB_DATA = 0; // pull low and return with no ack //no slave ack pbInBufferAddress[2] = 0; //exit return NO_ERROR; //success }else{ //every other case we pull the line high PMB_DATA = 1; // release PMB_DATA for floating and configure it for input //delay to give time to the slave to pull down and ack for (delay_count = 255; delay_count; delay_count--) _nop_(); // WW for (delay_count = 255; delay_count; delay_count--) _nop_(); // WW //check for ack if (PMB_DATA){ //no slave ack pbInBufferAddress[2] = 0; }else{ //slave ack pbInBufferAddress[2] = 1; } //pull the line high or low depending on request if (*requestLineHigh){ PMB_DATA = 1; // pull PMB_DATA high }else{ PMB_DATA = 0; // pull PMB_DATA low } return NO_ERROR; // success } } // function: write 1 byte of data to slave, whereas the data is from source_buf // return: 1 if fail // 0 if success BYTE easyScale_write_10Kbps(BYTE * requestAck, BYTE * requestLineHigh, BYTE * source_buf) { //create a start condition ********************************* PMB_DATA = 1; // set it high so that we can make it an input //delay 2.5 us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; if (!PMB_DATA) return ERROR; // PMB_DATA should never be held low by any slave //end of start condition ********************************** //*****************************first byte******************* easyScale_Byte_10Kbps(*source_buf); //create a End of start condition ********************************* PMB_DATA = 0; //delay 2.5us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; //end of end of start condition *********************************** //next byte source_buf++; //create another start condition ********************************* PMB_DATA = 1; // set it high so that we can make it an input //delay 2.5us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; if (!PMB_DATA) return ERROR; // PMB_DATA should never be held low by any slave //end of start condition ********************************** //*******************************2nd byte*************************** easyScale_Byte_10Kbps(*source_buf); //create a End of start condition ********************************* PMB_DATA = 0; //delay 2.5 us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; //end of end of start condition ********************************* //check for ack request if (*requestAck == 0 && *requestLineHigh == 0){ //special case pull low and no delay PMB_DATA = 0; // pull low and return with no ack //no slave ack pbInBufferAddress[2] = 0; //exit return NO_ERROR; //success }else{ //every other case we pull the line high PMB_DATA = 1; // release PMB_DATA for floating and configure it for input //delay to give time to the slave to pull down and ack for (delay_count = 255; delay_count; delay_count--) _nop_(); // WW for (delay_count = 255; delay_count; delay_count--) _nop_(); // WW //check for ack if (PMB_DATA){ //no slave ack pbInBufferAddress[2] = 0; }else{ //slave ack pbInBufferAddress[2] = 1; } //pull the line high or low depending on request if (*requestLineHigh){ PMB_DATA = 1; // pull PMB_DATA high }else{ PMB_DATA = 0; // pull PMB_DATA low } return NO_ERROR; // success } } // function: write 1 byte of data to slave, whereas the data is from source_buf // return: 1 if fail // 0 if success BYTE easyScale_write_1_6Kbps(BYTE * requestAck, BYTE * requestLineHigh, BYTE * source_buf) { //create a start condition ********************************* PMB_DATA = 1; // set it high so that we can make it an input //delay 2.5 us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; if (!PMB_DATA) return ERROR; // PMB_DATA should never be held low by any slave //end of start condition ********************************** //*****************************first byte******************* easyScale_Byte_1_6Kbps(*source_buf); //create a End of start condition ********************************* PMB_DATA = 0; //delay 2.5us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; //end of end of start condition *********************************** //next byte source_buf++; //create another start condition ********************************* PMB_DATA = 1; // set it high so that we can make it an input //delay 2.5us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; if (!PMB_DATA) return ERROR; // PMB_DATA should never be held low by any slave //end of start condition ********************************** //*******************************2nd byte*************************** easyScale_Byte_1_6Kbps(*source_buf); //create a End of start condition ********************************* PMB_DATA = 0; //delay 2.5 us DELAY_1000NS; DELAY_1000NS; DELAY_500NS; //end of end of start condition ********************************* //check for ack request if (*requestAck == 0 && *requestLineHigh == 0){ //special case pull low and no delay PMB_DATA = 0; // pull low and return with no ack //no slave ack pbInBufferAddress[2] = 0; //exit return NO_ERROR; //success }else{ //every other case we pull the line high PMB_DATA = 1; // release PMB_DATA for floating and configure it for input //delay to give time to the slave to pull down and ack for (delay_count = 255; delay_count; delay_count--) _nop_(); // WW for (delay_count = 255; delay_count; delay_count--) _nop_(); // WW //check for ack if (PMB_DATA){ //no slave ack pbInBufferAddress[2] = 0; }else{ //slave ack pbInBufferAddress[2] = 1; } //pull the line high or low depending on request if (*requestLineHigh){ PMB_DATA = 1; // pull PMB_DATA high }else{ PMB_DATA = 0; // pull PMB_DATA low } return NO_ERROR; // success } } void easyScale_Byte_166Kbps(BYTE theData){ //set the data source i2c_bits = theData; //bit 7 PMB_DATA = 0; if (!i2c_bit7) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} PMB_DATA = 1; if (i2c_bit7) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} //bit 6 PMB_DATA = 0; if (!i2c_bit6) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} PMB_DATA = 1; if (i2c_bit6) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} //bit 5 PMB_DATA = 0; if (!i2c_bit5) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} PMB_DATA = 1; if (i2c_bit5) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} //bit 4 PMB_DATA = 0; if (!i2c_bit4) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} PMB_DATA = 1; if (i2c_bit4) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} //bit 3 PMB_DATA = 0; if (!i2c_bit3) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} PMB_DATA = 1; if (i2c_bit3) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} //bit 2 PMB_DATA = 0; if (!i2c_bit2) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} PMB_DATA = 1; if (i2c_bit2) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} //bit 1 PMB_DATA = 0; if (!i2c_bit1) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} PMB_DATA = 1; if (i2c_bit1) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} //bit 0 PMB_DATA = 0; if (!i2c_bit0) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} PMB_DATA = 1; if (i2c_bit0) {for (delay_count = 3; delay_count; delay_count--) _nop_(); } else {DELAY_1000NS;DELAY_250NS;} } void easyScale_Byte_100Kbps(BYTE theData){ //set the data source i2c_bits = theData; //bit 7 PMB_DATA = 0; if (!i2c_bit7) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit7) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } //bit 6 PMB_DATA = 0; if (!i2c_bit6) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit6) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } //bit 5 PMB_DATA = 0; if (!i2c_bit5) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit5) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } //bit 4 PMB_DATA = 0; if (!i2c_bit4) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit4) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } //bit 3 PMB_DATA = 0; if (!i2c_bit3) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit3) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } //bit 2 PMB_DATA = 0; if (!i2c_bit2) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit2) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } //bit 1 PMB_DATA = 0; if (!i2c_bit1) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit1) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } //bit 0 PMB_DATA = 0; if (!i2c_bit0) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit0) {for (delay_count = 6; delay_count; delay_count--) _nop_(); } else {for (delay_count = 3; delay_count; delay_count--) _nop_(); } } void easyScale_Byte_10Kbps(BYTE theData){ //set the data source i2c_bits = theData; //bit 7 PMB_DATA = 0; if (!i2c_bit7) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit7) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } //bit 6 PMB_DATA = 0; if (!i2c_bit6) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit6) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } //bit 5 PMB_DATA = 0; if (!i2c_bit5) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit5) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } //bit 4 PMB_DATA = 0; if (!i2c_bit4) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit4) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } //bit 3 PMB_DATA = 0; if (!i2c_bit3) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit3) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } //bit 2 PMB_DATA = 0; if (!i2c_bit2) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit2) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } //bit 1 PMB_DATA = 0; if (!i2c_bit1) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit1) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } //bit 0 PMB_DATA = 0; if (!i2c_bit0) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit0) {for (delay_count = 86; delay_count; delay_count--) _nop_(); } else {for (delay_count = 43; delay_count; delay_count--) _nop_(); } } void easyScale_Byte_1_6Kbps(BYTE theData){ //set the data source i2c_bits = theData; //bit 7 PMB_DATA = 0; if (!i2c_bit7) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 5; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit7) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } //bit 6 PMB_DATA = 0; if (!i2c_bit6) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit6) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } //bit 5 PMB_DATA = 0; if (!i2c_bit5) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit5) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } //bit 4 PMB_DATA = 0; if (!i2c_bit4) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit4) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } //bit 3 PMB_DATA = 0; if (!i2c_bit3) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit3) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } //bit 2 PMB_DATA = 0; if (!i2c_bit2) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit2) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } //bit 1 PMB_DATA = 0; if (!i2c_bit1) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit1) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } //bit 0 PMB_DATA = 0; if (!i2c_bit0) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } PMB_DATA = 1; if (i2c_bit0) {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 255; delay_count; delay_count--) _nop_(); } else {for (delay_count = 255; delay_count; delay_count--) _nop_(); for (delay_count = 25; delay_count; delay_count--) _nop_(); } }