Skip to main content
Associate III
August 12, 2024
Solved

I2C issues with ATH10, HAL_I2C_Master_Transmit giving error but HAL_I2C_Master_Recieve doesn't

  • August 12, 2024
  • 4 replies
  • 5137 views

I have a NUCLEO-F103RB and I am trying to communicate with my AHT10 sensor. I understand the basics of I2C but i'm a newbie to stm32. 

For some reason when i do HAL_I2C_MASTER_TRANSMIT it seems to return a failure but HAL_I2C_MASTER_RECIEVE doesn't return any error at all. 

The null_a_char function basically just puts '/0' into the array so i can reuse it next time.

My code is below. 

while (1)
 {
	 null_a_char(buf);
	 buf[0]= 172;		//0xAC
	 ret = HAL_I2C_Master_Transmit(&hi2c1, 112, buf, 8, 10000); //Returns HAL_ERROR

	 null_a_char(buf);		// Just puts /0 in the buff 
	 buf[0]= 172;		//0xAC
	 ret = HAL_I2C_Master_Receive(&hi2c1, 112, buf, 2, 1000);	// Returns HAL_OK

	 null_a_char(buf);
	 ret = HAL_I2C_Master_Receive(&hi2c1, 113, buf, 6, 1000);	// Returns HAL_OK


	 // this returns buff[0]=24, buff[1]=220, buff[2]=105, buff[3]=0, buff[4]=0
	 // buff[5]=0, buff[6]=0
}

From my research, it seems the AHT10 sensor is on address 0x38. I have attached from what I think is the datasheet for the AHT10 as well as a couple pictures of my setup as well as my .ioc file. 

I'm a hobbiest and don't have anyone to turn to, please help. 

BadEngineer_0-1723491126183.png

My AHT10 sensor with the 2 pull up resistors (both connected to positive rail 

BadEngineer_1-1723491168029.png

The 2 wires connecting back to my nucleo board. 

BadEngineer_2-1723491229702.png

Image of my .ioc file

I have attached the AHT10 datasheet (i could be wrong but this is what i found). 

 

 



This topic has been closed for replies.
Best answer by TDK

> ret = HAL_I2C_Master_Transmit(&hi2c1, 112, buf, 8, 10000); //Returns HAL_ERROR

Looks like the device is only expecting 3 bytes for this command (0xAC, DATA0, DATA1), but you're sending 8. It's probably NACKing on the unexpected bytes. Why are you sending 8? Or am I misreading the data sheet?

TDK_0-1723493057140.png

 

4 replies

TDK
TDKBest answer
August 12, 2024

> ret = HAL_I2C_Master_Transmit(&hi2c1, 112, buf, 8, 10000); //Returns HAL_ERROR

Looks like the device is only expecting 3 bytes for this command (0xAC, DATA0, DATA1), but you're sending 8. It's probably NACKing on the unexpected bytes. Why are you sending 8? Or am I misreading the data sheet?

TDK_0-1723493057140.png

 

"If you feel a post has answered your question, please click ""Accept as Solution""."
Karl Yamashita
Principal
August 12, 2024

It's not very clear, but it looks like the trigger data needs to be 0x33, 0x00.

 

KarlYamashita_1-1723494581545.png

 

 

 

#define AHT10_SLAVE_ADDRESS (0x38 << 1)

#define TRIGGER_MEASUREMENT 0xAC

uint8_t aht10_data[6] = {0};

 

// update for Trigger measurement

aht10_data[0] = TRIGGER_MEASUREMENT;

aht10_data[1] = 0x33;

aht10_data[2] = 0x00;

// send trigger measurement byte plus 2 bytes

HAL_I2C_Master_Transmit(&hi2c1, AHT10_SLAVE_ADDRESS, aht10_data, 3, 100);

 

// Datasheet indicates MCU must wait for the measurement to be completed.

HAL_Delay(100);

 

// read temperature and humidity data, 6 bytes

HAL_I2C_Master_Receive(&hi2c1, AHT10_SLAVE_ADDRESS, aht10_data, 6, 100);

 

 

If a reply has proven helpful, click on Accept as Solution so that it'll show at top of the post.CAN Jammer an open source CAN bus hacking toolCANableV3 Open Source
Associate III
August 12, 2024

@Karl Yamashita 

Thank you for the code. 

Yes you are correct i also had to pass it 0x33. 

My follow up question is, in terms of the return data. I am getting the following in my buff[] or for your aht10_data equivalent. 

buff[0] = 24, buff[1]=149, buff[2]=177, buff[3]134, buff[4]=104, buff[5]=181. 

Am i correct to assume that buff[4] and buff[5] and half of buff[3] is tempreture?.
When i plug the numbers in (after converting them into binary) i get the following (420021/2^20)*200-50=30.1C

BadEngineer_0-1723496554142.png

Am i correct in assuming this?

Karl Yamashita
Principal
August 13, 2024

I couldn't find anything that indicates how many bits there are for temperature and humidity, but if is is 20 bits, then your calculation looks correct.

If a reply has proven helpful, click on Accept as Solution so that it'll show at top of the post.CAN Jammer an open source CAN bus hacking toolCANableV3 Open Source