Example #1
0
int gpio_i2c_readX_KeyPad_Fix(
    int Grp,
    unsigned char Dev,
    void (*Func[2])(void))
{
    int rxdata;

    I2C_LOCK(Grp);

    if(Func[0]) {
        (*Func[0])();
    }

    i2c_start_bit(Grp);

    i2c_send_byte(Grp, (unsigned char)(Dev) | 1);
    i2c_receive_ack(Grp);

    rxdata = i2c_receive_byte(Grp);
    i2c_receive_ack(Grp);

    i2c_stop_bit(Grp);

    if(Func[1]) {
        (*Func[1])();
    }

    I2C_UNLOCK(Grp);

    return (unsigned char)rxdata;
}
Example #2
0
int i2c_read_block(const uint8_t devaddr, const uint8_t regaddr, uint8_t *data, const int length)
{
	if(!length)
		return 0;

	i2c_start();
	int res = i2c_send_byte(devaddr);
	if(res) {
		printf("NACK on address %02x (%d)\n", devaddr, res);
		i2c_stop();
		return -1;
	}
	res = i2c_send_byte(regaddr);
	if(res) {
		printf("NACK on register address %02x (%d)\n", regaddr, res);
		i2c_stop();
		return -1;
	}
	i2c_restart();
	res = i2c_send_byte(devaddr | 1);
	if(res) {
		printf("NACK on address %02x (%d)\n", devaddr | 1, res);
		i2c_stop();
		return -2;
	}
	for(int i=0;i<length;i++) {
		*(data++) = i2c_receive_byte((i == length-1)? 0 : 1);
	}
	i2c_stop();
	return 0;
}
Example #3
0
int gpio_i2c_readX(int Grp, unsigned char devaddress, unsigned char address)
{
    int rxdata;

    I2C_LOCK(Grp);

    i2c_start_bit(Grp);

    i2c_send_byte(Grp, (unsigned char)(devaddress));
    i2c_receive_ack(Grp);

    i2c_send_byte(Grp, address);
    i2c_receive_ack(Grp);
     
    i2c_start_bit(Grp);

    i2c_send_byte(Grp, (unsigned char)(devaddress) | 1);
    i2c_receive_ack(Grp);

    rxdata = i2c_receive_byte(Grp);

    i2c_stop_bit(Grp);
    
    I2C_UNLOCK(Grp);

    return (unsigned char)rxdata;
}
/** \brief This function receives a response from the device.
 *
 * \param[in] size size of rx buffer
 * \param[out] response pointer to rx buffer
 * \return status of the operation
 */
