kal_uint8 SerialCommRxByte(kal_uint8 addr, kal_uint8 *data) { kal_int16 i; kal_uint16 dataRead=0; *data = 0; GPIO_WriteIO(1, LE); GPIO_InitIO(1,SDA); for(i=8; --i>=0;){ GPIO_WriteIO( 0, SCL); GPIO_WriteIO(addr&0x01, SDA); GPIO_WriteIO(1, SCL); addr >>= 1; I2C_DUMMY_DELAY(5); } GPIO_InitIO(0,SDA); GPIO_WriteIO(0, LE); for(i=0; i<8; i++){ GPIO_WriteIO( 0, SCL); I2C_DUMMY_DELAY(5); GPIO_WriteIO( 1, SCL); dataRead = GPIO_ReadIO(SDA); *data |= (dataRead << i); } I2C_DUMMY_DELAY(10); }
kal_uint8 SerialCommTxByte(kal_uint8 addr, kal_uint8 data) { kal_int16 i; GPIO_WriteIO(1, LE); GPIO_InitIO(1,SDA); for(i=8; --i>=0;){ GPIO_WriteIO( 0, SCL); GPIO_WriteIO(data&0x01, SDA); data >>= 1; I2C_DUMMY_DELAY(5); GPIO_WriteIO( 1, SCL); I2C_DUMMY_DELAY(5); } for(i=8; --i>=0;){ GPIO_WriteIO( 0, SCL); GPIO_WriteIO(addr&0x01, SDA); addr >>= 1; I2C_DUMMY_DELAY(5); GPIO_WriteIO( 1, SCL); I2C_DUMMY_DELAY(5); } GPIO_InitIO(0,SDA); GPIO_WriteIO(0, LE); I2C_DUMMY_DELAY(10); }
/* Stop sequence of I2C SDA ¢z¢w¢w ¢w¢w¢w¢} SCL ¢z¢w¢w¢w ¢w¢w¢} */ void SerialCommStop(void) { GPIO_InitIO(OUTPUT,SDA); GPIO_WriteIO(0,SCL); I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO(0,SDA); I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO(1,SCL); I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO(1,SDA); I2C_DUMMY_DELAY(I2C_DELAY); }
/* Start sequence of I2C SDA ¢w¢w¢{ ¢|¢w¢w SCL ¢w¢w¢w¢{ ¢|¢w¢w */ void SerialCommStart(void) /* Prepare the SDA and SCL for sending/receiving */ { GPIO_InitIO(OUTPUT,SDA); GPIO_WriteIO(1,SDA); I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO(1,SCL); I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO(0,SDA); I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO(0,SCL); I2C_DUMMY_DELAY(I2C_DELAY); }
void SerialCommRxByte(kal_uint8 *data, kal_uint8 ack) { kal_int16 i; kal_uint32 dataCache; dataCache = 0; GPIO_InitIO(0,SDA); for(i=8; --i>=0;){ dataCache <<= 1; GPIO_WriteIO(1, SCL); I2C_DUMMY_DELAY(5); dataCache |= GPIO_ReadIO(SDA); GPIO_WriteIO(0, SCL); I2C_DUMMY_DELAY(5); } GPIO_InitIO(1,SDA); GPIO_WriteIO(ack, SDA); I2C_DUMMY_DELAY(5); GPIO_WriteIO(1, SCL); *data = (kal_uint8)dataCache; GPIO_WriteIO(0, SCL); }
unsigned int SerialCommTxByte(unsigned char data) /* return 0 --> ack */ { int i, ack; GPIO_InitIO(OUTPUT,SDA); for(i=8; --i>0;){ GPIO_WriteIO((data>>i)&0x01, SDA); I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO( 1, SCL); /* high */ I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO( 0, SCL); /* low */ I2C_DUMMY_DELAY(I2C_DELAY); } GPIO_WriteIO((data>>i)&0x01, SDA); I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO( 1, SCL); /* high */ I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO( 0, SCL); /* low */ I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO(0, SDA); I2C_DUMMY_DELAY(I2C_DELAY); GPIO_InitIO(INPUT,SDA); I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO(1, SCL); I2C_DUMMY_DELAY(I2C_DELAY); ack = GPIO_ReadIO(SDA); /// ack 1: error , 0:ok GPIO_WriteIO(0, SCL); I2C_DUMMY_DELAY(I2C_DELAY); if(ack==1) return 0; else return 1; }
void GPIO_InitIO(unsigned int dir, unsigned int pin) { unsigned int no,remainder; no = pin >>4; remainder = pin & 0xf; if (dir == OUTPUT) { DRV_WriteReg16(GPIO_PULLEN_SET(no),(1 << remainder)); DRV_WriteReg16(GPIO_DIR_SET(no),(1 << remainder)); } else { DRV_WriteReg16(GPIO_PULLEN_CLR(no),(1 << remainder)); DRV_WriteReg16(GPIO_DIR_CLR(no),(1 << remainder)); } I2C_DUMMY_DELAY(100); }
void SerialCommRxByte(unsigned char *data, unsigned char ack) { int i; unsigned int dataCache; dataCache = 0; GPIO_InitIO(INPUT,SDA); for(i=8; --i>=0;){ dataCache <<= 1; I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO(1, SCL); I2C_DUMMY_DELAY(I2C_DELAY); dataCache |= GPIO_ReadIO(SDA); GPIO_WriteIO(0, SCL); I2C_DUMMY_DELAY(I2C_DELAY); } GPIO_InitIO(OUTPUT,SDA); GPIO_WriteIO(ack, SDA); I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO(1, SCL); I2C_DUMMY_DELAY(I2C_DELAY); GPIO_WriteIO(0, SCL); I2C_DUMMY_DELAY(I2C_DELAY); *data = (unsigned char)dataCache; }
kal_uint8 SerialCommTxByte(kal_uint8 data) /* return 0 --> ack */ { kal_int16 i, ack; GPIO_InitIO(1,SDA); for(i=8; --i>0;){ GPIO_WriteIO((data>>i)&0x01, SDA); I2C_DUMMY_DELAY(5); GPIO_WriteIO( 1, SCL); /* high */ I2C_DUMMY_DELAY(5); GPIO_WriteIO( 0, SCL); /* low */ I2C_DUMMY_DELAY(5); } GPIO_WriteIO((data>>i)&0x01, SDA); I2C_DUMMY_DELAY(5); GPIO_WriteIO( 1, SCL); /* high */ I2C_DUMMY_DELAY(5); GPIO_WriteIO( 0, SCL); /* low */ GPIO_InitIO(0,SDA); GPIO_WriteIO(1, SCL); I2C_DUMMY_DELAY(5); ack = GPIO_ReadIO(SDA); /// ack GPIO_WriteIO(0, SCL); }