Procedury przeznaczone są dla dowolnego kontrolera z rodziny STM32.
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;
}
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;
}