原相PAH8002 读raw data不正常处理

一.现象与问题:
pah8002_ppg_data只能读到前面16个字节PPG rawdata,后面都是0. 这样同时会导致,感应器在TOUCH和NORMAL之间不断切换
PPG_DATA数据如下





二。分析与解决方法:
1.定義 I2C 讀資料的函式有錯誤:
uint8 pah8002_burst_read_reg(uint8 addr, uint8* data, uint8 len);
但fifo interrupt來時,呼叫pah8002_burst_read_reg(0, pah8002_ppg_data, samples_per_read*4)
其中samples_per_read為80,所以值入函式的值為80*4=320,已超過uint8的255,導致變數overflow。
可參考下列宣告.的代码部分
  uint8_t pah8002_burst_read_reg(uint8_t addr, uint8_t *data, uint32_t rx_size)
  {
  return i2c_burst_read_reg(I2C_ID_PAH8002, addr, data, rx_size);
  }

2.除了先前提到的uint8 leng要改uint32,更裡面的HEART8002_I2C_Read函式定義也要檢查。
uint8 pah8002_burst_read_reg(uint8 addr, uint8* data, uint8 len)
{
uint32 res = HEART8002_I2C_Read(&addr, data, len);
if (res > 0)
return 0;
else
return 1;
}

3.使用Level trigger的方式試看看. 在ppg的Setting中新增設定Bank2 0x7A 填 0x00. 其他地方不變
修改如下
  //PPG mode settings, 20Hz
static const uint8_t init_ppg_register_array[][2] = {
……….
{0x7F, 0x02}, //switch to bank2
……….,
{0x70, 0x01},
{0x7A, 0x00},
{0x7B, 0xFF},
…..….,
};
#define INIT_PPG_REG_ARRAY_SIZE (sizeof(init_ppg_register_array)/sizeof(init_ppg_register_array[0]))

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★博文作者未开放评论功能