uint8_t I2C_Start(uint8_t dev_id, uint8_t dev_addr, uint8_t addr){ uint8_t s; // First step, send start s = I2C_Transmit(I2C_START); if (s == TW_MT_ARB_LOST || (s != TW_START && s != TW_REP_START)){ printf("Error(Start): %x\r\n",s); goto failure; } // Second step, set device id and device address TWDR = (dev_id & 0xF0) | ((dev_addr << 1) & 0x0E) | TW_WRITE; s = I2C_Transmit(I2C_DATA_ACK); if (s == TW_MT_ARB_LOST || s != TW_MT_SLA_ACK || s == TW_MT_SLA_NACK){ printf("Error(Device Id/Address): %x\r\n",s); goto failure; } // Third step, set memory address TWDR = addr; s = I2C_Transmit(I2C_DATA_ACK); if (s != TW_MT_DATA_ACK){ printf("Error(EEPROM Address): %x\r\n",s); goto failure; } return 0; failure:return 1; }
uint8_t I2C_Page_Write(uint8_t dev_id, uint8_t dev_addr, uint8_t addr, uint8_t * data, uint8_t size) { uint8_t ret = 0; // First step, setup i2c and addresses if(I2C_Start(dev_id,dev_addr,addr)) goto exit; // Second step, write byte into memory for(uint8_t i = 0;i < size;i++){ TWDR = data[i]; uint8_t s = I2C_Transmit(I2C_DATA_ACK); if (s != TW_MT_DATA_ACK){ printf("Error(Data dispatch): %x\r\n",s); break; } ret ++; } exit: I2C_Transmit(I2C_STOP); return ret; }
uint8_t I2C_Byte_Write(uint8_t dev_id, uint8_t dev_addr, uint8_t addr, uint8_t data) { uint8_t ret = 0; // First step, setup i2c and addresses if(I2C_Start(dev_id,dev_addr,addr)) goto exit; // Second step, write byte into memory TWDR = data; uint8_t s = I2C_Transmit(I2C_DATA_ACK); if (s != TW_MT_DATA_ACK){ printf("Error(Data dispatch): %x\r\n",s); goto exit; } ret = 1; exit: I2C_Transmit(I2C_STOP); return ret; }
uint8_t I2C_Sequencial_Read(uint8_t dev_id, uint8_t dev_addr, uint8_t addr, uint8_t * data, uint8_t size) { uint8_t ret = 0; // First step, setup i2c and addresses (dummy write) if(I2C_Start(dev_id,dev_addr,addr)) goto exit; // Second step, start again uint8_t s = I2C_Transmit(I2C_START); if (s == TW_MT_ARB_LOST || (s != TW_START && s != TW_REP_START)){ printf("Error(Start again): %x\r\n",s); goto exit; } // Third step, set device id and device address TWDR = (dev_id & 0xF0) | ((dev_addr << 1) & 0x0E) | TW_READ; s = I2C_Transmit(I2C_DATA_ACK); if (s == TW_MR_ARB_LOST || s != TW_MR_SLA_ACK || s == TW_MR_SLA_NACK){ printf("Error(Device address 2): %x\r\n",s); goto exit; } for(uint8_t i = 0;i < size;i++){ if(i == size - 1){ // Fifth step, read and finish with NACK s = I2C_Transmit(I2C_DATA_NACK); if (s != TW_MR_DATA_NACK){ printf("Error(Data reception NACK): %x\r\n",s); break; } }else{ // Forth step, read data with ACK s = I2C_Transmit(I2C_DATA_ACK); if (s != TW_MR_DATA_ACK){ printf("Error(Data reception ACK): %x\r\n",s); break; } } data[i] = TWDR; ret += 1; } exit: I2C_Transmit(I2C_STOP); return ret; }
uint32_t SUSI_API SusiI2CWriteReadCombine( uint32_t Id, uint8_t Addr, uint8_t *pWBuffer, uint32_t WriteLen, uint8_t *pRBuffer, uint32_t ReadLen ) { uint32_t ret; if (Susi_CheckLibAvailable() != SUSI_STATUS_INITIALIZED) return SUSI_STATUS_NOT_INITIALIZED; if ((WriteLen > 0) && (pWBuffer == NULL)) return SUSI_STATUS_INVALID_PARAMETER; if ((ReadLen > 0) && (pRBuffer == NULL)) return SUSI_STATUS_INVALID_PARAMETER; if ((WriteLen == 0) && (ReadLen == 0)) return SUSI_STATUS_INVALID_PARAMETER; ret = I2C_Transmit(Id, Addr, (uint8_t *)pWBuffer, WriteLen, (uint8_t *)pRBuffer, ReadLen); return ret; }
uint8_t I2C_Random_Read(uint8_t dev_id, uint8_t dev_addr, uint8_t addr, uint8_t *data) { uint8_t ret = 0; // First step, setup i2c and addresses (dummy write) if(I2C_Start(dev_id,dev_addr,addr)) goto exit; // Second step, start again uint8_t s = I2C_Transmit(I2C_START); if (s == TW_MT_ARB_LOST || (s != TW_START && s != TW_REP_START)){ printf("Error(Start again): %x\r\n",s); goto exit; } // Third step, set device id and device address TWDR = (dev_id & 0xF0) | ((dev_addr << 1) & 0x0E) | TW_READ; s = I2C_Transmit(I2C_DATA_ACK); if (s == TW_MR_ARB_LOST || s != TW_MR_SLA_ACK || s == TW_MR_SLA_NACK){ printf("Error(Device address 2): %x\r\n",s); goto exit; } // Forth step, read data s = I2C_Transmit(I2C_DATA_NACK); if (s != TW_MR_DATA_NACK){ printf("Error(Data reception NACK): %x\r\n",s); goto exit; } *data = TWDR; ret = 1; exit: I2C_Transmit(I2C_STOP); return ret; }
{ CmdLen = 1; wBuf[0] = Cmd; } else if (SUSI_I2C_IS_STD_CMD(Cmd)) { CmdLen = 2; wBuf[0] = Cmd >> 8; wBuf[1] = Cmd; } else CmdLen = 0; ret = I2C_Transmit(Id, Addr, wBuf, CmdLen, pBuffer, ReadLen); return ret; } uint32_t SUSI_API SusiI2CWriteTransfer( uint32_t Id, uint32_t Addr, uint32_t Cmd, uint8_t *pBuffer, uint32_t BufLen ) { uint32_t ret;