uint8_t ecc108p_receive_response(uint8_t size, uint8_t *response)
{
	uint8_t count;

	// Address the device and indicate that bytes are to be read.
	uint8_t i2c_status = ecc108p_send_slave_address(I2C_READ);
	if (i2c_status != I2C_FUNCTION_RETCODE_SUCCESS) {
		// Translate error so that the Communication layer
		// can distinguish between a real error or the
		// device being busy executing a command.
		if (i2c_status == I2C_FUNCTION_RETCODE_NACK)
			i2c_status = ECC108_RX_NO_RESPONSE;

		return i2c_status;
	}

	// Receive count byte.
	i2c_status = i2c_receive_byte(response);
	if (i2c_status != I2C_FUNCTION_RETCODE_SUCCESS)
		return ECC108_COMM_FAIL;

	count = response[ECC108_BUFFER_POS_COUNT];
	if ((count < ECC108_RSP_SIZE_MIN) || (count > size)) {
		(void) i2c_send_stop();
		return ECC108_INVALID_SIZE;
	}

	i2c_status = i2c_receive_bytes(count - 1, &response[ECC108_BUFFER_POS_DATA]);

	if (i2c_status != I2C_FUNCTION_RETCODE_SUCCESS)
		return ECC108_COMM_FAIL;
	else
		return ECC108_SUCCESS;
}
Example #5
0
int gpio_i2c_rd_arr(int Grp, unsigned char dev,
    unsigned char rarr[], int rsize,
    unsigned char darr[], int dsize)
{
    int i;

    I2C_LOCK(Grp);

    i2c_start_bit(Grp);

    i2c_send_byte(Grp, dev);
    i2c_receive_ack(Grp);

    for(i = 0; i < rsize; i ++) {
        i2c_send_byte(Grp, rarr[i]);
        i2c_receive_ack(Grp);
    }

    if(dsize > 0) {
        i2c_start_bit(Grp);

        i2c_send_byte(Grp, (unsigned char)(dev) | 1);
        i2c_receive_ack(Grp);

	    for(i = 0; i < dsize-1; i ++) {
	        darr[i] = i2c_receive_byte(Grp);
	        i2c_send_ack(Grp);
	    }

	    darr[i] = i2c_receive_byte(Grp);
    }

	i2c_stop_bit(Grp);

	I2C_UNLOCK(Grp);
    
    return 0;
}
Example #6
0
uint16_t i2c_read_word(const uint8_t devaddr, const uint16_t regaddr)
{
	i2c_start();
	int res;
	res = i2c_send_byte(devaddr);
	if(res) {
		printf("Error sending write address (%d)\n", res);
	}
	res = i2c_send_byte(regaddr >> 8);
	res += i2c_send_byte(regaddr & 0xFF);
	if(res) {
		printf("Error sending register address (%d)\n", res);
	}
	i2c_restart();
	res = i2c_send_byte(devaddr | 1);
	if(res) {
		printf("Error sending read address (%d)\n", res);
	}
	uint16_t result = ((uint16_t)i2c_receive_byte(1)) << 8;
	result |= i2c_receive_byte(0);
	i2c_stop();
	return result;
}
Example #7
0
unsigned char gpio_i2c_read(unsigned char devaddress, unsigned char address)
{
    int rxdata;
    
    i2c_start_bit();
    i2c_send_byte((unsigned char)(devaddress));
    i2c_receive_ack();
    i2c_send_byte(address);
    i2c_receive_ack();   
    i2c_start_bit();
    i2c_send_byte((unsigned char)(devaddress) | 1);
    i2c_receive_ack();
    rxdata = i2c_receive_byte();
    //i2c_send_ack();
    i2c_stop_bit();

    return rxdata;
}
Example #8
0
uint8_t i2c_read_byte(const uint8_t devaddr, const uint8_t regaddr)
{
	i2c_start();
	int res;
	res = i2c_send_byte(devaddr);
	if(res) {
		printf("Error sending write address (%d)\n", res);
	}
	res = i2c_send_byte(regaddr);
	if(res) {
		printf("Error sending register address (%d)\n", res);
	}
	i2c_restart();
	res = i2c_send_byte(devaddr | 1);
	if(res) {
		printf("Error sending read address (%d)\n", res);
	}
	uint8_t result = i2c_receive_byte(0);
	i2c_stop();
	return result;
}
Example #9
0
int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
{
    unsigned int loop, rxdata;
    int sadr, ack, bytes_read;
    rxdata = 0;
    switch ((int)obj->i2c) {
        case I2C_0:
            sadr = TSC_I2C_ADDR;
            break;
        case I2C_1:
            sadr = AAIC_I2C_ADDR;
            break;
        case I2C_2:
        case I2C_3:
            sadr = address;     //LM75_I2C_ADDR; or MMA7660_I2C_ADDR;
            break;
    }
    bytes_read = 0;
    // Start bit
    i2c_start(obj);

    switch ((int)obj->i2c) {
        case I2C_0:
            // Set serial and register address
            i2c_send_byte(obj, sadr);
            ack += i2c_receive_ack(obj);
            i2c_send_byte(obj, address);
            ack += i2c_receive_ack(obj);

            // Stop bit
            i2c_stop(obj);

            // Start bit
            i2c_start_tsc(obj);

            // Read from I2C address
            i2c_send_byte(obj, sadr | 1);
            ack += i2c_receive_ack(obj);

            rxdata = (i2c_receive_byte(obj) & 0xFF);
            data[((length - 1) - bytes_read)] = (char)rxdata;
            bytes_read++;
            // Read multiple bytes
            if ((length > 1) && (length < 5)) {
                for (loop = 1; loop <= (length - 1); loop++) {
                    // Send ACK
                    i2c_send_ack(obj);

                    // Next byte
                    //rxdata = ((rxdata << 8) & 0xFFFFFF00);
                    //rxdata |= (i2c_receive_byte(obj) & 0xFF);
                    rxdata = i2c_receive_byte(obj);
                    data[(length - 1) - bytes_read] = (char)rxdata;
                    bytes_read++;

                }
            }
            break;
        case I2C_1:
            // Set serial and register address
            i2c_send_byte(obj, sadr);
            ack += i2c_receive_ack(obj);
            i2c_send_byte(obj, address);
            ack += i2c_receive_ack(obj);

            // Stop bit
            i2c_stop(obj);

            // Start bit
            i2c_start_tsc(obj);
        // Fall through to read data
        case I2C_2:
        case I2C_3:
            // Read from preset register address pointer
            i2c_send_byte(obj, sadr | 1);
            ack += i2c_receive_ack(obj);

            rxdata = i2c_receive_byte(obj);
            data[bytes_read] = (char)rxdata;
            bytes_read++;
            // Read multiple bytes
            if ((length > 1) && (length < 5)) {
                for (loop = 1; loop <= (length - 1); loop++) {
                    // Send ACK
                    i2c_send_ack(obj);

                    // Next byte
                    rxdata = i2c_receive_byte(obj);
                    data[loop] = (char)rxdata;
                    bytes_read++;

                }
            }
            break;
    }
    i2c_send_nack(obj);

    i2c_stop(obj);    // Actual stop bit

    return bytes_read;
}