hehung

  • 2019-08-17
  • 发表了主题帖: X-nucleo-iks01A3应用--使用Lis2DW12加速度计计算角度

    前面已经通过LPC11U68成功对对传感器板子的各种传感器进行了通信,现在就利用其中的加速度传感器计算一下角度。   通信就不多说了,了一参考我之前的帖子:http://www.538.322ib.com/forum.php?mod=viewthread&tid=1085961&extra=   这里只是利用公式简单的将加速度值转换成了角度,因为没有加速度计和磁场传感器的补偿,所以会存在一些误差,对于精度要求不是很高的条件下已经完全可以使用了。     代码如下: void CalculateAngle(void) { int x_g = Get_X_LIS2DW12(); int y_g = Get_Y_LIS2DW12(); int z_g = Get_Z_LIS2DW12(); double x_coordinate = 0; double y_coordinate = 0; double z_coordinate = 0; z_coordinate = tan(sqrt(x_g*x_g+y_g*y_g)/(double)z_g) * 180 / 3.14; x_coordinate = tan((double)x_g/sqrt(y_g*y_g+z_g*z_g)) * 180 / 3.14; y_coordinate = tan((double)y_g/sqrt(x_g*x_g+z_g*z_g)) * 180 / 3.14; DEBUGOUT("X:%.2f | Y:%.2f | Z:%.2f \r\n",x_coordinate,y_coordinate,z_coordinate); }     效果如下,通过转动传感器,可以正常读取角度,存在2度左右的偏差: 此内容由EEWORLD论坛网友hehung原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-08-11
  • 发表了主题帖: LPC11U68驱动X-NUCLEO-IKS01A3

    今天尝试使用恩智浦的芯片LPC11U68来驱动该芯片,目前已经驱动成功,可以正常的读取出数据。 6个传感器的数据均可以正常的获取。   还是通过模拟IIC进行驱动的,后面会附上代码:   如下图所示,lpc11U68的板子也是arduino封装的,可以与X-NUCLEO-IKS01A3板子完美结合使用。 所有获取的数据都是通过串口返回的,如下图所示: 首先是初始化: 如下是获取的数据:   代码工程:     此内容由EEWORLD论坛网友hehung原创,如需转载或用于商业用途需征得作者同意并注明出处  

  • 发表了日志: LPC11U68驱动X-NUCLEO-IKS01A3

  • 回复了主题帖: 操作lis25ba返回的寄存器数值不对

    littleshrimp 发表于 2019-8-11 13:03 下边是gd32的资料,输入高电平最小要0.7*VDD,供电电压如果是3.3V 最小需要2.31V的输入才认为是高电平 ...
    谢谢大佬的讲解,明白了。

  • 回复了主题帖: 操作lis25ba返回的寄存器数值不对

    littleshrimp 发表于 2019-8-11 11:06 应该不会,i/o电平转换也使用的iks01a3?
    没有,IO的电平转换用的是板子上面的,应该是3,3V,会是这个原因吗?IO的电平转换也需要使用1.8V的,如果是这样的话就有一点麻烦了

  • 回复了主题帖: 操作lis25ba返回的寄存器数值不对

    dcexpert 发表于 2019-8-10 21:17 电压千万不要错了,不然会有问题。正常情况读取WHO_AM_I是没有问题的。
    估计是有一些问题,我还要在看看

  • 回复了主题帖: 操作lis25ba返回的寄存器数值不对

    littleshrimp 发表于 2019-8-10 20:43 供电电压和引脚电平做处理了吗?工作电压是1.71V~1.99V
    我是直接用的x-nucle0-iks01a3这个板子上面的1.8V的电压进行供电的,因为手头也没有1.8V的稳压,这样供电不行吗?会导致电流太小吗。

  • 2019-08-10
  • 发表了主题帖: 操作lis25ba返回的寄存器数值不对

    今天试了一下lis25ba,使用GD32F350的模拟IIC,操作x-nucle0-iks01a3是可以的。 按照操作手册上来,如下图: 读取设备的ID,应该返回00100000B,也就是0x20,但是实际上返回的是1f 还有下面的几个寄存器我都读了一下,感觉返回的都不对。     是板子的问题还是IIC总线的问题? 但是我的IIC总线操作x-nucle0-iks01a3是可以的呀?  

  • 发表了主题帖: GD32F350Rx驱动X-NUCLEO-IKS01A3

    本帖最后由 hehung 于 2019-8-10 13:05 编辑 手头还有一个兆易创新的板子GD32F350,这次尝试对这个板子进行传感器数据的采集,其实和前面写的GD32E231是以严格的,采用了模拟IIC的方式,但是这个板子有一个好处就是,传感器板子和单片机可以直插。如图:     最后会附上附件,有代码。这里就不做过多的解释了,可以参考我之前的帖子。 GD32E231模拟IIC驱动STTS751 GD32E231模拟IIC驱动LPS22HH GD32E231模拟IIC驱动HTS221 GD32E231模拟IIC驱动LIS2MDL GD32E231模拟IIC驱动LIS2DW12 GD32E231模拟IIC驱动LSM6DSO   GD32F350和GD32E231的模拟IIC还是存在一些差别的,如果直接拿来用的话,双方都不能通用,这个需要注意一下。   如下图是初始化的数据,我也不知道是什么原因导致了压力传感器总是连接不上,难道被我搞坏了????   如下图是其他传感器获取的数据:   有一些数据处理的不正确,导致显示的有问题。 下面是我的代码,代码存在众多的bugs,请包涵。       此内容由EEWORLD论坛网友hehung原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-08-03
  • 回复了主题帖: GD32E231模拟IIC驱动HTS221

    dcexpert 发表于 2019-8-3 17:47 传感器的T0/T1两组寄存器,给出了预先标定的数据。传感器测量出的数据,需要根据T0/T1进行线性插值,计算后 ...
    多谢赐教,这个地方我还需要在研究研究,谢谢

  • 回复了主题帖: GD32E231模拟IIC驱动LIS2MDL

    多谢赐教

  • 发表了日志: GD32E231模拟IIC驱动LSM6DSO

  • 发表了主题帖: GD32E231模拟IIC驱动LSM6DSO

    最后一个传感器LSM6DUO 6轴加速度计和陀螺仪传感器。   原理图,IIC地址是0xD6: 寄存器: 这个传感器的寄存器很多,打那是其中使用的比较少。     下面例举一些常用的。 WHO-AM_I寄存器: 控制寄存器1: 设置频率,这个需要设置,我设置的是0x10.     控制寄存器2,也需要设置,我设置的是0x12.       温度输出寄存器,没有具体的说明,不知道采集的温度怎样换算     加速度传感器输出寄存器:   陀螺仪输出传感器:   代码: 初始化: //初始化传感器LSM6DSO if(0 == Set_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_CTRL1_XL, 0x10)) { send_str((unsigned char *)"IF_CTRL set successful\r\n"); } else { send_str((unsigned char *)"IF_CTRL set fail\r\n"); } if(0 == Set_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_CTRL2_G, 0x12)) { send_str((unsigned char *)"IF_CTRL set successful\r\n"); } else { send_str((unsigned char *)"IF_CTRL set fail\r\n"); }   寄存器操作和串口发送数据: //LSM6DSO写 static int IIC_WrDat_LSM6DSO(uint8_t IIC_Add, uint8_t IIC_Reg, uint8_t IIC_Data) { uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Reg); //write data ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Data); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Stop(); return 0; } //LSM6DSO读 static int IIC_Read_LSM6DSO(uint8_t IIC_Add, uint8_t IIC_Reg) { int ret; uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Reg); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Start(); IIC_Send_Byte(IIC_Add | 0x01); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} ret=IIC_Read_Byte(0); IIC_Stop(); return ret; } //LSM6DSO读2个寄存器 static int IIC_Read2_LSM6DSO(uint8_t IIC_Add, uint8_t IIC_Reg) { int ret; uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Reg); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Start(); IIC_Send_Byte(IIC_Add | 0x01); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} ret=IIC_Read_Byte(1); ret=(IIC_Read_Byte(0)<<8)|ret; IIC_Stop(); return ret; } //设置寄存器 int Set_Reg_LSM6DSO(uint8_t add, uint8_t reg, uint8_t dat) { int ret_succ = -1; uint8_t i = 20u; //失败之后尝试的次数 do{ if(0 == IIC_WrDat_LSM6DSO(add, reg, dat)) { ret_succ = 0; //设置成功 break; } else { i--; //获取失败,再次尝试 } }while(i>0u); return ret_succ; } //读取寄存器 int Get_Reg_LSM6DSO(uint8_t add, uint8_t reg) { uint8_t i = 20u; int ret_get = -1; do{ ret_get = IIC_Read_LSM6DSO(add, reg); if(-1 != ret_get) { break; //获取数据成功 } else { i--; //获取失败,再次尝试 } }while(i>0u); return ret_get; } //读取我是谁 int Get_WHO_AM_I_LSM6DSO(void) { return Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_WHO_AM_I); } //获取状态寄存器 int Get_Status_LSM6DSO(void) { return Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_CFG_STATUS); } float Get_Temp_LSM6DSO(void) { return (Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_TEMP_H)<<8)|Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_TEMP_L); } short Get_X_G_LSM6DSO(void) { return ((Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_OUT_X_H_G)<<8)|Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_OUT_X_L_G)); } short Get_Y_G_LSM6DSO(void) { return ((Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_OUT_Y_H_G)<<8)|Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_OUT_Y_L_G)); } short Get_Z_G_LSM6DSO(void) { return ((Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_OUT_Z_H_G)<<8)|Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_OUT_Z_L_G)); } short Get_X_A_LSM6DSO(void) { return ((Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_OUT_X_H_A)<<8)|Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_OUT_X_L_A)); } short Get_Y_A_LSM6DSO(void) { return ((Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_OUT_Y_H_A)<<8)|Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_OUT_Y_L_A)); } short Get_Z_A_LSM6DSO(void) { return ((Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_OUT_Z_H_A)<<8)|Get_Reg_LSM6DSO(LSM6DSO_ADDR_W_1, LSM6DSO_OUT_Z_L_A)); } //发送数据到串口 void Send_Uart_LSM6DSO(void) { char str[35] = {0}; send_str((uint8_t *)"<-----------START--------->\r\n"); sprintf(str,"G_X:%d | G_Y:%d | G_Z:%d\r\n", Get_X_G_LSM6DSO(),Get_Y_G_LSM6DSO(),Get_Z_G_LSM6DSO()); send_str((uint8_t *)str); sprintf(str,"A_X:%d | A_Y:%d | A_Z:%d\r\n", Get_X_A_LSM6DSO(),Get_Y_A_LSM6DSO(),Get_Z_A_LSM6DSO()); send_str((uint8_t *)str); sprintf(str,"Temp:%.2f\r\n", Get_Temp_LSM6DSO()); send_str((uint8_t *)str); sprintf(str,"Who_am_i:%X\r\n",Get_WHO_AM_I_LSM6DSO()); send_str((uint8_t *)str); send_str((uint8_t *)"<------------END---------->\r\n\n"); }     宏定义: #define LSM6DSO_FUNC_CFG_ACCESS (0x01U) #define LSM6DSO_PIN_CTRLs (0x02U) #define LSM6DSO_COUNTER_BDR_REG1 (0x0BU) #define LSM6DSO_COUNTER_BDR_REG2 (0x0CU) #define LSM6DSO_WHO_AM_I (0x0FU) #define LSM6DSO_CTRL1_XL (0x10U) #define LSM6DSO_CTRL2_G (0x11U) #define LSM6DSO_CTRL3_C (0x12U) #define LSM6DSO_CTRL4_C (0x13U) #define LSM6DSO_CTRL5_C (0x14U) #define LSM6DSO_CTRL6_G (0x15U) #define LSM6DSO_CTRL7_G (0x16U) #define LSM6DSO_CTRL8_XL (0x17U) #define LSM6DSO_CTRL9_XL (0x18U) #define LSM6DSO_CTRL10_C (0x19U) #define LSM6DSO_CFG_STATUS (0x1EU) #define LSM6DSO_TEMP_L (0x20U) #define LSM6DSO_TEMP_H (0x21U) #define LSM6DSO_OUT_X_L_G (0x22U) #define LSM6DSO_OUT_X_H_G (0x23U) #define LSM6DSO_OUT_Y_L_G (0x24U) #define LSM6DSO_OUT_Y_H_G (0x25U) #define LSM6DSO_OUT_Z_L_G (0x26U) #define LSM6DSO_OUT_Z_H_G (0x27U) #define LSM6DSO_OUT_X_L_A (0x28U) #define LSM6DSO_OUT_X_H_A (0x29U) #define LSM6DSO_OUT_Y_L_A (0x2AU) #define LSM6DSO_OUT_Y_H_A (0x2BU) #define LSM6DSO_OUT_Z_L_A (0x2CU) #define LSM6DSO_OUT_Z_H_A (0x2DU) /*IIC slave address write and read*/ /*SD0 connect to power supply*/ #define LSM6DSO_ADDR_W_1 0xD6U #define LSM6DSO_ADDR_R_1 0xD7U   数据输出效果:        

  • 发表了日志: GD32E231模拟IIC驱动LIS2DW12

  • 发表了主题帖: GD32E231模拟IIC驱动LIS2DW12

    继续玩加速度传感器LIS2DW12。 主要是获取3个轴的重力加速度。   看原理图,这个是连接在IIC2上面的,但是使用IIC1的接口也是可以使用的,因为IIC和IIC2都连接在了一个总线上,是可以通用的: 上图中可以看到IIC地址是0x32   寄存器,该芯片的寄存器较多。   其中主要使用到的寄存器在下面: 不知道为什么,提供了两个温度寄存器,一个是12bit的,还有一个是8bit的。这两个的寄存器如下。 12bit: 温度寄存器第4为没用,所以读出来的值需要除以16,看下面的说明16LBS/℃,寄存器值全0的时候是25摄氏度,所以实际值是25+寄存器值/16/16.     8bit: 寄存器的值全0的时候是25℃,没1LBS是1℃,所以温度值为25+寄存器值。   Who_am_i寄存器:   控制寄存器1:       状态寄存器: XYZ输出寄存器:   代码: 初始化: //初始化传感器LIS2DW12 if(0 == Set_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_CTRL1, 0x16)) { send_str((unsigned char *)"IF_CTRL set successful\r\n"); } else { send_str((unsigned char *)"IF_CTRL set fail\r\n"); }   寄存器操作和串口发送数据:   //LIS2DW12写 static int IIC_WrDat_LIS2DW12(uint8_t IIC_Add, uint8_t IIC_Reg, uint8_t IIC_Data) { uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Reg); //write data ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Data); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Stop(); return 0; } //LIS2DW12读 static int IIC_Read_LIS2DW12(uint8_t IIC_Add, uint8_t IIC_Reg) { int ret; uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Reg); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Start(); IIC_Send_Byte(IIC_Add | 0x01); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} ret=IIC_Read_Byte(0); IIC_Stop(); return ret; } //LIS2DW12读2个寄存器 static int IIC_Read2_LIS2DW12(uint8_t IIC_Add, uint8_t IIC_Reg) { int ret; uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Reg); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Start(); IIC_Send_Byte(IIC_Add | 0x01); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} ret=IIC_Read_Byte(1); ret=(IIC_Read_Byte(0)<<8)|ret; IIC_Stop(); return ret; } //设置寄存器 int Set_Reg_LIS2DW12(uint8_t add, uint8_t reg, uint8_t dat) { int ret_succ = -1; uint8_t i = 20u; //失败之后尝试的次数 do{ if(0 == IIC_WrDat_LIS2DW12(add, reg, dat)) { ret_succ = 0; //设置成功 break; } else { i--; //获取失败,再次尝试 } }while(i>0u); return ret_succ; } //读取寄存器 int Get_Reg_LIS2DW12(uint8_t add, uint8_t reg) { uint8_t i = 20u; int ret_get = -1; do{ ret_get = IIC_Read_LIS2DW12(add, reg); if(-1 != ret_get) { break; //获取数据成功 } else { i--; //获取失败,再次尝试 } }while(i>0u); return ret_get; } //读取我是谁 int Get_WHO_AM_I_LIS2DW12(void) { return Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_REG_WHO_AM_I); } //获取状态寄存器 int Get_Status_LIS2DW12(void) { return Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_CFG_STATUS); } float Get_Temp_1_LIS2DW12(void) { short temp_reg = (Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_T_H)<<8)|Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_T_L); float temp_cal = 0.0f; temp_cal = 25.0+temp_reg/16.0/16.0; return temp_cal; } signed char Get_Temp_2_LIS2DW12(void) { return (25+(Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_T))); } short Get_X_LIS2DW12(void) { return ((Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_X_H)<<8)|Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_X_L)); } short Get_Y_LIS2DW12(void) { return ((Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_Y_H)<<8)|Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_Y_L)); } short Get_Z_LIS2DW12(void) { return ((Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_Z_H)<<8)|Get_Reg_LIS2DW12(LIS2DW12_ADDR_W_1, LIS2DW12_OUT_Z_L)); } //发送数据到串口 void Send_Uart_LIS2DW12(void) { char str[35] = {0}; send_str((uint8_t *)"<-----------START--------->\r\n"); sprintf(str,"X:%d | Y:%d | Z:%d\r\n", Get_X_LIS2DW12(),Get_Y_LIS2DW12(),Get_Z_LIS2DW12()); send_str((uint8_t *)str); sprintf(str,"Temp:%.2f℃ | %d℃\r\n", Get_Temp_1_LIS2DW12(),Get_Temp_2_LIS2DW12()); send_str((uint8_t *)str); sprintf(str,"Status:0x%X\r\n", Get_Status_LIS2DW12()); send_str((uint8_t *)str); sprintf(str,"Who_am_i:%X\r\n",Get_WHO_AM_I_LIS2DW12()); send_str((uint8_t *)str); send_str((uint8_t *)"<------------END---------->\r\n\n"); }     显示效果:      

  • 发表了日志: GD32E231模拟IIC驱动LIS2MDL

  • 发表了主题帖: GD32E231模拟IIC驱动LIS2MDL

    本帖最后由 hehung 于 2019-8-3 17:35 编辑 LIS2MDL是磁场传感器。 下面是原理图:   原理图中已经显示了IIC的地址是0x3C。   首先是查看数据手册:   寄存器汇总: 其中比较重要的几个寄存器: WHO_AM_I寄存器,身份识别寄存器:0x40:   配置寄存器CFG_REG_A:如果需要温度补偿,需要将bit7置位1,否则读取温度寄存器的值始终是0. 如果需要连续读取的话,需要将bit MD1,MD0设置成0,默认的是1,不然的话是处于idle模式,不会更新数据的。     XYZ输出数据寄存器,直接读取寄存器的值就行了。 注意:因为这个数据是带有正负号的,而且是16bit的,所以返回的数据类型一定要设置成short,不要设置成int型,不然都不到负数,short是16bit的类型,可以直接得到负号显示的。 温度寄存器,不知道为什么,显示的温度总是与实际温度差别很大,说是采取的内部温度,也不知道是一个什么温度值。 代码:   初始化: //初始化传感器LIS2MDL if(0 == Set_Reg_LIS2MDL(LIS2MDL_ADDR_W_1, LIS2MDL_CFG_A, 0x80)) { send_str((unsigned char *)"IF_CTRL set successful\r\n"); } else { send_str((unsigned char *)"IF_CTRL set fail\r\n"); } if(0 == Set_Reg_LIS2MDL(LIS2MDL_ADDR_W_1, LIS2MDL_CFG_C, 0x10)) { send_str((unsigned char *)"IF_CTRL set successful\r\n"); } else { send_str((unsigned char *)"IF_CTRL set fail\r\n"); }   数据采集与串口显示:: //LIS2MDL写 static int IIC_WrDat_LIS2MDL(uint8_t IIC_Add, uint8_t IIC_Reg, uint8_t IIC_Data) { uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Reg); //write data ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Data); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Stop(); return 0; } //LIS2MDL读 static int IIC_Read_LIS2MDL(uint8_t IIC_Add, uint8_t IIC_Reg) { int ret; uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Reg); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Start(); IIC_Send_Byte(IIC_Add | 0x01); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} ret=IIC_Read_Byte(0); IIC_Stop(); return ret; } //LIS2MDL读2个寄存器 static int IIC_Read2_LIS2MDL(uint8_t IIC_Add, uint8_t IIC_Reg) { int ret; uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Reg); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Start(); IIC_Send_Byte(IIC_Add | 0x01); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} ret=IIC_Read_Byte(1); ret=(IIC_Read_Byte(0)<<8)|ret; IIC_Stop(); return ret; } //设置寄存器 int Set_Reg_LIS2MDL(uint8_t add, uint8_t reg, uint8_t dat) { int ret_succ = -1; uint8_t i = 20u; //失败之后尝试的次数 do{ if(0 == IIC_WrDat_LIS2MDL(add, reg, dat)) { ret_succ = 0; //设置成功 break; } else { i--; //获取失败,再次尝试 } }while(i>0u); return ret_succ; } //读取寄存器 int Get_Reg_LIS2MDL(uint8_t add, uint8_t reg) { uint8_t i = 20u; int ret_get = -1; do{ ret_get = IIC_Read_LIS2MDL(add, reg); if(-1 != ret_get) { break; //获取数据成功 } else { i--; //获取失败,再次尝试 } }while(i>0u); return ret_get; } //读取我是谁 int Get_WHO_AM_I_LIS2MDL(void) { return Get_Reg_LIS2MDL(LIS2MDL_ADDR_W_1, LIS2MDL_REG_WHO_AM_I); } //获取状态寄存器 int Get_Status_LIS2MDL(void) { return Get_Reg_LIS2MDL(LIS2MDL_ADDR_W_1, LIS2MDL_CFG_STATUS); } short GET_X_LIS2MDL(void) { return (Get_Reg_LIS2MDL(LIS2MDL_ADDR_W_1, LIS2MDL_OUTX_H)<<8)|(Get_Reg_LIS2MDL(LIS2MDL_ADDR_W_1, LIS2MDL_OUTX_L)); } short GET_Y_LIS2MDL(void) { return (Get_Reg_LIS2MDL(LIS2MDL_ADDR_W_1, LIS2MDL_OUTY_H)<<8)|(Get_Reg_LIS2MDL(LIS2MDL_ADDR_W_1, LIS2MDL_OUTY_L)); } short GET_Z_LIS2MDL(void) { return (Get_Reg_LIS2MDL(LIS2MDL_ADDR_W_1, LIS2MDL_OUTZ_H)<<8)|(Get_Reg_LIS2MDL(LIS2MDL_ADDR_W_1, LIS2MDL_OUTZ_L)); } short Get_Temp_LIS2MDL(void) { return (Get_Reg_LIS2MDL(LIS2MDL_ADDR_W_1, LIS2MDL_TEMP_H)<<8)|(Get_Reg_LIS2MDL(LIS2MDL_ADDR_W_1, LIS2MDL_TEMP_L)); } //发送数据到串口 void Send_Uart_LIS2MDL(void) { char str[35] = {0}; send_str((uint8_t *)"<-----------START--------->\r\n"); sprintf(str,"X:%d | Y:%d | Z:%d\r\n", GET_X_LIS2MDL(),GET_Y_LIS2MDL(),GET_Z_LIS2MDL()); send_str((uint8_t *)str); sprintf(str,"Temp:%d\r\n", Get_Temp_LIS2MDL()); send_str((uint8_t *)str); sprintf(str,"Status:0x%X\r\n", Get_Status_LIS2MDL()); send_str((uint8_t *)str); sprintf(str,"Who_am_i:%X\r\n",Get_WHO_AM_I_LIS2MDL()); send_str((uint8_t *)str); send_str((uint8_t *)"<------------END---------->\r\n\n"); }   宏定义: /*register address*/ #define LIS2MDL_OFFSET_X_REG_L (0x45U) #define LIS2MDL_OFFSET_X_REG_H (0x46U) #define LIS2MDL_OFFSET_Y_REG_L (0x47U) #define LIS2MDL_OFFSET_Y_REG_H (0x48U) #define LIS2MDL_OFFSET_Z_REG_L (0x49U) #define LIS2MDL_OFFSET_Z_REG_H (0x4AU) #define LIS2MDL_REG_WHO_AM_I (0x4FU) #define LIS2MDL_CFG_A (0x60U) #define LIS2MDL_CFG_B (0x61U) #define LIS2MDL_CFG_C (0x62U) #define LIS2MDL_CFG_INT_CTRL (0x63U) #define LIS2MDL_CFG_SOURCE (0x64U) #define LIS2MDL_CFG_THS_L (0x65U) #define LIS2MDL_CFG_THS_H (0x66U) #define LIS2MDL_CFG_STATUS (0x67U) #define LIS2MDL_OUTX_L (0x68U) #define LIS2MDL_OUTX_H (0x69U) #define LIS2MDL_OUTY_L (0x6AU) #define LIS2MDL_OUTY_H (0x6BU) #define LIS2MDL_OUTZ_L (0x6CU) #define LIS2MDL_OUTZ_H (0x6DU) #define LIS2MDL_TEMP_L (0x6EU) #define LIS2MDL_TEMP_H (0x6FU) /*IIC slave address write and read*/ /*SD0 connect to power supply*/ #define LIS2MDL_ADDR_W_1 0x3CU #define LIS2MDL_ADDR_R_1 0x3DU   显示结果,将板子转动成不同的状态和位置,可以显示不同数字:              

  • 发表了主题帖: GD32E231模拟IIC驱动HTS221

    HTS221是温湿度传感器。依然使用IIC操作。   原理图,如下,IIC地址0xBE:     寄存器: 这个芯片操作寄存器还是比较简单的,但是最开始的时候需要对芯片将进行设置. AV_CONF寄存器:这个可以根据自己的需求进行设置,我设置的是0x09: CTRL1寄存器:设置电源启动。我设置的是0x81. 上述的两个寄存器比较重要,需要设置一下。   Humidity读取寄存器,16位数据:   temperature读取寄存器,16位数据: : 芯片的标志:0xB3。 后面还有温度,湿度的计算补偿寄存器等,这个对计算温湿度很重要: 我看了一下这个,没太明白,所以我只对输出的温湿度寄存器进行了读取,显示的是16进制的数据,没有进行温湿度转换,需要转换的话是需要最后面的这些寄存器一起使用的,操作起来还是比较复杂的,所以暂时没有进行计算,等以后有时间了在慢慢弄,下面是补偿说明。     代码: 初始化: //初始化传感器LPS22HH if(0 == Set_Reg_HTS221(HTS221_ADDR_W_1, HTS221_AV_CONF, 0x09u)) //0x09 { send_str((unsigned char *)"IF_CTRL set successful\r\n"); } else { send_str((unsigned char *)"IF_CTRL set fail\r\n"); } if(0 == Set_Reg_HTS221(HTS221_ADDR_W_1, HTS221_REG_CTRL_1, 0x81u)) { send_str((unsigned char *)"CTRL_1 set successful\r\n"); } else { send_str((unsigned char *)"CTRL_1 set fail\r\n"); }   //HTS221写 static int IIC_WrDat_HTS221(uint8_t IIC_Add, uint8_t IIC_Reg, uint8_t IIC_Data) { uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Reg); //write data ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Data); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Stop(); return 0; } //HTS221读 static int IIC_Read_HTS221(uint8_t IIC_Add, uint8_t IIC_Reg) { int ret; uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Send_Byte(IIC_Reg); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} IIC_Start(); IIC_Send_Byte(IIC_Add | 0x01); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {IIC_Stop();return -1;} ret=IIC_Read_Byte(1); IIC_Stop(); return ret; } //设置寄存器 int Set_Reg_HTS221(uint8_t add, uint8_t reg, uint8_t dat) { int ret_succ = -1; uint8_t i = 20u; //失败之后尝试的次数 do{ if(0 == IIC_WrDat_HTS221(add, reg, dat)) { ret_succ = 0; //设置成功 break; } else { i--; //获取失败,:再次尝试 } }while(i>0u); return ret_succ; } //读取寄存器 int Get_Reg_HTS221(uint8_t add, uint8_t reg) { uint8_t i = 20u; int ret_get = -1; do{ ret_get = IIC_Read_HTS221(add, reg); if(-1 != ret_get) { break; //获取数据成功 } else { i--; //获取失败,再次尝试 } }while(i>0u); return ret_get; } //读取我是谁 int Get_WHO_AM_I_HTS221(void) { return Get_Reg_HTS221(HTS221_ADDR_W_1, HTS221_REG_WHO_AM_I); } //获取状态寄存器 int Get_Status_HTS221(void) { return Get_Reg_HTS221(HTS221_ADDR_W_1, HTS221_REG_STATUS); } //获取压力值L int Get_Humidity_L_HTS221(void) { return Get_Reg_HTS221(HTS221_ADDR_W_1, HTS221_REG_HUMI_OUT_L); } //获取压力值H int Get_Humidity_H_HTS221(void) { return Get_Reg_HTS221(HTS221_ADDR_W_1, HTS221_REG_HUMI_OUT_H); } float Get_Humidity_HTS221(void) { static float Last_return_p = 0.0f; int get_p; if((Get_Humidity_H_HTS221() != -1) &&(Get_Humidity_L_HTS221() != -1)) { get_p = (Get_Humidity_H_HTS221()<<8)|(Get_Humidity_L_HTS221()); //Last_return_p = ((float)get_p / 4096.0f); Last_return_p = get_p; } else { } return Last_return_p; } //获取温度值H int Get_Temp_L_HTS221(void) { return Get_Reg_HTS221(HTS221_ADDR_W_1, HTS221_REG_TEMP_OUT_L); } //获取温度值H int Get_Temp_H_HTS221(void) { return Get_Reg_HTS221(HTS221_ADDR_W_1, HTS221_REG_TEMP_OUT_H); } float Get_Temp_HTS221(void) { static float Last_return_t = 0.0f; int get_t; if((Get_Temp_H_HTS221() != -1) &&(Get_Temp_L_HTS221() != -1)) { get_t = (Get_Temp_H_HTS221()<<8)|(Get_Temp_L_HTS221()); // Last_return_t = ((float) get_t / 100.0f); Last_return_t = get_t; } else { } return Last_return_t; } //发送数据到串口 void Send_Uart_HTS221(void) { char str[35] = {0}; send_str((uint8_t *)"<-----------START--------->\r\n"); sprintf(str,"Humidity:%X\r\n", (int)Get_Humidity_HTS221()); send_str((uint8_t *)str); sprintf(str,"Temp:%X\r\n", (int)Get_Temp_HTS221()); send_str((uint8_t *)str); sprintf(str,"Who_am_i:%X\r\n",Get_WHO_AM_I_HTS221()); send_str((uint8_t *)str); send_str((uint8_t *)"<------------END---------->\r\n\n"); } //显示数据到OLED void OLED_Display_HTS221(void) { char str_dis1[20], str_dis2[20], str_dis3[20]; OLED_Clear(); sprintf(str_dis1,"Pressure:%.2f\r\n", Get_Humidity_HTS221()); sprintf(str_dis2,"Temp:%.2f\r\n", Get_Temp_HTS221()); sprintf(str_dis3,"Who_am_i:%X\r\n",Get_WHO_AM_I_HTS221()); OLED_ShowString(0,16,(uint8_t *)str_dis1,16,1); OLED_ShowString(0,32,(uint8_t *)str_dis2,16,1); OLED_ShowString(0,48,(uint8_t *)str_dis3,16,1); OLED_Refresh_Gram(); }   宏定义: /*register address*/ #define HTS221_REG_WHO_AM_I (0x0FU) #define HTS221_AV_CONF (0x10U) #define HTS221_REG_CTRL_1 (0x20U) #define HTS221_REG_CTRL_2 (0x21U) #define HTS221_REG_CTRL_3 (0x22U) #define HTS221_REG_STATUS (0x27U) #define HTS221_REG_HUMI_OUT_L (0x28U) #define HTS221_REG_HUMI_OUT_H (0x29U) #define HTS221_REG_TEMP_OUT_L (0x2AU) #define HTS221_REG_TEMP_OUT_H (0x2BU) #define HTS221_REG_H0_rH_x2 (0x30U) #define HTS221_REG_H1_rH_x2 (0x31U) #define HTS221_REG_T0_degC_x8 (0x32U) #define HTS221_REG_T1_degC_x8 (0x33U) #define HTS221_REG_T1_T0 (0x35U) #define HTS221_REG_H0_T0_OUT1 (0x36U) #define HTS221_REG_H0_T0_OUT2 (0x37U) #define HTS221_REG_H1_T0_OUT1 (0x3AU) #define HTS221_REG_H1_T0_OUT2 (0x3BU) #define HTS221_REG_T0_OUT1 (0x3CU) #define HTS221_REG_T0_OUT2 (0x3DU) #define HTS221_REG_T1_OUT1 (0x3EU) #define HTS221_REG_T1_OUT2 (0x3FU) /*IIC slave address write and read*/ #define HTS221_ADDR_W_1 0xBEU #define HTS221_ADDR_R_1 0xBFU   效果展示: 上面已经说了,我没有对采集的数据做计算,只展示了获取的寄存器的信息:      

  • 回复了主题帖: GD32E231模拟IIC驱动LPS22HH

    dcexpert 发表于 2019-8-3 13:20 手放在传感器上 不是压力引起变化 而是温度变化会影响内部补偿
    多谢指正

  • 发表了主题帖: GD32E231模拟IIC驱动LPS22HH

    上周尝试了STTS7551温度传感器(传送门:GD32E231模拟IIC驱动STTS751),之后就开始尝试LPS22HH传感器。 从原理图上面看都是连接在同样的IIC总线上的,都是IIC1,但是使用同样的程序修改了地址止之后始终都运行不了,如下图:   使用stts751一样的程序,修改了地址和寄存器名字之后就是用不了了,这个问题困扰了我好几天,最后实在没办法就按照下图的方式将传感器和单片机相应的引脚都连接在一起之后发现可以正常的读取了。我也不知道是什么原因?有没高手给解答一下?   连接图如下,线接的有点乱,按照顺序接好就行了:   这个时候虽然可以正常的接收到数据了,但是又有了一个问题,我是没1s钟接收一次数据,但是数据时好时坏,就比如读取ID:B3,有时候可以正常的读取B3,有时候就读取不出来,我的IIC通信应该是没有问题的呀,应该连接的OLED是正常的显示的,没有显示过错误,而且上次使用STTS7551的时候也是正常的,不知道原因出在哪里,期望得到高手的解答,谢谢   寄存器总数: 其中需要进行设置,参考寄存器: 控制寄存器IF_CTRL,这个寄存器设置IIC操作的,我设置的值是0x1A,也就是设置了上拉电阻和使用的I2C 寄存器WHO_AM_I,这个寄存器是身份识别的,为0xB3   控制寄存器CTRL_REG1,这个需要设置一下,需要将ODR[2:0]设置一下,不然的话只能用触发的方式获取数据,我这是的001,每一秒钟更新一次数据。   获取压力数据的寄存器,压力数据是24为的,直接获取三位寄存器的值在进行计算就行了,Get_Pressure_H_LPS22HH()<<16)|(Get_Pressure_L_LPS22HH()<<8)|(Get_Pressure_XL_LPS22HH()   获取温度数据也是一样的,温度数据是16位的,需要除以100,才是正常的温度值:(Get_Temp_H_LPS22HH()<<8)|(Get_Temp_L_LPS22HH())     读写IIC: //LPS22HH写 static int IIC_WrDat_LPS22HH(uint8_t IIC_Add, uint8_t IIC_Reg, uint8_t IIC_Data) { uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {return -1;} IIC_Send_Byte(IIC_Reg); //write data ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {return -1;} IIC_Send_Byte(IIC_Data); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {return -1;} IIC_Stop(); return 0; } //LPS22HH读 static int IIC_Read_LPS22HH(uint8_t IIC_Add, uint8_t IIC_Reg) { int ret; uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {return -1;} IIC_Send_Byte(IIC_Reg); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {return -1;} IIC_Start(); IIC_Send_Byte(IIC_Add | 0x01); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {return -1;} ret=IIC_Read_Byte(1); IIC_Stop(); return ret; }     介于上面读取的数据时好时坏,所以我对最后的读取数据和设置数据的代码改变了一下,不再是直接的简单的读取,增加了判断,如果读取的数据不正确的话,就在读取,知道连续20次读取出错之后才会退出,如下: 修改的读写操作: //设置寄存器 int Set_Reg_LPS22HH(uint8_t add, uint8_t reg, uint8_t dat) { int ret_succ = -1; uint8_t i = 20u; //失败之后尝试的次数 do{ if(0 == IIC_WrDat_LPS22HH(add, reg, dat)) { ret_succ = 0; //设置成功 break; } else { i--; //获取失败,再次尝试 } }while(i>0u); return ret_succ; } //读取寄存器 int Get_Reg_LPS22HH(uint8_t add, uint8_t reg) { uint8_t i = 20u; int ret_get = -1; do{ ret_get = IIC_Read_LPS22HH(add, reg); if(-1 != ret_get) { break; //获取数据成功 } else { i--; //获取失败,再次尝试 } }while(i>0u); return ret_get; }   寄存器的操作: //读取我是谁 int Get_WHO_AM_I_LPS22HH(void) { return Get_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_WHO_AM_I); } //获取状态寄存器 int Get_Status_LPS22HH(void) { return Get_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_STATUS); } //获取压力值XL int Get_Pressure_XL_LPS22HH(void) { return Get_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_PRE_OUT_XL); } //获取压力值L int Get_Pressure_L_LPS22HH(void) { return Get_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_PRE_OUT_L); } //获取压力值H int Get_Pressure_H_LPS22HH(void) { return Get_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_PRE_OUT_H); } float Get_Pressure(void) { static float Last_return_p = 0.0f; int get_p; if((Get_Pressure_H_LPS22HH() != -1) &&(Get_Pressure_L_LPS22HH() != -1) &&(Get_Pressure_XL_LPS22HH() != -1)) { get_p = (Get_Pressure_H_LPS22HH()<<16)|(Get_Pressure_L_LPS22HH()<<8)|(Get_Pressure_XL_LPS22HH()); Last_return_p = ((float)get_p / 4096.0f); } else { } return Last_return_p; } //获取温度值H int Get_Temp_L_LPS22HH(void) { return Get_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_TEMP_OUT_L); } //获取温度值H int Get_Temp_H_LPS22HH(void) { return Get_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_TEMP_OUT_H); } float Get_Temp(void) { static float Last_return_t = 0.0f; int get_t; if((Get_Temp_H_LPS22HH() != -1) &&(Get_Temp_L_LPS22HH() != -1)) { get_t = (Get_Temp_H_LPS22HH()<<8)|(Get_Temp_L_LPS22HH()); Last_return_t = ((float) get_t / 100.0f); } else { } return Last_return_t; }   初始化LPS22HH: //初始化传感器LPS22HH if(0 == Set_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_IF_CTRL, 0x1A)) { send_str((unsigned char *)"IF_CTRL set successful\r\n"); } else { send_str((unsigned char *)"IF_CTRL set fail\r\n"); } if(0 == Set_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_CTRL_1, 0x18)) { send_str((unsigned char *)"CTRL_1 set successful\r\n"); } else { send_str((unsigned char *)"CTRL_1 set fail\r\n"); }     串口发送数据和OLED显示: //发送数据到串口 void Send_Uart_LPS22HH(void) { char str[35] = {0}; send_str((uint8_t *)"<-----------START--------->\r\n"); sprintf(str,"Pressure:%f\r\n", Get_Pressure()); send_str((uint8_t *)str); sprintf(str,"Temp:%f\r\n", Get_Temp()); send_str((uint8_t *)str); sprintf(str,"Who_am_i:%X\r\n",Get_WHO_AM_I_LPS22HH()); send_str((uint8_t *)str); send_str((uint8_t *)"<------------END---------->\r\n\n"); } //显示数据到OLED void OLED_Display_LPS22HH(void) { char str_dis1[20], str_dis2[20], str_dis3[20]; OLED_Clear(); sprintf(str_dis1,"Pressure:%.2f\r\n", Get_Pressure()); sprintf(str_dis2,"Temp:%.2f\r\n", Get_Temp()); sprintf(str_dis3,"Who_am_i:%X\r\n",Get_WHO_AM_I_LPS22HH()); OLED_ShowString(0,16,(uint8_t *)str_dis1,16,1); OLED_ShowString(0,32,(uint8_t *)str_dis2,16,1); OLED_ShowString(0,48,(uint8_t *)str_dis3,16,1); OLED_Refresh_Gram(); }   .h文件中的宏定义:   #define LPS22HH_REG_INT_CFG (0x0BU) #define LPS22HH_REG_THS_P_L (0x0CU) #define LPS22HH_REG_THS_P_H (0x0DU) #define LPS22HH_REG_IF_CTRL (0x0EU) #define LPS22HH_REG_WHO_AM_I (0x0FU) #define LPS22HH_REG_CTRL_1 (0x10U) #define LPS22HH_REG_CTRL_2 (0x11U) #define LPS22HH_REG_CTRL_3 (0x12U) #define LPS22HH_REG_REF_P_L (0x15U) #define LPS22HH_REG_REF_P_H (0x16U) #define LPS22HH_REG_RPDS_L (0x18U) #define LPS22HH_REG_RPDS_H (0x19U) #define LPS22HH_REG_INT_SOURCE (0x24U) #define LPS22HH_REG_STATUS (0x27U) #define LPS22HH_REG_PRE_OUT_XL (0x28U) #define LPS22HH_REG_PRE_OUT_L (0x29U) #define LPS22HH_REG_PRE_OUT_H (0x2AU) #define LPS22HH_REG_TEMP_OUT_L (0x2BU) #define LPS22HH_REG_TEMP_OUT_H (0x2CU) /*IIC slave address write and read*/ /*SD0 connect to power supply*/ #define LPS22HH_ADDR_W_1 0xBAU #define LPS22HH_ADDR_R_1 0xBBU /*SD0 connect to ground*/ #define LPS22HH_ADDR_W_0 0xB8U #define LPS22HH_ADDR_R_0 0xB9U   显示效果:   用手按在lps22HH压力传感器上面可以增大压力 传感器的位置:   增大的压力数据:        

最近访客

< 1/2 >

统计信息

已有30人来访过

  • 芯币:153
  • 好友:--
  • 主题:21
  • 回复:34
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 |


现在还没有留言

捕魚遊戲好評內容大全 917msc.com 286sb.com 抓赌有提成登入 全球十大博彩公司网上娱乐场
博彩现金赌博网站登入