/** Reset the FIFO. * This bit resets the FIFO buffer when set to 1 while FIFO_EN equals 0. This * bit automatically clears to 0 after the reset has been triggered. * @see MPU6050_RA_USER_CTRL * @see MPU6050_USERCTRL_FIFO_RESET_BIT */ uint8_t MPU6050::resetFIFO() { buffer[0] = MPU6050_RA_USER_CTRL; if (twi_writeTo(devAddr, buffer, 1, true)) return 0xFF; if (twi_readFrom(devAddr, buffer+1, 1) != 1) return 0xFF; buffer[1] |= (1 << MPU6050_USERCTRL_FIFO_RESET_BIT); if (twi_writeTo(devAddr, buffer, 2, true)) return 0xFF; return 0; }
/* * Function ScI2cMxScrollingHorizontal * Desc ZT.SC-I2CMx Scrolling Horizontal * Input addr:ZT.SC-I2CMx Address lr: Scroll direction spage: start page epage: end page frames: Scroll fram * Output 0 .. success * 1 .. length to long for buffer * 2 .. address send, NACK received * 3 .. data send, NACK received * 4 .. other twi error (lost bus arbitration, bus error, ..) */ int ZtLib::ScI2cMxScrollingHorizontal(uint8_t addr, uint8_t lr, uint8_t spage, uint8_t epage,uint8_t frames) { uint8_t buff[9] = {REG_CMD, 0x2E, 0x00, spage, frames, epage, 0x00, 0xFF, 0x2F}; twi_writeTo(addr, buff, 2, 1, 1); buff[0] = REG_CMD; buff[1] = lr; for (int i=0; i<10; i++); return twi_writeTo(addr, buff, 9, 1, 1); }
// // Originally, 'endTransmission' was an f(void) function. // It has been modified to take one parameter indicating // whether or not a STOP should be performed on the bus. // Calling endTransmission(false) allows a sketch to // perform a repeated start. // // WARNING: Nothing in the library keeps track of whether // the bus tenure has been properly ended with a STOP. It // is very possible to leave the bus in a hung state if // no call to endTransmission(true) is made. Some I2C // devices will behave oddly if they do not see a STOP. // uint8_t TwoWireMaster::endTransmission(uint8_t sendStop) { #if ORG_FILE // transmit buffer (blocking) int8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, 1, sendStop); #else // ORG_FILE bool s = twiMstrTransfer((txAddress << 1) | I2C_WRITE, txBuffer, txBufferLength, sendStop ? I2C_STOP : I2C_REP_START); int8_t ret = 0; if (!s) { if (twiMstrFailureState() == TWI_MTX_ADR_NACK) { ret = 2; }else if (twiMstrFailureState() == TWI_MTX_DATA_NACK) { ret = 3; } else { ret = 4; } } #endif // ORG_FILE // reset tx buffer iterator vars txBufferIndex = 0; txBufferLength = 0; // indicate that we are done transmitting transmitting = 0; return ret; }
// Helper function to write to the accelerometer and interpret the error code, if any void GadgetShield::twiWrite(const void *buf, uint8_t length) { uint8_t code; code = twi_writeTo(ACC_SLAVE_ADDR, (uint8_t *)buf, length, 1); errorWrite(code); }
/* * Function Seg8b4a036aDisplayDec * Desc ZT.SEG8B4A036A Display decimal numeral * Input addr:ZT.SEG8B4A036A Address val: Display Val bitnum:Display Bit Number dotbit: Dot Display * Output 0 .. success * 1 .. length to long for buffer * 2 .. address send, NACK received * 3 .. data send, NACK received * 4 .. other twi error (lost bus arbitration, bus error, ..) */ int ZtLib::Seg8b4a036aDisplayDec(uint8_t addr,unsigned short val, uint8_t bitnum, uint8_t dotbit) { uint8_t i; uint8_t segnum[5]; if (val>9999) return 0xFF; segnum[0] = REG_DAT; segnum[1] = val%10; segnum[2] = (val%100)/10; segnum[3] = (val/100)%10; segnum[4] = val/1000; for (i=1; i<5; i++) { segnum[i] = codetable[segnum[i]]; if (dotbit&0x01) { segnum[i] |= 0x80; } dotbit >>= 1; } if (bitnum==DISP_0BIT) {segnum[4] = 0;segnum[3] = 0;segnum[2] = 0;segnum[1] = 0;} else if (bitnum==DISP_1BIT) {segnum[4] = 0;segnum[3] = 0;segnum[2] = 0;} else if (bitnum==DISP_2BIT) {segnum[4] = 0;segnum[3] = 0;} else if (bitnum==DISP_3BIT) {segnum[4] = 0;} else if (bitnum==DISP_AUTO) { if (val<10) {segnum[4] = 0;segnum[3] = 0;segnum[2] = 0;} else if (val<100) {segnum[4] = 0;segnum[3] = 0;} else if (val<1000) {segnum[4] = 0;} } return twi_writeTo(addr, segnum, 5, 1, 1); }
uint8_t TwoWire::endTransmission(uint8_t sendStop){ int8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, sendStop); txBufferIndex = 0; txBufferLength = 0; transmitting = 0; return ret; }
/* * Function Seg8b4a036aDisplayHex * Desc Read ZT.SEG8B4A036A Display hexadecimal number * Input addr:ZT.SEG8B4A036A Address val: Display Val bitnum:Display Bit Number dotbit: Dot Display * Output 0 .. success * 1 .. length to long for buffer * 2 .. address send, NACK received * 3 .. data send, NACK received * 4 .. other twi error (lost bus arbitration, bus error, ..) */ int ZtLib::Seg8b4a036aDisplayHex(uint8_t addr,unsigned short val, uint8_t bitnum, uint8_t dotbit) { uint8_t i; unsigned short temp; uint8_t segnum[5]; segnum[0] = REG_DAT; temp = val; for (i=1; i<5; i++) { segnum[i] = temp&0x000F; temp >>= 4; segnum[i] = codetable[segnum[i]]; if (dotbit&0x01) { segnum[i] |= 0x80; } dotbit >>= 1; } if (bitnum==DISP_0BIT) {segnum[4] = 0;segnum[3] = 0;segnum[2] = 0;segnum[1] = 0;} else if (bitnum==DISP_1BIT) {segnum[4] = 0;segnum[3] = 0;segnum[2] = 0;} else if (bitnum==DISP_2BIT) {segnum[4] = 0;segnum[3] = 0;} else if (bitnum==DISP_3BIT) {segnum[4] = 0;} else if (bitnum==DISP_AUTO) { if (!(val&0xFFF0)) {segnum[4] = 0;segnum[3] = 0;segnum[2] = 0;} else if (!(val&0xFF00)) {segnum[4] = 0;segnum[3] = 0;} else if (!(val&0xF000)) {segnum[4] = 0;} } return twi_writeTo(addr, segnum, 5, 1, 1); }
int i2c_wr_blk(uint8_t cli_addr, uint8_t *dat, uint8_t len) { if (len > TWI_BUFFER_LENGTH) return -1; return twi_writeTo(cli_addr, dat, len, USE_BUSY_WAIT, SEND_STOP_BIT); }
/* * Function ScI2cMxDisplayDot16x16 * Desc Set ZT.SC-I2CMx Display 16*16 Dot * Input addr:ZT.SC-I2CMx Address page:page column:column *str:16*16 Dot Data * Output 0 .. success * 1 .. length to long for buffer * 2 .. address send, NACK received * 3 .. data send, NACK received * 4 .. other twi error (lost bus arbitration, bus error, ..) */ void ZtLib::ScI2cMxDisplayDot16x16(uint8_t addr, uint8_t page, uint8_t column, unsigned char *str) { uint8_t buff[17]; buff[0] = REG_DAT; ScI2cMxSetLocation(addr, page, column); for (int i=0; i<16; i++) { buff[i+1] = str[i]; } twi_writeTo(addr, buff, 17, 1, 1); ScI2cMxSetLocation(addr, page+1, column); for (int i=0; i<16; i++) { buff[i+1] = str[i+16]; } twi_writeTo(addr, buff, 17, 1, 1); }
uint8_t RTC_DS1307::isrunning(void) { twi_buf[0] = 0; twi_writeTo(DS1307_ADDRESS, 1); // perform blocking read into buffer (void)twi_readFrom(DS1307_ADDRESS, 1); uint8_t ss = twi_buf[0]; return !(ss>>7); }
uint8_t ICACHE_FLASH_ATTR wire_endTransmission() { int8_t ret; ret = twi_writeTo(wire_txAddress, wire_txBuffer, wire_txBufferLength, true); wire_txBufferIndex = 0; wire_txBufferLength = 0; wire_transmitting = 0; return ret; }
int i2c_wr_addr_byte(uint8_t cli_addr, uint8_t reg_addr, uint8_t dat) { uint8_t buf[2]; buf[0] = reg_addr; buf[1] = dat; return twi_writeTo(cli_addr, buf, sizeof(buf), USE_BUSY_WAIT, SEND_STOP_BIT); }
void pot_write(char channel, char address, unsigned char msg) { unsigned char buf[2]; unsigned short pot = channel; if (address == OSCOPE_POT_VALUE && pot < POT_N_CHANNELS) { buf[0] = addrs[pot].pot_number? POT_CMD_WR1 : POT_CMD_WR0; buf[1] = msg; twi_writeTo(addrs[pot].i2c_addr, buf, sizeof(buf), 0); } }
uint8_t twi_endTransmission() { // transmit buffer (blocking) int8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, 1, true); // reset tx buffer iterator vars txBufferIndex = 0; txBufferLength = 0; // indicate that we are done transmitting transmitting = 0; return ret; }
int i2c_wr_addr16_byte(uint8_t cli_addr, uint16_t reg_addr, uint8_t dat) { uint8_t buf[3]; buf[0] = (uint8_t)((0xFF00 & reg_addr) >> 8); /* reg addr MSB */ buf[1] = (uint8_t)(0x00FF & reg_addr); /* reg addr LSB */ buf[2] = dat; return twi_writeTo(cli_addr, buf, sizeof(buf), USE_BUSY_WAIT, SEND_STOP_BIT); }
void TwoWire::endTransmission(void) { // transmit buffer (blocking) twi_writeTo(txAddress, txBuffer, txBufferLength, 1); // reset tx buffer iterator vars txBufferIndex = 0; txBufferLength = 0; // indicate that we are done transmitting transmitting = 0; }
/* * Function ScI2cMxDisplayArea * Desc Set ZT.SC-I2CMx Display Area * Input addr:ZT.SC-I2CMx Address spage: start page epage: end page scolumn: start column ecolumn: end column *pt: Data * Output 0 .. success * 1 .. length to long for buffer * 2 .. address send, NACK received * 3 .. data send, NACK received * 4 .. other twi error (lost bus arbitration, bus error, ..) */ void ZtLib::ScI2cMxDisplayArea(uint8_t addr, uint8_t spage, uint8_t epage, uint8_t scolumn, uint8_t ecolumn, const char *pt) { uint8_t i = 0; uint8_t j = 0; uint8_t h = 0; uint8_t w = 0; uint16_t cnt = 0; uint8_t buff[32]; buff[0] = REG_DAT; h = epage - spage; w = ecolumn - scolumn; while ( j<h ) { ScI2cMxSetLocation(addr, spage + j, scolumn); uint8_t p=w; while(p) { if(p>=31) { for (int n=0; n<31; n++) { buff[1+n] = pt[cnt++]; } twi_writeTo(addr, buff, 32, 1, 1); p -= 31; } else { int n; for (n=0; n<p; n++) { buff[1+n] = pt[cnt++]; } twi_writeTo(addr, buff, n+1, 1, 1); p -= n; } } j++; } }
/* * Function Seg8b4a036aReadVersion * Desc Read ZT.SEG8B4A036A Fireware Version * Input addr:ZT.SEG8B4A036A Address *buf:Version Buffer * Output .. number bytes of Version Read out */ int ZtLib::Seg8b4a036aReadVersion(uint8_t addr, uint8_t *buf) { uint8_t state = 0xFF; uint8_t temp; uint8_t regv[1] = {REG_VERSION}; temp = twi_writeTo(addr, regv, 1, 1, 0); // no stop if (temp ==0) { temp = twi_readFrom(addr, &(*buf), 19, 1); } return temp; }
void RTC_DS1307::adjust(const DateTime& dt) { twi_buf[0] = 0; twi_buf[1] = bin2bcd(dt.second()); twi_buf[2] = bin2bcd(dt.minute()); twi_buf[3] = bin2bcd(dt.hour()); twi_buf[4] = bin2bcd(0); twi_buf[5] = bin2bcd(dt.day()); twi_buf[6] = bin2bcd(dt.month()); twi_buf[7] = bin2bcd(dt.year() - 2000); twi_buf[8] = 0; twi_writeTo(DS1307_ADDRESS, 9); }
// // Originally, 'endTransmission' was an f(void) function. // It has been modified to take one parameter indicating // whether or not a STOP should be performed on the bus. // Calling endTransmission(false) allows a sketch to // perform a repeated start. // // WARNING: Nothing in the library keeps track of whether // the bus tenure has been properly ended with a STOP. It // is very possible to leave the bus in a hung state if // no call to endTransmission(true) is made. Some I2C // devices will behave oddly if they do not see a STOP. // uint8_t TwoWire::endTransmission(uint8_t sendStop) { if(txBufferLength == 0) return 0; // transmit buffer (blocking) int8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, 1, sendStop); // reset tx buffer iterator vars txBufferIndex = 0; txBufferLength = 0; // indicate that we are done transmitting transmitting = 0; return ret; }
uint8_t i2c_end_transmission(uint8_t sendStop) { // transmit buffer (blocking) uint8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, 1, sendStop); // reset buffer vars txBufferIndex = 0; txBufferLength = 0; // set transmission flag transmitting = 0; return ret; }
int i2c_wr_addr_blk(uint8_t cli_addr, uint8_t reg_addr, uint8_t *dat, uint8_t len) { uint8_t buf[TWI_BUFFER_LENGTH]; if ((len + 1) > TWI_BUFFER_LENGTH) return -1; buf[0] = reg_addr; memcpy(&buf[1], dat, len); return twi_writeTo(cli_addr, buf, (len + 1), USE_BUSY_WAIT, SEND_STOP_BIT); }
int i2c_rd_addr_byte(uint8_t cli_addr, uint8_t reg_addr, uint8_t *dat) { uint8_t ret; ret = twi_writeTo(cli_addr, ®_addr, 1, USE_BUSY_WAIT, SEND_STOP_BIT); if (ret != 0) return ret; ret = twi_readFrom(cli_addr, dat, 1, SEND_STOP_BIT); if (ret == 0) return -1; return 0; }
int i2c_wr_addr16_blk(uint8_t cli_addr, uint16_t reg_addr, uint8_t *dat, uint8_t len) { uint8_t buf[TWI_BUFFER_LENGTH]; if ((len + 2) > TWI_BUFFER_LENGTH) return -1; buf[0] = (uint8_t)((0xFF00 & reg_addr) >> 8); /* reg addr MSB */ buf[1] = (uint8_t)(0x00FF & reg_addr); /* reg addr LSB */ memcpy(&buf[2], dat, len); return twi_writeTo(cli_addr, buf, (len + 2), USE_BUSY_WAIT, SEND_STOP_BIT); }
/* * Function ScI2cMxDisplay8x16Str * Desc ZT.SC-I2CMx Display 8x16 English String * Input addr:ZT.SC-I2CMx Address page: location page column: location column *str: 8X16 English String * Output 0 .. success * 1 .. length to long for buffer * 2 .. address send, NACK received * 3 .. data send, NACK received * 4 .. other twi error (lost bus arbitration, bus error, ..) */ int ZtLib::ScI2cMxDisplay8x16Str(uint8_t addr, uint8_t page, uint8_t column, const char *str) { uint8_t i=0; uint8_t buff[19]; buff[0] = REG_8X16STR; buff[1] = page; buff[2] = column; i=0; while ((*str != '\0') && (i<16)) { buff[i+3] = (uint8_t)*str++; i++; } return twi_writeTo(addr, buff, i+3, 1, 1); }
DateTime RTC_DS1307::now() { twi_buf[0] = 0; twi_writeTo(DS1307_ADDRESS, 1); (void)twi_readFrom(DS1307_ADDRESS, 7); uint8_t ss = bcd2bin(twi_buf[0] & 0x7F); uint8_t mm = bcd2bin(twi_buf[1]); uint8_t hh = bcd2bin(twi_buf[2]); uint8_t d = bcd2bin(twi_buf[4]); // #3 IS SKIPPED uint8_t m = bcd2bin(twi_buf[5]); uint16_t y = bcd2bin(twi_buf[6]) + 2000; return DateTime(y, m, d, hh, mm, ss); }
int i2c_rd_addr_blk(uint8_t cli_addr, uint8_t reg_addr, uint8_t *dat, uint8_t len) { uint8_t ret; if (len > TWI_BUFFER_LENGTH) return -1; ret = twi_writeTo(cli_addr, ®_addr, 1, USE_BUSY_WAIT, SEND_STOP_BIT); if (ret != 0) return ret; ret = twi_readFrom(cli_addr, dat, len, SEND_STOP_BIT); if (ret == 0) return -1; return 0; }
int i2c_rd_addr16_byte(uint8_t cli_addr, uint16_t reg_addr, uint8_t *dat) { uint8_t buf[2]; uint8_t ret; buf[0] = (uint8_t)((0xFF00 & reg_addr) >> 8); /* reg addr MSB */ buf[1] = (uint8_t)(0x00FF & reg_addr); /* reg addr LSB */ ret = twi_writeTo(cli_addr, buf, sizeof(buf), USE_BUSY_WAIT, SEND_STOP_BIT); if (ret != 0) return ret; ret = twi_readFrom(cli_addr, dat, 1, SEND_STOP_BIT); if (ret == 0) return -1; return 0; }
/* * Function Seg8b4a036aReadState * Desc Read ZT.SEG8B4A036A Status * Input addr:ZT.SEG8B4A036A Address * Output !=0xFF ZT.SC-I2CMx Status * 0xFF .. other twi error (lost bus arbitration, bus error, ..) */ int ZtLib::Seg8b4a036aReadState(uint8_t addr) { uint8_t state = 0xFF; uint8_t temp; uint8_t buff[1] = {REG_STATUS}; temp = twi_writeTo(addr, buff, 1, 1, 0); // no stop if (temp ==0) { temp = twi_readFrom(addr, buff, 1, 1); } if (temp==1) { state = buff[0]; } return state; }
uint8_t TwoWire::endTransmission(void) { // Secure I2C power management Wire.secureBegin(); // transmit buffer (blocking) uint8_t ret = twi_writeTo(txAddress, txBuffer, txBufferLength, 1); // reset tx buffer iterator vars txBufferIndex = 0; txBufferLength = 0; // indicate that we are done transmitting transmitting = 0; // Secure I2C power management Wire.secureEnd(); return ret; }