aries

AMG88xx przykład procedur odczytu temperatur

Procedury przeznaczone są dla dowolnego kontrolera z rodziny STM32.

Odczyt i zapis magistralą I2C

Listing standardowych funkcji odczytu i zapisu bloku danych magistralą I2C, z wykorzystaniem procedur HAL.

		
extern I2C_HandleTypeDef hi2c1;

//procedura odczytu bloku danych magistralą I2C
char I2C_OdczytBloku(unsigned char slave_adr, unsigned int adres_int, 
			unsigned char ile_bajtow_danych, char *p_bufor)
//wy: TRUE -sukces, FALSE -błąd
{
HAL_StatusTypeDef status;

	status =HAL_I2C_Mem_Read(&hi2c1,(uint16_t)slave_adr,(uint16_t)adres_int,I2C_MEMADD_SIZE_8BIT,
				(uint8_t *)p_bufor,(uint16_t)ile_bajtow_danych,1000);
	if (status !=HAL_OK) return FALSE;
	else return TRUE;
}
//procedura zapisu bloku danych magistralą I2C
char I2C_ZapisBloku(unsigned char slave_adr, unsigned int adres_int, 
			unsigned char ile_bajtow_danych, char *p_bufor)
{
HAL_StatusTypeDef status;

	status =HAL_I2C_Mem_Write(&hi2c1,(uint16_t)slave_adr,(uint16_t)adres_int,I2C_MEMADD_SIZE_8BIT,
				(uint8_t *)p_bufor,(uint16_t)ile_bajtow_danych,1000);
	if (status !=HAL_OK) return FALSE;
	else return TRUE;
}
		
		

Odczyt danych temperatury z rejestrów pikseli

Parametrem procedury jest wskaźnik do buforu w którym mają zostać umieszczone odczytane temperatury wszystkich 64 pikseli matrycy. Wykorzystując dwie pętle dla odliczania pozycji w pionie i poziomie kolejnego piksela, następuje odczyt odpowiadających mu rejestrów zawierających dane pomiarowe. Po odczycie następuje konwersja wartości binarnej zapisanej w formacie uzupełnienia do 2 na zmiennoprzecinkową wartość temperatury typu float. Otrzymana wartość zostaje zapisana do bufora i procedura kontynuuje odczyt kolejnych rejestrów następnego piksela matrycy.

		
#define AMG88XX_SLAVE_ADR7B 0x69
#define MATRYCA_ADR_T01L	0x80
#define ILE_PIX_X	8	//ilość pikseli X
#define ILE_PIX_Y	8	//ilość pikseli Y

//odczyt temperatury matrycy AMG88xx
uint8_t OdczytAMG88xx_matryca(float *p_bufor_temperatur_matrycy)
{
static uint8_t piksel_rej_adr,status=FALSE,bufor;
uint16_t matryca_temp;
float matryca;

piksel_rej_adr =MATRYCA_ADR_T01L;//adres rejestru 1 piksela matrycy
for (uint8_t y=0; y < ILE_PIX_Y; y++)
{
   for (uint8_t x=0; x < ILE_PIX_X; x++)
   {
	   //odczyt L bitów temperatury piksela matrycy
		status =I2C_OdczytBloku((AMG88XX_SLAVE_ADR7B<<1), piksel_rej_adr, 
				1, (char *)&bufor);
		if (status ==FALSE) return FALSE;
		piksel_rej_adr++;
		matryca_temp =bufor;
		//odczyt H bitów temperatury piksela matrycy
		status =I2C_OdczytBloku((AMG88XX_SLAVE_ADR7B<<1), piksel_rej_adr, 
				1, (char *)&bufor);
		if (status ==FALSE) return FALSE;
		piksel_rej_adr++;
		matryca_temp =matryca_temp +(bufor <<8);
		//konwersja wartości binarnej na zmiennoprzecinkową
		if ((0x800 &matryca_temp) !=0)
		{
			//temperatura ujemna
			matryca_temp =(~matryca_temp) & 0xFFF;
			matryca_temp =matryca_temp +1;
			matryca =matryca_temp * 0.25;
			matryca =0 -matryca;
		}
		else
		{
			matryca =matryca_temp * 0.25;
		}
		uint8_t numer_pix =(y*ILE_PIX_Y)+x;
		*(p_bufor_temperatur_matrycy+numer_pix) =matryca;
   }
}
return TRUE;
}