Esempio n. 1
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);
}
Esempio n. 2
0
// read a number of bytes from the rtc over i2c
// returns true to indicate success
static bool ICACHE_FLASH_ATTR ds1307_recv(uint8 *data, uint8 len) {
	
	int loop;

	// signal i2c start
	i2c_master_start();

	// write address & direction
	i2c_master_writeByte((uint8)((DS1307_ADDR << 1) | 1));
	if (!i2c_master_checkAck()) {
		//uart0_send("i2c error3\r\n");
		i2c_master_stop();
		return false;
	}

	// read bytes
	for (loop = 0; loop < len; loop++) {
		data[loop] = i2c_master_readByte();
		// send ack (except after last byte, then we send nack)
		if (loop < (len - 1)) i2c_master_send_ack(); else i2c_master_send_nack();
	}

	// signal i2c stop
	i2c_master_stop();

	return true;

}
Esempio n. 3
0
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;
}
Esempio n. 4
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;
}
static bool ICACHE_FLASH_ATTR byteReadNoReg(uint8_t adr, uint8_t data[], uint8_t length){
	uint8_t i;

	i2c_master_start();

	i2c_master_writeByte((uint8_t)((adr << 1) | 1));
	if (!i2c_master_checkAck()) {
		i2c_master_stop();
		return false;
	}

	for(i = 0; i < length-1; i++){
		data[i] = i2c_master_readByte();
		i2c_master_send_ack();	
	}

	data[i] = i2c_master_readByte();
	
	i2c_master_send_nack();
	i2c_master_stop();

	return true;
}
Esempio n. 6
0
void LSM303_read_bytes(char device, char addr, char bytes[], char count)
{
	i2c_master_start();
	i2c_master_writeByte(device | WRITE); 
	i2c_master_readNAck();
	i2c_master_writeByte(addr);
	i2c_master_readNAck();
	
	i2c_master_start();
	i2c_master_writeByte(device | READ); 
	i2c_master_readNAck();
	
	int i;
	for (i = 0; i < count-1; ++i)
	{
		bytes[i] = i2c_master_readByte();
		i2c_master_writeAck();
	}
	bytes[count-1] = i2c_master_readByte();
	i2c_master_writeNack();
	
	i2c_master_stop();
}
Esempio n. 7
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;
}
Esempio n. 8
0
bool i2c_master_readBytes(uint8 address, uint8 *values, uint8 length)
{
	if(values[0] > 0){
		if(!i2c_master_writeBytes(address, values, 1)){
			return false;
		}
	}

	uint8 timeout = 100;
	do{
		i2c_master_start();
		i2c_master_writeByte(address+1);
		if(!i2c_master_checkAck()){
			i2c_master_stop();
			i2c_master_wait(1000);
			continue;
		}
		break;
	}while(--timeout>0);

	if(timeout == 0){
		return false;
	}

#ifdef CONFIG_I2C_MASTER_DEBUG
	console_printf("Read: ");
#endif
	uint8 readed = 0;
	while((readed < length) && (--timeout>0)){
		uint8 byte = i2c_master_readByte();
		values[readed++] = byte;
		i2c_master_setAck((readed == length));	// send the ACK or NAK as applicable
		i2c_master_setDC(1, 0); // release SDA
#ifdef CONFIG_I2C_MASTER_DEBUG
		console_printf("%d ", byte);
#endif
	}
#ifdef CONFIG_I2C_MASTER_DEBUG
	console_printf("\n");
#endif
	i2c_master_stop();
	return true;
}
Esempio n. 9
0
bool rv3029_read(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;
	}

	i2c_master_stop();
	i2c_master_start();

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

	uint8_t i;
	for (i = 0; i < bytes; ++i) {
		val[i] =  i2c_master_readByte();
		i2c_master_send_ack();
	}

	i2c_master_stop();

	return true;
}
Esempio n. 10
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;
}
Esempio n. 11
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;
}
Esempio n. 12
0
int platform_i2c_recv_byte( unsigned id, int ack ){
  uint8_t r = i2c_master_readByte();
  i2c_master_setAck( !ack );
  return r;
}
Esempio n. 13
0
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;
}