#include <string.h>
#include <stdio.h>
#include <stdlib.h>
-#include "tyhx_OTS_hx3508_custom.h"
+#include "hx3508.h"
#include "cmsis_os2.h"
#include "custom_utils.h"
#include "hal_gpio.h"
#include "pinctrl_porting.h"
+#include "hx3508_hal.h"
// #include "tyhx_hrs_custom.h"
//平台头文件包含定义
#ifdef NORDIC_SDK
//custom to do here
#endif //NORDIC_SDK
+#define HX3508_I2C_BUS I2C_BUS_2
+
#define HAISI_SDK
#ifdef CHIP_HX3508
void ots_timer_handler(void * p_context);
#define REPORT_MIN 2 // 这个是最小上报角度, 按照平均值预估的值, 由客户定义, 看多大的数据上报给UI处理一次
+
+#define POWER_3V3_PIN S_AGPIO_L17
+
static int16_t ots_result = 0;//ots结果
static int16_t stand_still = 1; //静止标志 1 静止,0 转动
static osTimerId_t g_hx3508_timer = NULL;
+extern encoder_callback g_encoder_callback;
+
/*--------以下为定时函数相关定义 建立/启动/停止定时器//定时中断处理-----------*/
+
+
+static void report_zero_data_for_start_stop_flag(void)
+{
+
+ ots_result = 0;
+ TYHX_LOG("report_zero_data_for_start_stop_flag crown_result = %d, \r\n",ots_result);
+ if (g_encoder_callback != NULL)
+ g_encoder_callback();
+ else
+ TYHX_LOG("no call back crown_result = %d\r\n",ots_result);
+}
+
+
/**
* OTS 定时器创建函数
* @param NULL
uint8_t data_buf = 0;
//add by user, i2c read function
// tyhx_read_regs(I2C_DEV_7ADDR,regaddr,&data_buf,1);
- // custom_i2c_read_regs(I2C_DEV_7ADDR,regaddr,1,&data_buf,1,hx3508_I2C_BUS);
- data_buf = crown_read_reg(I2C_DEV_7ADDR,regaddr);
+ custom_i2c_read_regs(I2C_DEV_7ADDR,regaddr,1,&data_buf,1,HX3508_I2C_BUS);
+ // data_buf = crown_read_reg(I2C_DEV_7ADDR,regaddr);
return data_buf; //返回读到的寄存器值
}
{
//add by user, i2c write function
// tyhx_write_reg(I2C_DEV_7ADDR,regaddr,®value);
- crown_write_reg(I2C_DEV_7ADDR,regaddr,regvalue);
+ // crown_write_reg(I2C_DEV_7ADDR,regaddr,regvalue);
+ custom_i2c_write_reg(I2C_DEV_7ADDR,regaddr,1,®value,1,HX3508_I2C_BUS);
return;
}
deltax = ots_read_reg(RA_ACC_DELTA_X_LOW) |(ots_read_reg(RA_ACC_DELTA_X_HIG)<<8);
deltay = ots_read_reg(RA_ACC_DELTA_Y_LOW) |(ots_read_reg(RA_ACC_DELTA_Y_HIG)<<8);
TYHX_LOG("Deltay = %d \r\n",deltay);//djd0305
+
+ if (stand_still == 1)
+ {
+ //上次是静止,上报状态改变
+ report_zero_data_for_start_stop_flag();
+ }
+ stand_still = 0;
+
//用户添加程序, deltay 是表冠产生数据, 上报给UI, 如果需要数据变化,
// 积攒到一定值再上报UI, 可以调用 ots_result_deal()函数处理.
+
ots_result_deal(deltax);
}
else
- {
- stand_still = 1;
+ {
+ if (stand_still == 0)
+ {
+ //上次是转动,上报状态改变
+ report_zero_data_for_start_stop_flag();
+ }
+ stand_still = 1;
+
//debug的时候, 可能用到, 看一下图像质量
TYHX_LOG("pic qulity =%d, agc num=%d\r\n",ots_read_reg(RA_DATA_2AGC),ots_read_reg(RA_EXP_NUM_SEL)&0x7F);
}
void ots_init(void)
{
//此时要保证芯片已经正常上电
- uapi_gpio_set_dir(PIN_TYHX_SDIO,GPIO_DIRECTION_OUTPUT);
+ // uapi_gpio_set_dir(PIN_TYHX_SDIO,GPIO_DIRECTION_OUTPUT);
- uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW);
+ // uapi_gpio_set_val(PIN_TYHX_SDIO,GPIO_LEVEL_LOW);
- uapi_gpio_set_dir(PIN_TYHX_SCLK,GPIO_DIRECTION_OUTPUT);
+ // uapi_gpio_set_dir(PIN_TYHX_SCLK,GPIO_DIRECTION_OUTPUT);
- uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW);
+ // uapi_gpio_set_val(PIN_TYHX_SCLK,GPIO_LEVEL_LOW);
- uapi_tcxo_delay_us(COM_DELAY);
+ // uapi_tcxo_delay_us(COM_DELAY);
// crown_com_resync();
+
+ custom_i2c_init(I2C_BUS_2);
+
+ uapi_gpio_set_dir(POWER_3V3_PIN,GPIO_DIRECTION_OUTPUT);
+ uapi_gpio_set_val(POWER_3V3_PIN,GPIO_LEVEL_HIGH);
+
+ LOS_Mdelay(20);
+
int i;
for(i=0; i<10; i++)//重复读DEVICE ID 是否等于0X35
{
ots_result-=1; //
}
}
- // if(abs(ots_result)>=REPORT_MIN)//最小的值由用户定义, 就是得到值大于一定的值, 再上报UI
- // {
- // //OTS结果上报UI, 因为这里是定时读取的函数, 可以把结果上报
- // ots_result = 0;
- // }
+
+ if (g_encoder_callback != NULL)
+ g_encoder_callback();
+
}
int16_t hx3508_get_stand_still(void)
return resulttemp;
}
+void hx3508_get_chip_id(uint16_t *id)
+{
+ int i;
+ for(i=0; i<10; i++)//重复读DEVICE ID 是否等于0X35
+ {
+ if(ots_read_reg(RA_DEFINE_PART_ID) == 0x35)
+ {
+ TYHX_LOG("read chip id is 0x35\r\n",i);
+ *id = 0x35;
+ break;
+ }
+ else
+ {
+ TYHX_LOG("read chip id is 0x%x\r\n",ots_read_reg(RA_DEFINE_PART_ID));
+ }
+ // if(i<7)//读到ID不对, 复位通信
+ // {
+ // crown_com_resync();
+ // }
+
+ }
+ if(i==10)
+ {
+ TYHX_LOG("hx3508 communication err, please check\r\n");
+ return;
+ }
+}
+
#else //其他平台,由用户自行添加上面对应的程序
//custom to do here
#include "mixo_hal.h"
#elif defined ROTARYENCODER_HX3507
#include "hx3507_hal.h"
+#elif defined ROTARYENCODER_HX350
+#include "hx350_hal.h"
#endif
// #if defined(TPTYPE_TMA525B)
#elif defined ROTARYENCODER_MIXO
g_encoder_drv.private_data = rotary_encoder_get_mixo_peri_attr();
g_encoder_drv.encoder_api = rotary_encoder_get_mixo_api();
+#elif ROTARYENCODER_HX3508
+ g_encoder_drv.private_data = rotary_encoder_get_hx3508_peri_attr();
+ g_encoder_drv.encoder_api = rotary_encoder_get_hx3508_api();
#endif
g_encoder_drv.ops = &g_re_status_ops;
redd = rotary_encoder_get_driver_data();
encoder_ptr = rotary_encoder_get_hx3507_api();
#elif defined ROTARYENCODER_MIXO
encoder_ptr = rotary_encoder_get_mixo_api();
+#elif defined ROTARYENCODER_HX3508
+ encoder_ptr = rotary_encoder_get_hx3508_api();
#endif
if(encoder_ptr == NULL)
return;
encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_hx3507_api();
#elif defined ROTARYENCODER_MIXO
encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_mixo_api();
+#elif defined ROTARYENCODER_HX3508
+ encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_hx3508_api();
#endif
if(encoder_ptr == NULL)
return;
void rotary_get_chip_id(uint16_t *id)
{
#ifdef ROTARYENCODER_HX3507
-#if FD230_650_0723 //需要改
- crown_read_id(id);
-#endif
+ hx3507_get_chip_id(id);
#elif defined ROTARYENCODER_MIXO
mixo_get_chip_id(id);
+#elif defined ROTARYENCODER_HX3508
+ hx3508_get_chip_id(id);
#endif
}
\ No newline at end of file