Loading lib/mcp2221a.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 * Loading lib/mcp2221a_i2c.cpp +30 −2 Original line number Diff line number Diff line Loading @@ -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 tests/CMakeLists.txt +4 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
lib/mcp2221a.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 * Loading
lib/mcp2221a_i2c.cpp +30 −2 Original line number Diff line number Diff line Loading @@ -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
tests/CMakeLists.txt +4 −1 Original line number Diff line number Diff line Loading @@ -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