static void Llc_VolumeSet(uint8_t volume) { uint8_t buffer[2]; if(volume > (uint8_t)100) { volume = 100; /* Limit volume to 100% */ } /* Scale down the volume value to 0 - 31 range */ volume = (volume * 31) / 100; buffer[0] = mVREG_CMD_c; buffer[1] = (volume & 0xFF) << 3; I2c_SendData(mSLAVE_DEV_ADDRESS_c, &buffer[0], 2, gI2cMstrReleaseBus_c); }
//////////////////////////////////////////////////////////////////////////////////////////////////// // Name I2C_WriteMem // Author Nivis LLC, Dorin Muica // Brief write data to EEPROM memory // Param p_pcAddrAndData - is formated as Addr HI byte, Addr LO byte, Data bytes // p_nAddrAndDataLen - length of p_pcAddrAndData 2bytes+Effective Data bytes // Return 0 if fail, !=0 if success // Remarks p_pcAddrAndData is formated as Addr HI, Addr LO, Data //////////////////////////////////////////////////////////////////////////////////////////////////// uint8 I2C_WriteMem(uint8 *p_pcAddrAndData, uint16 p_nAddrAndDataLen ) // NOT TESTED { if(p_nAddrAndDataLen > 2) { uint16 ulAddress; uint16 unCnt; ulAddress = ((uint16)(p_pcAddrAndData[0]) << 8) | p_pcAddrAndData[1]; p_nAddrAndDataLen -= 2; EEPROM_WRITE_ENABLE(); do { uint8 acMem[2]; uint16 unWriteSize = EEPROM_PAGE_SIZE - (ulAddress & (EEPROM_PAGE_SIZE-1)); if( unWriteSize > p_nAddrAndDataLen ) { unWriteSize = p_nAddrAndDataLen; } acMem[0] = p_pcAddrAndData[0]; // save previous data acMem[1] = p_pcAddrAndData[1]; p_pcAddrAndData[0] = (uint8)(ulAddress >> 8); p_pcAddrAndData[1] = (uint8)(ulAddress); unCnt = FAILURE_RETRIES ; do { if( I2c_SendData(CONTROL_BYTE_WRITE, p_pcAddrAndData, unWriteSize+2, gI2cMstrReleaseBus_c ) == gI2cErrNoError_c ) { p_nAddrAndDataLen -= unWriteSize; break; } }while(--unCnt); p_pcAddrAndData[0] = acMem[0]; //restore previous data p_pcAddrAndData[1] = acMem[1]; p_pcAddrAndData += unWriteSize; ulAddress += unWriteSize; }while( p_nAddrAndDataLen && unCnt ); while (I2CSR_MBB) // wait until bus is idle ; EEPROM_WRITE_DISABLE(); }