Commit 5b5fd230 authored by Gallacchi Mattia's avatar Gallacchi Mattia
Browse files

Add read register

parent 54afefd5
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -104,6 +104,8 @@ namespace MCP2221A {
         */
        void receive(uint8_t slave_addr, uint8_t *data, size_t length);

        void read_register(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data, size_t length);

        /**
         * @brief Get the slaves addresses found on the I2C bus
         * 
+30 −2
Original line number Diff line number Diff line
@@ -159,10 +159,38 @@ namespace MCP2221A {

        set_slave_address(slave_addr);

        while (byte_read < length) {
            if ((ret = read(fd_, data, length)) < 0 ) {
            cout << "Failed to read :" << strerror(errno) << endl;
                throw I2CMasterException(string("Failed to get data: ") + strerror(errno));
            }
            //EOF
            if (ret == 0)
                break;

            byte_read += ret;
        }
    }

    void I2CMaster::read_register(uint8_t slave_addr, uint8_t reg_addr, uint8_t *data, size_t length)
    {
        set_slave_address(slave_addr);

        if (length < I2C_SMBUS_WORD_DATA) {
            uint16_t res = i2c_smbus_read_word_data(fd_, reg_addr);
            uint8_t h = (uint8_t) (res >> 8);
            uint8_t l = (uint8_t)res;
            data[0] = (uint8_t)(res >> 8);
            data[1] = (uint8_t)(res & 0xFF);
            return;
        }

        if (i2c_smbus_write_byte(fd_, reg_addr) < 0) {
            cout << "Failed to write register address: " << strerror(errno) << endl;
            return;
        }

        receive(slave_addr, data, length);
    }


} //namespace
 No newline at end of file
+4 −1
Original line number Diff line number Diff line
@@ -4,3 +4,6 @@ project(test LANGUAGES C CXX)

add_executable(${PROJECT_NAME} test.cpp)
target_link_libraries(${PROJECT_NAME} mcp2221a)

add_executable(main main.cpp)
target_link_libraries(main mcp2221a)
 No newline at end of file

tests/main.cpp

0 → 100644
+24 −0
Original line number Diff line number Diff line
#include <iostream>
#include "mcp2221a.h"

using namespace std;

int main()
{
    MCP2221A::I2CMaster i2c;
    // vector<int> slaves = i2c.get_slaves_addresses();

    // for (auto& slave: slaves)
    //     cout << hex << "0x" << slave << dec << endl;

    unsigned char data [] = {0x01, 0x02, 0x03};
    uint8_t rx_data [2];
    i2c.read_register(0x17, 0x00, rx_data, 2);
    i2c.receive(0x17, rx_data, 2);

    for (int i = 0; i < 2; i++) {
        cout << hex << "0x" << rx_data[i] << dec << endl;
    }

    return 0;
}
 No newline at end of file