2024-09-19 01:12 AM
Hi everybody !! i have an issue on I2C with a STM32 issue. i thought this was a code issue but in the main i also make LEDs blinking and it works, only the I2C doesn't work but... i noticed that my lines both rise to 3.3V but never fall down it just stay high. i guess it might be because i have a clock issue. Im using internal clock for some reasons, no external crystal. The HAL-delay function work with the SYSCLK but my I2C clock doesn't. Thx for your future answers. Best regards.
2024-09-19 05:54 AM
Do you call HAL_I2C_* functions? Show your usage of them. Do they return HAL_OK or something else?
2024-09-19 08:16 AM
Hello @Tendo,
Please share more details to help you solve your issue.
Have a look at this FAQ which describes few tips related to I2C: STM32 I2C does not work - STMicroelectronics Community
2024-09-19 08:43 AM
please see the Posting Tips for how to properly post source code - not as screenshots:
2024-09-19 09:26 AM
Thank for your answer. I will show you what i did :
#include "STM332_IMU.h"
#define IMU_addr_R 0xD0
#define IMU_addr_W 0xD1
#define IMU_REG_SMPLRT_DIV 0x19
#define IMU_REG_CONFIG 0x1A
#define IMU_REG_GYRO_CONFIG 0x1B
#define IMU_REG_ACCEL_CONFIG 0x1C
#define IMU_REG_PWR_MNGMT 0x6B
#define IMU_TEMP_H 0x41
#define IMU_TEMP_L 0x42
#define IMU_GYRO_X_H 0x43
#define IMU_GYRO_X_L 0x44
#define IMU_GYRO_Y_H 0x45
#define IMU_GYRO_Y_L 0x46
#define IMU_GYRO_Z_H 0x47
#define IMU_GYRO_Z_L 0x48
I2C_HandleTypeDef hi2c;
uint8_t tx_buffer,rx_buffer,temp_H,temp_L;
uint16_t temperature;
uint16_t temp_degree;
uint8_t Rx_gyro_values[6];
int16_t Gyro_X_data = 0;
int16_t Gyro_Y_data = 0;
int16_t Gyro_Z_data = 0;
void Read_IMU_temp ()
{
HAL_I2C_Mem_Read(&hi2c, IMU_addr_R, IMU_TEMP_H, 1, temp_H, 1, 1000);
HAL_I2C_Mem_Read(&hi2c, IMU_addr_R, IMU_TEMP_H, 1, temp_L, 1, 1000);
temperature = ((temp_H << + temp_L);
temp_degree = ((temperature/340) + 36.53);
}
void Read_IMU_Gyro ()
{
HAL_I2C_Mem_Read(&hi2c, IMU_addr_R, IMU_GYRO_X_H ,1, Rx_gyro_values, 6, 1000);
Gyro_X_data = (int16_t)(Rx_gyro_values[0] << 8 | Rx_gyro_values [1]);
Gyro_Y_data = (int16_t)(Rx_gyro_values[2] << 8 | Rx_gyro_values [3]);
Gyro_Z_data = (int16_t)(Rx_gyro_values[4] << 8 | Rx_gyro_values [5]);
}
void init_IMU_MPU6050 ()
{
if (HAL_I2C_IsDeviceReady(&hi2c, IMU_addr_R, 1, 1000))
{
tx_buffer = 0x07;
HAL_I2C_Mem_Write(&hi2c, IMU_addr_W, IMU_REG_SMPLRT_DIV, 1, tx_buffer, 1, 1000);
tx_buffer = 0xE0;
HAL_I2C_Mem_Write(&hi2c, IMU_addr_W, IMU_REG_GYRO_CONFIG, 1, tx_buffer, 1, 1000);
tx_buffer = 0x00;
HAL_I2C_Mem_Write(&hi2c, IMU_addr_W, IMU_REG_PWR_MNGMT, 1, tx_buffer, 1, 1000);
tx_buffer = 0x00;
HAL_I2C_Mem_Write(&hi2c, IMU_addr_W, IMU_REG_ACCEL_CONFIG, 1, tx_buffer, 1, 1000);
}
}
2024-09-19 10:12 AM
As @TDK suggested, check the return values from all your HAL_I2C_... function calls
I think this is wrong:
if (HAL_I2C_IsDeviceReady(&hi2c, IMU_addr_R, 1, 1000))
{
tx_buffer = 0x07;
If the device is ready, then HAL_I2C_IsDeviceReady() will return HAL_OK, which is zero - ie, false !
So it should be:
if (HAL_OK == HAL_I2C_IsDeviceReady(&hi2c, IMU_addr_R, 1, 1000))
{
tx_buffer = 0x07;
2024-09-19 10:24 AM
> I2C_HandleTypeDef hi2c;
Where do you initialize this? Probably nowhere. Certainly not in the included code.
Probably you should be using the handle that is declared and initialized in main.c or i2c.c. Something like:
extern I2C_HandleTypeDef hi2c1;
Debug your code, step through functions to understand where and why they don't work as expected. Don't treat them as a black box.
2024-09-19 12:13 PM
i tried but nothing happens.
2024-09-19 12:16 PM
this doesn't compile with because it isn't declared i don't know why. teh thing is , i knwo there might have some issues in my code but :
First, the code compiles properly
Second, nothing block the program, my LED keep blinking and the loop do the job
AND finally i don't have anything on SCL line, even with a bad code, if the I2C is activated we should see the clock however i just see the line going to 3.3V
2024-09-19 12:32 PM
> AND finally i don't have anything on SCL line, even with a bad code, if the I2C is activated we should see the clock however i just see the line going to 3.3V
Why do you expect specific functionality even with bad code? That is madness.
Do you initialize I2C anywhere? If so, where and how? Really hard to debug through a keyhole. Might have to put in some work yourself to properly illustrate what you having going on in the code.