예제 #1
0
//
//	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;
	}
}
예제 #2
0
파일: nv_i2c.c 프로젝트: AmirAbrams/haiku
void i2c_readbuffer (uint8 BusNR, uint8* buf, uint8 size)
{
	uint8 cnt;

	for (cnt = 0; cnt < size; cnt++)
	{
		buf[cnt] = i2c_readbyte(BusNR, buf[cnt]);
	}
}
예제 #3
0
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;
}
예제 #4
0
파일: i2c-old.c 프로젝트: dmgerman/original
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;
}
예제 #5
0
파일: mga_i2c.c 프로젝트: AmirAbrams/haiku
/*-------------------------------------------
 *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;
}
예제 #6
0
//----------------------------------------------------------
// 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();
}
예제 #7
0
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;
}
예제 #8
0
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;
}
예제 #9
0
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);
}
예제 #10
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;
}
예제 #11
0
int pcf50605_read(int address)
{
    return i2c_readbyte(0x8,address);
}