amg88xx.c
1 #include "amg88xx.h" 2 #include "sipeed_i2c.h" 3 #include "fpioa.h" 4 #include "errno.h" 5 #include "sleep.h" 6 #include "stdlib.h" 7 8 9 int amg88xx_init(amg88xx_t *obj, 10 i2c_device_number_t i2c_num, uint8_t i2c_addr, uint32_t i2c_freq) 11 { 12 obj->i2c_num = i2c_num; 13 obj->i2c_addr = i2c_addr; 14 obj->i2c_freq = i2c_freq; 15 obj->scl_pin = fpioa_get_io_by_function(FUNC_I2C0_SCLK + i2c_num * 2); 16 obj->sda_pin = fpioa_get_io_by_function(FUNC_I2C0_SDA + i2c_num * 2); 17 obj->len = 64; 18 19 // clear var 20 obj->intc.value = 0x00; 21 22 maix_i2c_init(i2c_num, 7, i2c_freq); 23 24 // Set POWER CTL MODE 25 uint8_t temp[2] = {AMG88XX_ADDR_PCTL, AMG88XX_PCTL_NORMAL}; 26 int ret = maix_i2c_send_data(i2c_num, i2c_addr, temp, 2, 100); 27 if (ret != 0) return EIO; 28 29 // Reset 30 temp[0] = AMG88XX_ADDR_RST; temp[1] = AMG88XX_RST_INITIAL; 31 ret = maix_i2c_send_data(i2c_num, i2c_addr, temp, 2, 100); 32 if (ret != 0) return EIO; 33 34 // Disable Interrupt 35 obj->intc.INTEN = AMG88XX_INTC_EN_REACTIVE; 36 temp[0] = AMG88XX_ADDR_INTC; temp[1] = obj->intc.value; 37 ret = maix_i2c_send_data(i2c_num, i2c_addr, temp, 2, 100); 38 if (ret != 0) return EIO; 39 40 // Set 10 FPS 41 temp[0] = AMG88XX_ADDR_FPSC; temp[1] = AMG88XX_FPSC_10FPS; 42 ret = maix_i2c_send_data(i2c_num, i2c_addr, temp, 2, 100); 43 if (ret != 0) return EIO; 44 45 msleep(65); 46 47 obj->is_init = true; 48 49 return 0; 50 } 51 52 void amg88xx_destroy(amg88xx_t *obj) 53 { 54 obj->is_init = false; 55 } 56 57 int amg88xx_snapshot(amg88xx_t *obj, int16_t **pixels) 58 { 59 60 if (!pixels) return EINVAL; 61 62 uint8_t * p = obj->temp; 63 64 uint8_t temp[2] = {AMG88XX_TABLEOFFSET, 0}; 65 int ret = maix_i2c_recv_data(obj->i2c_num, obj->i2c_addr, temp, 1, p, 128, 200); 66 if (ret < 0) return EIO; 67 68 uint8_t i = 0; 69 uint8_t z = 0; 70 int32_t v = 0; 71 72 for (i = 0; i < 128; i+=2) 73 { 74 v = 0; 75 v = p[i+1] << 8 | p[i]; 76 obj->v[z] = (p[i+1] & 1 << 3) ? v | (0x7FFFF << 13) : v; 77 z++; 78 } 79 80 *pixels = obj->v; 81 82 return ret; 83 }