2023-10-30 9:38 PM
Hello,
I am trying to get a ISM330IS IMU working. I have ordered a development kit from Mouser / ST Micro with the following board number https://www.mouser.in/ProductDetail/STMicroelectronics/STEVAL-MKI230KA?qs=amGC7iS6iy%252B%252BWAEBNHSnWw%3D%3D (photos are also attached).
I have done the wiring referring to the User Manual Section 5.1. (photo is also attached). I am using a I2C to USB converter (photo is attached below) to read the data in a linux based Ubuntu 22.04 PC via library i2c-dev.
Link to User Manual I am following: https://www.st.com/resource/en/datasheet/ism330is.pdf
I am able to connect to the I2C bus and connect to Slave Address as per User Manual Section 5.1.1.1.
I am facing a problem:
Does someone have an idea why this could happen? Perhaps I am missing something to start the communication via I2C. Or something needs to be triggered before I start reading these registers on the sensor hub?
Here’s the code I am using:
void connect_i2c(std::shared_ptr<rclcpp::Node> imu_node){
const char* i2cDevice = "/dev/i2c-1"; // I2C bus number
i2cFile = open(i2cDevice, O_RDWR);
// Open the I2C device file for reading
if (i2cFile < 0) {
perror("Failed to open the I2C device.");
}
else{
std::cout << "I2C open successful" << "\n";
}
const uint8_t i2cAddress = 0b1101010; // I2C device's address
if (ioctl(i2cFile, I2C_SLAVE, i2cAddress) < 0) {
perror("Failed to set I2C address.");
}
else{
std::cout << "Slave open successful" << "\n";
}
// Write a command or data to initiate communication
//(replace 0x01 with your specific command)
unsigned char command = 0x00;
if (write(i2cFile, &command, 1) != 1) {
std::cerr << "Failed to write data to the ISM330IS sensor" << std::endl;
}
// This will run iteratively
run_i2c(imu_node);
}
void run_i2c(std::shared_ptr<rclcpp::Node> imu_node){
sleep(2);
rclcpp::Rate loop_rate(5);
while (rclcpp::ok())
{
int registerToRead = 0x0F; // Replace with the register address you want to read
if (write(i2cFile, ®isterToRead, 1) != 1) {
perror("Error writing register address");
//return 1;
}
uint8_t data;
if (read(i2cFile, &data, 1) != 1) {
perror("Error reading data");
//std::cerr << "Error reading data" << std::endl;
//return 1;
}
std::cout << "Data from register 0x" << std::hex << registerToRead << ": 0x" << static_cast<int>(data) << std::endl;
loop_rate.sleep();
rclcpp::spin_some(imu_node);
}
2023-11-03 8:35 AM
Hi @sa32953 ,
Welcome to ST Community!
From your photos it seems that you are connecting GND of the STEVAL to SCL of your board. Can you check this?
We’re moving the ST Community to a new platform to give you a better and more reliable community experience.