// trs55d.c #include "system/includes.h" #include "app_config.h" #include "app_action.h" #include "app_main.h" #include "update.h" #include "update_loader_download.h" #include "app_charge.h" #include "app_power_manage.h" #include "asm/charge.h" #include "app_temperature.h" #include "typedef.h" #include "le_common.h" #include "cpu.h" #include "timer.h" #include "os/os_api.h" #include "system/includes.h" #include "gatt_common/le_gatt_common.h" #include "examples/trans_data/ble_trans_profile.h" #include "asm/iic_soft.h" #include "trs55d.h" #define IIC_CHANNEL_1 0 const struct soft_iic_config soft_iic_cfg[] = { //iic0 data { .scl = IO_PORTA_07, //IIC CLK脚 .sda = IO_PORTA_08, //IIC DAT脚 .delay = 50, //软件IIC延时参数,影响通讯时钟频率 .io_pu = 1, //是否打开上拉电阻,如果外部电路没有焊接上拉电阻需要置1 }, }; #if 1 //如果无reg_addr:reg_addr=NULL,reg_len=0 //return: <0:error, =read_len:ok int soft_i2c_master_read_nbytes_from_device_reg(soft_iic_dev iic, //iic索引 unsigned char dev_addr, //设备地址 int reg_addr, unsigned char reg_len,//设备寄存器地址,长度 unsigned char *read_buf, int read_len)//缓存buf,读取长度 { u8 ack; int ret = 0; // 发送起始条件 soft_iic_start(iic); // 1. 发送设备地址(写模式) ack = soft_iic_tx_byte(iic, dev_addr & 0xFE); if (!ack) { printf("dev_addr no ack!\n"); ret = -1; goto exit; } // 2. 发送寄存器地址(支持多字节地址) if (reg_len > 0) { // 处理多字节地址(高位在前) uint8_t addr_buf[4]; for (int i = reg_len - 1; i >= 0; i--) { addr_buf[i] = (reg_addr >> (8 * (reg_len - 1 - i))) & 0xFF; } for (u8 i = 0; i < reg_len; i++) { ack = soft_iic_tx_byte(iic, addr_buf[i]); if (!ack) { printf("reg_addr no ack at byte %d!\n", i); ret = -1; goto exit; } } } // 3. 发送重复起始条件 soft_iic_start(iic); // 4. 发送设备地址(读模式) ack = soft_iic_tx_byte(iic, dev_addr | 0x01); if (!ack) { printf("dev_addr (read) no ack!\n"); ret = -1; goto exit; } // 5. 读取数据 ret = soft_iic_read_buf(iic, read_buf, read_len); exit: // 发送停止条件 soft_iic_stop(iic); return ret; /* u8 ack; int ret = 0; //local_irq_disable(); //if (soft_iic_check_busy(iic) == IIC_ERROR_BUSY) { //busy // ret = IIC_ERROR_BUSY; //busy // goto _read_exit2; //} if ((reg_addr != 0) && (reg_len != 0)) { soft_iic_start(iic); ack = soft_iic_tx_byte(iic, dev_addr); if (ack == 0) { printf("dev_addr no ack!"); //ret = IIC_ERROR_DEV_ADDR_ACK_ERROR; //无应答 ret = -1; goto _read_exit1; } for (u8 i = 0; i < reg_len; i++) { ack = soft_iic_tx_byte(iic, reg_addr); if (ack == 0) { printf("reg_addr no ack!"); //ret = IIC_ERROR_REG_ADDR_ACK_ERROR; //无应答 ret = -1; goto _read_exit1; } } } soft_iic_start(iic); ack = soft_iic_tx_byte(iic, dev_addr | BIT(0)); if (ack == 0) { printf("dev_addr no ack!"); //ret = IIC_ERROR_DEV_ADDR_ACK_ERROR; //无应答 goto _read_exit1; } ret = soft_iic_read_buf(iic, read_buf, read_len); _read_exit1: soft_iic_stop(iic); return ret;*/ } //如果无reg_addr:reg_addr=NULL,reg_len=0 //return: =write_len:ok, other:error int soft_i2c_master_write_nbytes_to_device_reg(soft_iic_dev iic, unsigned char dev_addr, //设备地址 int reg_addr, unsigned char reg_len,//设备寄存器地址,长度 unsigned char *write_buf, int write_len)//数据buf, 写入长度 { int res; u8 ack; //local_irq_disable();//软件iic不可被中断 //if (soft_iic_check_busy(iic) == IIC_ERROR_BUSY) { //busy // res = IIC_ERROR_BUSY; //busy // goto _write_exit2; //} soft_iic_start(iic); ack = soft_iic_tx_byte(iic, dev_addr); if (ack == 0) { printf("dev_addr no ack!"); //res = IIC_ERROR_DEV_ADDR_ACK_ERROR; //无应答 res = -1; //无应答 goto _write_exit1; } if ((reg_addr !=0 ) && (reg_len != 0)) { for (u8 i = 0; i < reg_len; i++) { ack = soft_iic_tx_byte(iic, reg_addr); if (ack == 0) { printf("reg_addr no ack!"); //res = IIC_ERROR_REG_ADDR_ACK_ERROR; //无应答 res = -1; goto _write_exit1; } } } for (res = 0; res < write_len; res++) { if (0 == soft_iic_tx_byte(iic, write_buf[res])) { printf("write data no ack!"); goto _write_exit1; } } _write_exit1: soft_iic_stop(iic); return res; } #endif static void udelay(u32 usec) { /* if (set_to_close_timer0_delay) { */ /* JL_MCPWM->MCPWM_CON0 &= ~BIT(8 + 3); */ /* JL_MCPWM->TMR3_CNT = 0; */ /* JL_MCPWM->TMR3_PR = clk_get("lsb") / 1000000 * usec; */ /* JL_MCPWM->TMR3_CON = BIT(10) | BIT(0); */ /* JL_MCPWM->MCPWM_CON0 |= BIT(8 + 3); */ /* while (!(JL_MCPWM->TMR3_CON & BIT(12))); */ /* JL_MCPWM->TMR3_CON = BIT(10); */ /* JL_MCPWM->MCPWM_CON0 &= ~BIT(8 + 3); */ /* } else { */ JL_TIMER0->CON = BIT(14); JL_TIMER0->CNT = 0; JL_TIMER0->PRD = 16 * 1000000L / 1000000L * usec; //1us JL_TIMER0->CON = BIT(0); //sys clk while ((JL_TIMER0->CON & BIT(15)) == 0); JL_TIMER0->CON = BIT(14); /* } */ } void TRS55D_Init(){ #if 0 //LCD VDD3.3 pmu_set_aldo_voltage(PMU_ALDO_MODE_NORMAL,PMU_ALDO_VOL_3_3); //LCD RESET system_set_port_mux(GPIO_PORT_A,GPIO_BIT_4,PORTA4_FUNC_A4); gpio_set_dir(GPIO_PORT_A, GPIO_BIT_4, GPIO_DIR_OUT); gpio_set_pin_value(GPIO_PORT_A,GPIO_BIT_4,1); co_delay_100us(1000); system_set_port_mux(GPIO_PORT_A, GPIO_BIT_6, PORTA6_FUNC_I2C1_CLK);//Pa6 system_set_port_mux(GPIO_PORT_A, GPIO_BIT_7, PORTA7_FUNC_I2C1_DAT);//Pa7 system_set_port_pull( (GPIO_PA6|GPIO_PA7), true); //IIC0, 1M hz. slave addr: 0xd6 iic_init(IIC_CHANNEL_1,100,TRS_ADDR_AD); soft_iic_init(0); #endif //打开电源 gpio_set_direction(IO_PORTA_02,0); gpio_direction_output(IO_PORTA_02, 1); //初始化IIC soft_iic_init(IIC_CHANNEL_1); } uint8_t TRS55D_IIC_Read(uint8_t addr_dev, uint8_t addr_reg, uint8_t *buf, uint16_t count) { #if 0 uint8_t ret; uint8_t ackflag; uint16_t i = 0; /* drv_i2c_start(); drv_i2c_select_dev(addr_dev,DRV_I2C_OPWR); drv_i2c_writebyte(addr_reg); drv_i2c_start(); drv_i2c_select_dev(addr_dev,DRV_I2C_OPRD); for(i = 0; i < count; i ++) { ackflag = (i < (count-1)) ? 1:0; buf[i] = drv_i2c_readbyte(ackflag); } drv_i2c_stop(); */ iic_read_bytes(IIC_CHANNEL_1, addr_dev, addr_reg, buf, count); return ret; #endif //soft_iic_read_buf(IIC_CHANNEL_1, buf, count); soft_i2c_master_read_nbytes_from_device_reg(IIC_CHANNEL_1, addr_dev, //设备地址 addr_reg, 1,//设备寄存器地址,长度 buf, count);//数据buf, 写入长度 return 1; } void TRS55D_IIC_Write(uint8_t addr_dev, uint8_t addr_reg, uint8_t *buf, uint16_t count) { uint16_t i = 0; /* drv_i2c_start(); drv_i2c_select_dev(addr_dev,DRV_I2C_OPWR); drv_i2c_writebyte(addr_reg); for (i = 0; i < count; i ++) { drv_i2c_writebyte(buf[i]); } drv_i2c_stop(); */ // iic_write_bytes(IIC_CHANNEL_1,addr_dev,addr_reg,buf,count); //soft_iic_write_buf(IIC_CHANNEL_1, buf, count); soft_i2c_master_write_nbytes_to_device_reg(IIC_CHANNEL_1, addr_dev, //设备地址 addr_reg, 1,//设备寄存器地址,长度 buf, count);//数据buf, 写入长度 } static char buffer[264]; uu32_t obj,tmp_3, vtp_cor; float tamb_temp ,vtp_cor_uv ,Tobj_temp ; //#include "FW_TRS_CAL.h" uint16_t t_objx10_u16; int16_t Tambx10_u16; uint16_t Trs_Read(uint16_t *t_body, uint16_t *t_ntc) { uint8_t rbuf[4]; uint8_t raddr, rdat; uint8_t waddr = 0x0, wdat = 0x0; int timeout = 0; waddr = 0x30; // CMD wdat = 0x09; // 0x0000 1 FSM 001 单通道连续转换 TRS55D_IIC_Write(TRS_ADDR_AD, waddr, &wdat, 1); // start conversion 模式使能 udelay(100); raddr = 0x03; // 原始数据地址 do { TRS55D_IIC_Read(TRS_ADDR_AD, raddr, &rdat, 1); } while (((rdat == 0xFF) || (!(rdat & 0x30))) && timeout++ < 100); // 全真为真 // flag置1 结果为真 取反为假跳出循环 raddr = 0x02; // 经过校准后的数据地址 do { TRS55D_IIC_Read(TRS_ADDR_AD, raddr, &rdat, 1); } while (((rdat == 0xFF) || (!(rdat & 0x0B))) && timeout++ < 200); // flag置1 结果为真 取反为假跳出循环 udelay(500); // raddr = NORMAL_DATA1_MSB_R;//0x19 通道1校准后adc数据 //iic_read_byte(IIC_CHANNEL_1, TRS_ADDR_AD, 0x19, &rbuf[0]); //iic_read_byte(IIC_CHANNEL_1, TRS_ADDR_AD, 0x1A, &rbuf[1]); //iic_read_byte(IIC_CHANNEL_1, TRS_ADDR_AD, 0x1B, &rbuf[2]); soft_i2c_master_read_nbytes_from_device_reg(IIC_CHANNEL_1,TRS_ADDR_AD,0x19, 1,&rbuf[0], 1); soft_i2c_master_read_nbytes_from_device_reg(IIC_CHANNEL_1,TRS_ADDR_AD,0x1A, 1,&rbuf[1], 1); soft_i2c_master_read_nbytes_from_device_reg(IIC_CHANNEL_1,TRS_ADDR_AD,0x1B, 1,&rbuf[2], 1); //printf("0x19:%02X 0x1A:%02X 0x1B:%02X \r\n", rbuf[0], rbuf[1], rbuf[2]); vtp_cor.un.u8b2 = rbuf[0]; vtp_cor.un.u8b1 = rbuf[1]; vtp_cor.un.u8b0 = rbuf[2]; if (vtp_cor.un.u8b2 & 0x80) { vtp_cor.un.u8b3 = 0xFF; } else { vtp_cor.un.u8b3 = 0x00; } float vt_cor = 524288; vtp_cor_uv = (float)vtp_cor.i32 / vt_cor; // vtp_cor_uv=DATA1/2^19(±16mV)=vtp_cor.i32/vt_cor vtp_cor_uv *= 1000.0; // raddr = NORMAL_TEMP_MSB_R;//0x16环境校准后温度 // TRS55D_IIC_Read (TRS_ADDR_AD, raddr, &rbuf[0],3); // uint8_t iic_read_byte(enum iic_channel_t channel, uint8_t slave_addr, uint8_t reg_addr, uint8_t *buffer) //iic_read_byte(IIC_CHANNEL_1, TRS_ADDR_AD, 0x16, &rbuf[0]); //iic_read_byte(IIC_CHANNEL_1, TRS_ADDR_AD, 0x17, &rbuf[1]); //iic_read_byte(IIC_CHANNEL_1, TRS_ADDR_AD, 0x18, &rbuf[2]); soft_i2c_master_read_nbytes_from_device_reg(IIC_CHANNEL_1,TRS_ADDR_AD,0x16, 1,&rbuf[0], 1); soft_i2c_master_read_nbytes_from_device_reg(IIC_CHANNEL_1,TRS_ADDR_AD,0x17, 1,&rbuf[1], 1); soft_i2c_master_read_nbytes_from_device_reg(IIC_CHANNEL_1,TRS_ADDR_AD,0x18, 1,&rbuf[2], 1); //printf("0x16:%02X 0x17:%02X 0x18:%02X \r\n", rbuf[0], rbuf[1], rbuf[2]); tmp_3.un.u8b2 = rbuf[0]; tmp_3.un.u8b1 = rbuf[1]; tmp_3.un.u8b0 = rbuf[2]; if (tmp_3.un.u8b2 & 0x80) { tmp_3.un.u8b3 = 0xFF; } else { tmp_3.un.u8b3 = 0x00; } // raddr = NORMAL_Tobj_MSB_R;//0x10 dsp处理数据据 // TRS55D_IIC_Read (TRS_ADDR_AD, raddr, &rbuf[0],3); //iic_read_byte(IIC_CHANNEL_1, TRS_ADDR_AD, 0x10, &rbuf[0]); //iic_read_byte(IIC_CHANNEL_1, TRS_ADDR_AD, 0x11, &rbuf[1]); //iic_read_byte(IIC_CHANNEL_1, TRS_ADDR_AD, 0x12, &rbuf[2]); soft_i2c_master_read_nbytes_from_device_reg(IIC_CHANNEL_1,TRS_ADDR_AD,0x10, 1,&rbuf[0], 1); soft_i2c_master_read_nbytes_from_device_reg(IIC_CHANNEL_1,TRS_ADDR_AD,0x11, 1,&rbuf[1], 1); soft_i2c_master_read_nbytes_from_device_reg(IIC_CHANNEL_1,TRS_ADDR_AD,0x12, 1,&rbuf[2], 1); //printf("0x10:%02X 0x11:%02X 0x12:%02X \r\n", rbuf[0], rbuf[1], rbuf[2]); obj.un.u8b2 = rbuf[0]; obj.un.u8b1 = rbuf[1]; obj.un.u8b0 = rbuf[2]; if (obj.un.u8b2 & 0x80) { obj.un.u8b3 = 0xFF; } else { obj.un.u8b3 = 0x00; } // co_printf("NORMAL_Tobj_MSB_R :%02X %02X %02X\r\n",rbuf[0],rbuf[1],rbuf[2]); //printf("tmp_3.i32: %d obj.i32: %d \r\n", tmp_3.i32, obj.i32); Cal_get_temp(tmp_3.i32, 1000, obj.i32, 1000, &Tambx10_u16, &t_objx10_u16); Tobj_temp = (float)t_objx10_u16 / 10; tamb_temp = (float)Tambx10_u16 / 10; *t_body = (uint16_t)(Tobj_temp * 100); *t_ntc = (uint16_t)(tamb_temp * 100); return 1; } /* static char buffer[264]; uu32_t tobj, tamb_cal; uu32_t vtp_cor; float vtp_uv_f = 0.0; float vtp_cor_f = 0.0; float tambf = 0.0; float tobjf = 0.0; float tbdyf = 0.0; void TRS55D_read(void){ co_printf("TRS55D_read !! \r\n"); uint8_t rbuf[4]; uint8_t raddr,rdat; uint8_t waddr = 0x0, wdat = 0x0; int timeout=0; iic_read_byte(IIC_CHANNEL_1, ADDR_TRS55D, 0x97, &rdat); co_printf("read raddr :%02X rdat %02X\r\n",0x97,rdat); co_delay_100us(1000); waddr = 0x30; wdat = 0x09; TRS55D_IIC_Write(ADDR_TRS55D, waddr, &wdat,1); //start conversion //delay_ms(100); co_delay_100us(1000); // waite for conversion over // co_printf("waite for conversion over !! \r\n"); raddr = 0x03; do { TRS55D_IIC_Read (ADDR_TRS55D, raddr, &rdat,1); co_printf("read raddr :%02X rdat %02X\r\n",raddr,rdat); } while(((rdat == 0xFF) || (!(rdat & 0x30))) && timeout++ < 200); raddr = 0x02; do { TRS55D_IIC_Read (ADDR_TRS55D, raddr, &rdat,1); co_printf("read raddr :%02X rdat %02X\r\n",raddr,rdat); } while(((rdat == 0xFF) || (!(rdat & 0x0B))) && timeout++ < 200); // voltage value after calibration raddr = TRS55D_NORMAL_DATA1_MSB_R; TRS55D_IIC_Read (ADDR_TRS55D, raddr,&rbuf[0],3); co_printf("NORMAL_DATA1_MSB_R :%02X %02X %02X\r\n",rbuf[0],rbuf[1],rbuf[2]); vtp_cor.un.u8b2 = rbuf[0]; vtp_cor.un.u8b1 = rbuf[1]; vtp_cor.un.u8b0 =rbuf[2]; if (vtp_cor.un.u8b2 & 0x80) { vtp_cor.un.u8b3 = 0xFF; }else { vtp_cor.un.u8b3 = 0x00;// vtp after corrected } vtp_cor_f = (float)vtp_cor.i32/524288.0; vtp_cor_f *= 1000; // ambient temperature value after calibration raddr = TRS55D_NORMAL_TEMP_MSB_R; TRS55D_IIC_Read (ADDR_TRS55D,raddr,&rbuf[0],3); co_printf("NORMAL_TEMP_MSB_R :%02X %02X %02X\r\n",rbuf[0],rbuf[1],rbuf[2]); tamb_cal.un.u8b2 = rbuf[0]; tamb_cal.un.u8b1 =rbuf[1]; tamb_cal.un.u8b0 =rbuf[2]; tambf = (float)tamb_cal.i32 / 16384.0; // ambient temperature // object(surface) temperature after calibration raddr = TRS55D_NORMAL_Tobj_MSB_R; TRS55D_IIC_Read (ADDR_TRS55D,raddr,&rbuf[0],3); tobj.un.u8b2 = rbuf[0]; tobj.un.u8b1 = rbuf[1]; tobj.un.u8b0 =rbuf[2]; tobjf = (float)tobj.i32 / 16384.0; sprintf(buffer, "tambf = %.2f, vtp_cor = %.2f, tobj = %.2f, tbdy = %.2f\r\n",tambf,vtp_cor_f,tobjf,tbdyf); co_printf("%s \r\n",buffer); //co_printf("tambf:%.2f vtp_cor_f:%.2f tobjf:%.2f \r\n",tambf,vtp_cor_f,tobjf); // object(surface) temperature // get bodytemp //tbdyf = get_body_temp(tambf,tobjf); // get bodytemp // display on uart // sprintf(buffer, "tamb = %.2f, vtp_cor = %.2f, tobj = %.2f, tbdy = %.2f\r\n",\tambf,vtp_cor_f,tobjf,tbdyf); //uartSendString(buffer); // display on oled /* float vals[4] = {tambf, vtp_cor_f, tobjf, tbdyf+0.05}; OLED_ShowBNum(64, 0, vals[0], 4, 16, 1); // Tamb OLED_ShowBNum(48, 16, vals[1], 6, 16, 1); // vtp OLED_ShowString(112,16,"uv",16, 1); OLED_ShowBNum(64, 32, vals[2], 4, 16, 1); // Tobj OLED_ShowBNum(64, 48, vals[3], 4, 16, 1); // Tbdy */ //}*/