// // 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) { int err; if (sendStop == true) { // transmit buffer (blocking) if (txBufferLength > 1) err = i2c_writebytes(i2c_fd, txBuffer, txBufferLength); else if (txBufferLength == 1) err = i2c_writebyte(i2c_fd, *txBuffer); else /* FIXME: A zero byte transmit is typically used to check for an * ACK from the slave device. I'm not sure if this is the * correct way to do this. */ err = i2c_readbyte(i2c_fd); // empty buffer txBufferLength = 0; if (err < 0) return 2; return 0; } else { /* sendStop = false * pretend we have held the bus while * actually waiting for the next operation */ // i2c_add_to_buf(txAddress, 0, txBuffer, txBufferLength); // i2c_transfer = 1; return 0; } }
void i2c_readbuffer (uint8 BusNR, uint8* buf, uint8 size) { uint8 cnt; for (cnt = 0; cnt < size; cnt++) { buf[cnt] = i2c_readbyte(BusNR, buf[cnt]); } }
static int saa7185_read(struct saa7185 *dev) { int ack; LOCK_I2C_BUS(dev->bus); i2c_start(dev->bus); i2c_sendbyte(dev->bus, dev->addr | 1, I2C_DELAY); ack = i2c_readbyte(dev->bus, 1); i2c_stop(dev->bus); UNLOCK_I2C_BUS(dev->bus); return ack; }
int i2c_read(struct i2c_bus *bus, unsigned char addr) { int ret; if (bus->i2c_read) return bus->i2c_read(bus, addr); i2c_start(bus); i2c_sendbyte(bus,addr,0); ret = i2c_readbyte(bus,1); i2c_stop(bus); return ret; }
/*------------------------------------------- *PUBLIC functions */ int i2c_maven_read(unsigned char address) { int error=0; int data; i2c_start(); { error+=i2c_sendbyte(MAVEN_READ); error+=i2c_sendbyte(address); data = i2c_readbyte(0); } i2c_stop(); if (error>0) LOG(8,("I2C: MAVR ERROR - %x\n",error)); return data; }
//---------------------------------------------------------- // EEPROM読み込み // 引数(スレーブアドレス,アドレス,データ,バイト数) void i2c_2_read( unsigned char addr, unsigned char* data, unsigned char bytecnt) { i2c_start(); i2c_writebyte(0xD0); // SLA + W i2c_writebyte(addr); // address(high 8bits) i2c_start(); i2c_writebyte(0xD1); // SLA + R while(bytecnt > 0){ *data++ = i2c_readbyte(bytecnt == 1); bytecnt--; } i2c_stop(); }
static int saa7110_read(struct saa7110* decoder) { int data; LOCK_I2C_BUS(decoder->bus); i2c_start(decoder->bus); i2c_sendbyte(decoder->bus, decoder->addr, I2C_DELAY); i2c_start(decoder->bus); i2c_sendbyte(decoder->bus, decoder->addr | 1, I2C_DELAY); data = i2c_readbyte(decoder->bus, 1); i2c_stop(decoder->bus); UNLOCK_I2C_BUS(decoder->bus); return data; }
static int saa7111_read(struct saa7111 *dev, unsigned char subaddr) { int data; LOCK_I2C_BUS(dev->bus); i2c_start(dev->bus); i2c_sendbyte(dev->bus, dev->addr, I2C_DELAY); i2c_sendbyte(dev->bus, subaddr, I2C_DELAY); i2c_start(dev->bus); i2c_sendbyte(dev->bus, dev->addr | 1, I2C_DELAY); data = i2c_readbyte(dev->bus, 1); i2c_stop(dev->bus); UNLOCK_I2C_BUS(dev->bus); return data; }
static int cambria_gpio_read(struct cambria_gpio_softc *sc, uint32_t pin, unsigned int *val) { device_t dev = sc->sc_dev; int error; error = iicbus_request_bus(device_get_parent(dev), dev, IIC_DONTWAIT); if (error) return (error); i2c_sendstart(sc); i2c_sendbyte(sc, PLD_ADDR | LSB); *val = (i2c_readbyte(sc) & (1 << pin)) != 0; i2c_sendstop(sc); iicbus_release_bus(device_get_parent(dev), dev); return (0); }
static void as_rtc_read(struct rtc_time *tm) { char tmp[4]; int year; int i; unsigned int seconds; ipod_i2c_lock(); /* RTC_AS3514's slave address is 0x46*/ for (i=0;i<4;i++){ tmp[i] = i2c_readbyte(AS3514_I2C_ADDR, RTC_0 + i); } ipod_i2c_unlock(); seconds = tmp[0] + (tmp[1]<<8) + (tmp[2]<<16) + (tmp[3]<<24); /* Convert seconds since Jan-1-1980 */ /* Year */ year = 80; while(seconds>=LEAP_YEAR_SECONDS) { if(is_leapyear(year)){ seconds -= LEAP_YEAR_SECONDS; } else { seconds -= YEAR_SECONDS; } year++; } if(is_leapyear(year)) { days_in_month[1] = 29; } else { days_in_month[1] = 28; if(seconds>YEAR_SECONDS){ year++; seconds -= YEAR_SECONDS; } } tm->tm_year = year; /* Month */ for(i=0; i<12; i++) { if(seconds < days_in_month[i]*DAY_SECONDS){ tm->tm_mon = i; break; } seconds -= days_in_month[i]*DAY_SECONDS; } /* Month Day */ tm->tm_mday = seconds/DAY_SECONDS; seconds -= tm->tm_mday*DAY_SECONDS; /* Hour */ tm->tm_hour = seconds/HOUR_SECONDS; seconds -= tm->tm_hour*HOUR_SECONDS; /* Minute */ tm->tm_min = seconds/MINUTE_SECONDS; seconds -= tm->tm_min*MINUTE_SECONDS; /* Second */ tm->tm_sec = seconds; }
int pcf50605_read(int address) { return i2c_readbyte(0x8,address); }