예제 #1
0
파일: mod_rgb.c 프로젝트: zazolabs/ESP8266
i2c_status ICACHE_FLASH_ATTR rgb_set(i2c_config *config) {
    rgb_config_data *config_data = (rgb_config_data *)config->data;
    i2c_master_start();

    /* Send address */
    i2c_master_writeByte(config->address << 1 | 0);
    if (i2c_master_getAck()) {
        i2c_master_stop();
        return I2C_ADDRESS_NACK;
    }

    /* Send command */
    i2c_master_writeByte(0x03);
    if (i2c_master_getAck())
        goto error;

    i2c_master_writeByte(config_data->red);
    if (i2c_master_getAck())
        goto error;

    i2c_master_writeByte(config_data->green);
    if (i2c_master_getAck())
        goto error;

    i2c_master_writeByte(config_data->blue);
    if (i2c_master_getAck())
        goto error;

    i2c_master_stop();
    return I2C_OK;

error:
    i2c_master_stop();
    return I2C_DATA_NACK;
}
예제 #2
0
bool ICACHE_FLASH_ATTR write(uint8_t addr, uint8_t *buf, uint8_t length)
{
	i2c_master_start();
	i2c_master_writeByte(PCA9685_ADDR | I2C_WRITE);
	if (i2c_master_getAck())
	{
//		os_printf("addr not ack when tx write cmd \n");
		i2c_master_stop();
		return false;
	}

	i2c_master_writeByte(addr);
	if (i2c_master_getAck())
	{
//		os_printf("data not ack when tx write byte1 \n");
		i2c_master_stop();
		return false;
	}

	uint8_t i;
	for(i=0; i<length; i++)
	{
		i2c_master_writeByte(buf[i]);
		if (i2c_master_getAck())
		{
//			os_printf("data not ack when tx write byte %d\n", i);
			i2c_master_stop();
			return false;
		}
	}
	i2c_master_stop();
	return true;
}
예제 #3
0
파일: mod_io2.c 프로젝트: habashynn/ESP8266
LOCAL i2c_status ICACHE_FLASH_ATTR io2_set_execute(uint8 address, uint8 command, uint8 data) {
	i2c_master_start();

	/* Send address */
	i2c_master_writeByte(address << 1 | 0);
	if (i2c_master_getAck()) {
		i2c_master_stop();
		return I2C_ADDRESS_NACK;
	}

	/* Send command */
	i2c_master_writeByte(command);
	if (i2c_master_getAck()) {
		goto error;
	}

	/* Send data */
	i2c_master_writeByte(data);
	if (i2c_master_getAck()) {
		goto error;
	}
	
	i2c_master_stop();
	return I2C_OK;
	
	error: i2c_master_stop();
	return I2C_DATA_NACK;
}
예제 #4
0
bool rv3029_write(uint8_t regaddr, uint8_t bytes, uint8_t *val) {
    i2c_master_start();

	// Write I²C Address for writing register
    i2c_master_writeByte(RV3029_ADDR_W);
    if (i2c_master_getAck()) {
		os_printf("RV3029: no ACK for write addr\r\n");
		i2c_master_stop();
		return false;
	}

	// Write register address
    i2c_master_writeByte(regaddr);
    if(i2c_master_getAck()) {
		os_printf("RV3029: no ACK for register\r\n");
		i2c_master_stop();
		return false;
	}

	uint8_t i;
	for (i = 0; i < bytes; ++i) {
		i2c_master_writeByte(val[i]);
	    if(i2c_master_getAck()) {
			os_printf("RV3029: no ACK for datawrite\r\n");
			i2c_master_stop();
			return false;
		}
	}

	i2c_master_stop();

	return true;
}
예제 #5
0
LOCAL void ICACHE_FLASH_ATTR
read_cb(void)
{
	uint8_t ack, low, high;
	wdt_feed();
	os_printf("Time=%ld\n", system_get_time());
	i2c_master_start();
	i2c_master_writeByte(BH1750_ADDR);
	ack = i2c_master_getAck();
	if (ack)
	{
		os_printf("I2C:No ack after sending address\n");
		i2c_master_stop();
		return;
	}
	i2c_master_stop();
    i2c_master_wait(40000); // why?

    i2c_master_start();
    i2c_master_writeByte(BH1750_ADDR + 1);
    ack = i2c_master_getAck();
	if (ack)
	{
		os_printf("I2C:No ack after write command\n");
		i2c_master_stop();
		return;
	}
	low = i2c_master_readByte();
	high = i2c_master_readByte();
	i2c_master_setAck(1);
    i2c_master_stop();
	os_printf("I2C:read(L/H)=(0x%02x/0x%02x)\n", low, high);
}
예제 #6
0
i2c_status ICACHE_FLASH_ATTR tc_read(i2c_config *config) {
	tc_config_data *config_data = (tc_config_data *)config->data;
	i2c_master_start();

	/* Send address */
	i2c_master_writeByte(config->address << 1 | 0);
	if (i2c_master_getAck()) {
		i2c_master_stop();
		return I2C_ADDRESS_NACK;
	}

	/* Send command */
	i2c_master_writeByte(0x21);
	if (i2c_master_getAck()) {
		i2c_master_stop();
		return I2C_DATA_NACK;	
	}

	i2c_master_stop();
	i2c_master_start();
	
	i2c_master_writeByte(config->address << 1 | 1);
	if (i2c_master_getAck()) {
		i2c_master_stop();
		return I2C_ADDRESS_NACK;
	}
	
	uint8 i;
	uint8 data[4];
	for (i=0; i < 4; i++) {
		data[i] = i2c_master_readByte();
		i2c_master_setAck(i == 3);
	}
	i2c_master_stop();
	
	if ((data[2] & 0x01) != 0) {
		return I2C_COMMUNICATION_FAILED;
	}
	
	sint16 d = data[3] * 256 + (data[2] & 0xFC);
	float tf = 0.0625 * d;
	int ti = tf;
	uint16 td = (tf - ti) * 100;
	
	config_data->temperature = d / 4;
	os_sprintf(config_data->temperature_str, "%d.%02d", ti, td);
	
	return I2C_OK;
}
예제 #7
0
/******************************************************************************
* FunctionName : i2c_master_checkAck
* Description  : get dev response
* Parameters   : NONE
* Returns	  : true : get ack ; false : get nack
*******************************************************************************/
bool i2c_master_checkAck(void)
{
	if(i2c_master_getAck()){
		return FALSE;
	}else{
		return TRUE;
	}
}
예제 #8
0
/******************************************************************************
* FunctionName : i2c_master_checkAck
* Description  : get dev response
* Parameters   : NONE
* Returns      : true : get ack ; false : get nack
*******************************************************************************/
bool ICACHE_FLASH_ATTR
i2c_master_checkAck(void)
{
    if(i2c_master_getAck()){
        return FALSE;
    }else{
        return TRUE;
    }
}
예제 #9
0
파일: mod_io2.c 프로젝트: habashynn/ESP8266
LOCAL i2c_status ICACHE_FLASH_ATTR io2_acp_execute(uint8 address, uint8 command, uint16 *data) {
	uint8 d[2];
	
	i2c_master_start();

	/* Send address */
	i2c_master_writeByte(address << 1 | 0);
	if (i2c_master_getAck()) {
		i2c_master_stop();
		return I2C_ADDRESS_NACK;
	}

	/* Send command */
	i2c_master_writeByte(command);
	if (i2c_master_getAck()) {
		goto error;
	}
	
	i2c_master_stop();
	i2c_master_start();

	/* Send address */
	i2c_master_writeByte(address << 1 | 1);
	if (i2c_master_getAck()) {
		i2c_master_stop();
		return I2C_ADDRESS_NACK;
	}
	
	/* Read data */
	d[0] = i2c_master_readByte();
	i2c_master_send_ack();
	d[1] = i2c_master_readByte();
	i2c_master_send_nack();
	
	i2c_master_stop();
	
	*data = 256 * d[1] + d[0];
	return I2C_OK;
	
	error: i2c_master_stop();
	return I2C_DATA_NACK;
}
예제 #10
0
파일: mod_rgb.c 프로젝트: zazolabs/ESP8266
LOCAL i2c_status ICACHE_FLASH_ATTR rgb_on(uint8 address) {
    i2c_master_start();

    /* Send address */
    i2c_master_writeByte(address << 1 | 0);
    if (i2c_master_getAck()) {
        i2c_master_stop();
        return I2C_ADDRESS_NACK;
    }

    /* Send command */
    i2c_master_writeByte(0x01);
    if (i2c_master_getAck()) {
        i2c_master_stop();
        return I2C_DATA_NACK;
    }

    i2c_master_stop();
    return I2C_OK;
}
예제 #11
0
int platform_i2c_send_address( unsigned id, uint16_t address, int direction ){
  // Convert enum codes to R/w bit value.
  // If TX == 0 and RX == 1, this test will be removed by the compiler
  if ( ! ( PLATFORM_I2C_DIRECTION_TRANSMITTER == 0 &&
           PLATFORM_I2C_DIRECTION_RECEIVER == 1 ) ) {
    direction = ( direction == PLATFORM_I2C_DIRECTION_TRANSMITTER ) ? 0 : 1;
  }

  i2c_master_writeByte( (uint8_t) ((address << 1) | direction ));
  // Low-level returns nack (0=acked); we return ack (1=acked).
  return ! i2c_master_getAck();
}
예제 #12
0
/******************************************************************************
 * FunctionName : user_mvh3004_burst_read
 * Description  : burst read mvh3004's internal data
 * Parameters   : uint8 addr - mvh3004's address
 *                uint8 *pData - data point to put read data
 *                uint16 len - read length
 * Returns      : bool - true or false
*******************************************************************************/
LOCAL bool ICACHE_FLASH_ATTR
user_mvh3004_burst_read(uint8 addr, uint8 *pData, uint16 len)
{
    uint8 ack;
    uint16 i;

    i2c_master_start();
    i2c_master_writeByte(addr);
    ack = i2c_master_getAck();

    if (ack) {
        os_printf("addr not ack when tx write cmd \n");
        i2c_master_stop();
        return false;
    }

    i2c_master_stop();
    i2c_master_wait(40000);

    i2c_master_start();
    i2c_master_writeByte(addr + 1);
    ack = i2c_master_getAck();

    if (ack) {
        os_printf("addr not ack when tx write cmd \n");
        i2c_master_stop();
        return false;
    }

    for (i = 0; i < len; i++) {
        pData[i] = i2c_master_readByte();

        i2c_master_setAck((i == (len - 1)) ? 1 : 0);
    }

    i2c_master_stop();

    return true;
}
예제 #13
0
bool ICACHE_FLASH_ATTR read(uint8_t addr, uint8_t *buf, uint8_t length)
{
	i2c_master_start();
	i2c_master_writeByte(PCA9685_ADDR | I2C_WRITE);
	if (i2c_master_getAck())
	{
//		os_printf("addr not ack when tx write cmd \n");
		i2c_master_stop();
		return false;
	}

	i2c_master_writeByte(addr);
	if (i2c_master_getAck())
	{
//		os_printf("data not ack when tx write byte1 \n");
		i2c_master_stop();
		return false;
	}

	i2c_master_start();
	i2c_master_writeByte(PCA9685_ADDR | I2C_READ);
	if (i2c_master_getAck())
	{
//		os_printf("addr not ack when tx read cmd \n");
		i2c_master_stop();
		return false;
	}

	uint8_t i = 0;
	for(i=0; i<length; i++)
	{
		buf[i] = i2c_master_readByte();
		i2c_master_setAck(0);//(i == (length - 1)) ? 1 : 0);
	}

	i2c_master_stop();
	return true;
}
예제 #14
0
bool ICACHE_FLASH_ATTR
mcp3221_read(uint8 addr, uint16 *pData)
{
  uint8 ack;

  i2c_master_start();
  i2c_master_writeByte(addr);

  // reading ack, should be 0
  ack = i2c_master_getAck();
  if (ack != 0) {
    DEBUG("addr not ack when tx write cmd, line %d\n", __LINE__);
    i2c_master_stop();
    return false;
  }

  // reading high byte, first 4 bit should be zero
  uint8 temp = i2c_master_readByte();
  if ((temp | 0x0f) != 0x0f) {
    DEBUG("wrong reading\n");
    return false;
  }
  *pData = temp*256;

  // return ack 0 for high byte
  i2c_master_setAck(0);

  // reading low byte
  temp = i2c_master_readByte();
  *pData += temp;

  // return ack 1 for lower byte
  i2c_master_setAck(1);

  // stop, we dont need continuous reading
  i2c_master_stop();

  return true;
}
예제 #15
0
int platform_i2c_send_byte( unsigned id, uint8_t data ){
  i2c_master_writeByte(data);
  // Low-level returns nack (0=acked); we return ack (1=acked).
  return ! i2c_master_getAck();
}
예제 #16
0
파일: robko.c 프로젝트: modSwap/ESP8266
LOCAL i2c_status ICACHE_FLASH_ATTR robko_read(uint8 address, uint8 reg, uint8 *data, uint8 len) {
	uint8 retry = 0;
	i2c_status status;
	do {
#if ROBKO_DEBUG
#if ROBKO_VERBOSE_OUTPUT
		debug("ROBKO: 0x%02X 0x%02X reading %d bytes...\n", address, reg, len);
#endif
#endif
		status = I2C_OK;
		i2c_master_start();
		
		/* Send address for write */
		i2c_master_writeByte(address << 1 | 0);
		if (i2c_master_getAck()) {
#if ROBKO_DEBUG
#if ROBKO_VERBOSE_OUTPUT
			debug("ROBKO: Address ACK failed [0x%02X] [set READ command] \n", address);
#endif
#endif
			status = I2C_ADDRESS_NACK;
			goto done;
		}
		
		/* Send register */
		i2c_master_writeByte(reg);
		if (i2c_master_getAck()) {
#if ROBKO_DEBUG
#if ROBKO_VERBOSE_OUTPUT
			debug("ROBKO: Register ACK failed [0x%02X] [set READ command] \n", reg);
#endif
#endif
			status = I2C_DATA_NACK;
			goto done;
		}
		
		i2c_master_stop();
		i2c_master_start();

		/* Send address for read */
		i2c_master_writeByte(address << 1 | 1);
		if (i2c_master_getAck()) {
#if ROBKO_DEBUG
#if ROBKO_VERBOSE_OUTPUT
			debug("ROBKO: Address ACK failed [0x%02X] [execute READ command] \n", address);
#endif
#endif
			status = I2C_ADDRESS_NACK;
			goto done;
		}
		
#if ROBKO_DEBUG
#if ROBKO_VERBOSE_OUTPUT
			debug("READ: ");
#endif
#endif
		/* Read data */
		uint8 i = 0;
		while (true) {
			data[i] = i2c_master_readByte();
#if ROBKO_DEBUG
#if ROBKO_VERBOSE_OUTPUT
			debug("0x%02X ", data[i]);
#endif
#endif
			i++;
			if (i < len) {
				i2c_master_send_ack();
			} else {
				i2c_master_send_nack();
				break;
			}
		}
		
done: 
		i2c_master_stop();
		retry++;
	} while (
		retry < ROBKO_I2C_RETRY && 
		status != I2C_OK
	);
	
	
#if ROBKO_DEBUG
#if ROBKO_VERBOSE_OUTPUT
	debug("\nROBKO: Done.\n\n");
#endif
#endif
	return status;
}
예제 #17
0
파일: robko.c 프로젝트: modSwap/ESP8266
LOCAL i2c_status ICACHE_FLASH_ATTR robko_set(uint8 address, uint8 reg, uint8 *data, uint8 len) {
	uint8 retry = 0;
	i2c_status status;
	do {
#if ROBKO_DEBUG
#if ROBKO_VERBOSE_OUTPUT
		debug("ROBKO: 0x%02X 0x%02X set %d bytes...\n", address, reg, len);
#endif
#endif
		
		status = I2C_OK;
		i2c_master_start();
		
		/* Send address for write */
		i2c_master_writeByte(address << 1 | 0);
		if (i2c_master_getAck()) {
#if ROBKO_DEBUG
#if ROBKO_VERBOSE_OUTPUT
			debug("ROBKO: Address ACK failed [0x%02X] [set SET command] \n", address);
#endif
#endif
			status = I2C_ADDRESS_NACK;
			goto done;
		}

		/* Send register */
		i2c_master_writeByte(reg);
		if (i2c_master_getAck()) {
#if ROBKO_DEBUG
#if ROBKO_VERBOSE_OUTPUT
			debug("ROBKO: Register ACK failed [0x%02X] [set SET command] \n", reg);
#endif
#endif
			status = I2C_DATA_NACK;
			goto done;
		}
		
		/* Write data */
		uint8 i = 0;
		while (i < len) {
			i2c_master_writeByte(data[i]);
			if (i2c_master_getAck()) {
#if ROBKO_DEBUG
#if ROBKO_VERBOSE_OUTPUT
				debug("ROBKO: Data ACK failed [execute SET command] \n");
#endif
#endif
				status = I2C_DATA_NACK;
				break;
			}
#if ROBKO_DEBUG
#if ROBKO_VERBOSE_OUTPUT
			debug("0x%02X ", data[i]);
#endif
#endif
			i++;
		}
		
done:
		i2c_master_stop();
		retry++;
	} while (
		retry < ROBKO_I2C_RETRY &&
		status != I2C_OK
	);
#if ROBKO_DEBUG
#if ROBKO_VERBOSE_OUTPUT
	debug("\nROBKO: Done.\n\n");
#endif
#endif
	return status;
}