/******************************************************************************* * Function Name : i2c_Send_Frame * Description : It sends I2C frame * Input : DeviceAddress is the destination device address * pBUffer is the buffer data * NoOfBytes is the number of bytes * Output : None * Return : status *******************************************************************************/ static int8u i2c_Send_Frame (int8u DeviceAddress, int8u *pBuffer, int8u NoOfBytes) { int8u i, data; SC2_TWICTRL1 |= SC_TWISTART; // send start WAIT_CMD_FIN(); SEND_BYTE(DeviceAddress); // send the address low byte WAIT_TX_FIN(); // loop sending the data for (i=0; i<NoOfBytes; i++) { halInternalResetWatchDog(); data = *(pBuffer+i); SEND_BYTE(data); WAIT_TX_FIN(); } SC2_TWICTRL1 |= SC_TWISTOP; WAIT_CMD_FIN(); return SUCCESS; }/* end i2c_Send_Frame() */
/******************************************************************************* * Function Name : i2c_Receive_Frame * Description : It receives an I2C frame and stores it in pBUffer parameter * Input : slave_addr is the slave address * reg_addr is the register address * NoOfBytes is the numenr of bytes to read starting from reg_addr * Output : buffer * Return : status *******************************************************************************/ static int8u i2c_Receive_Frame (int8u slave_addr, int8u reg_addr, int8u *pBuffer, int8u NoOfBytes) { int8u i, addr = reg_addr; if (NoOfBytes > 1) addr += REPETIR; SC2_TWICTRL1 |= SC_TWISTART; // send start WAIT_CMD_FIN(); SEND_BYTE(slave_addr | 0x00); // send the address low byte WAIT_TX_FIN(); SEND_BYTE(addr); WAIT_TX_FIN(); SC2_TWICTRL1 |= SC_TWISTART; // send start WAIT_CMD_FIN(); SEND_BYTE(slave_addr | 0x01); // send the address low byte WAIT_TX_FIN(); // loop receiving the data for (i=0;i<NoOfBytes;i++){ halInternalResetWatchDog(); if (i < (NoOfBytes - 1)) SC2_TWICTRL2 |= SC_TWIACK; // ack on receipt of data else SC2_TWICTRL2 &= ~SC_TWIACK; // don't ack if last one SC2_TWICTRL1 |= SC_TWIRECV; // set to receive WAIT_RX_FIN(); *(pBuffer+i) = SC2_DATA; // receive data } SC2_TWICTRL1 |= SC_TWISTOP; // send STOP WAIT_CMD_FIN(); return SUCCESS; }/* end i2c_Receive_Frame() */
ssize_t frame_send(FILE *out, void *data, size_t nbytes) { char *d; char *end; uint16_t crc = FRAME_CRC_INIT; fputc(FRAME_START, out); for(d = data, end = d + nbytes; d < end; d++) { char c = *d; crc = crc_ccitt_update(crc, c); SEND_BYTE(out, c); } crc = htons(crc); SEND_BYTE(out, crc >> 8); SEND_BYTE(out, crc & 0xff); fputc(FRAME_START, out); fflush(out); return nbytes; }