OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5000|回复: 6

请教一下大家,关于库函数代码向HAL库函数移植的问题

[复制链接]

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2018-3-26
在线时间
287 小时
发表于 2022-9-6 11:16:40 | 显示全部楼层 |阅读模式
10金钱
请教一下大家,关于库函数代码向HAL库函数移植的问题,我现在用32单片机采集LSM6DS3的数据,使用库函数已经采集成功了,但是用HAL库函数实现,输出不正常,传感器寄存器配置方面都一样,大家帮我看一下
这是库函数的
  1. void Lsm_Init_iic(void)                                                                             //IICD-òé
  2. {

  3.        
  4.                                                      //???12.5hz,2000dps
  5.                                           //?????X,Y,Z?
  6.     LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_CTRL2_G,0X1C);   
  7. LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_CTRL10_C,0x38);


  8.          LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_CTRL1_XL,0x40);
  9.          
  10.                 LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_TAP_CFG,0x90);
  11.                
  12.                 LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_WAKE_UP_DUR,0x00);
  13.                 LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_WAKE_UP_THS,0x02);
  14.                 LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_MD1_CFG,0x20);
  15.                 //6D Orientation Configuration   ¸ù¾YDèÇó×ÔDDìí¼ó  £¨Õy·′ÃæÖμóD2îò죩
  16.                 LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_TAP_THS_6D,0x40);
  17.                 LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_CTRL8_XL,0x01);
  18.        
  19.         //        LSM_WriteOneByte(ACC_GYRO_ADDRESS,LSM6DSL_INT1_CTRL,0x03); //¼óËù¶è¼ÆíóÂYòÇ£¬INT1ê1Äü
  20. }


  21. //»ñ衼óËù¶èÖμ
  22. void Lsm_Get_Rawacc(void)                                                                             //IICD-òé
  23. {
  24.         short ax,ay,az;
  25.         uint8_t  buf[6];
  26.         if((LSM_ReadOneByte(ACC_GYRO_ADDRESS,LSM6DSL_STATUS_REG)&0x01)!=0)                              //óDêy¾Yéú3é
  27.         {

  28.                 buf[0]= LSM_ReadOneByte(ACC_GYRO_ADDRESSR,LSM6DSL_OUTX_H_XL);
  29.                 buf[1]= LSM_ReadOneByte(ACC_GYRO_ADDRESSR,LSM6DSL_OUTX_L_XL);
  30.                 buf[2]= LSM_ReadOneByte(ACC_GYRO_ADDRESSR,LSM6DSL_OUTY_H_XL);
  31.                 buf[3]= LSM_ReadOneByte(ACC_GYRO_ADDRESSR,LSM6DSL_OUTY_L_XL);
  32.                 buf[4]= LSM_ReadOneByte(ACC_GYRO_ADDRESSR,LSM6DSL_OUTZ_H_XL);
  33.                 buf[5]= LSM_ReadOneByte(ACC_GYRO_ADDRESSR,LSM6DSL_OUTZ_L_XL);
  34.                 ax=(buf[0]<<8)|buf[1];
  35.                 ay=(buf[2]<<8)|buf[3];
  36.                 az=(buf[4]<<8)|buf[5];
  37.                 printf(" acceleration£o%d, %d, %d\n",ax,ay,az);
  38.           printf("\r\n");
  39.                 //delay_ms(10);
  40.         }
  41. }
复制代码
这是HAL库的,输出不对,没有反应
  1. void LSM6DS3_init(void)
  2. {
  3.         uint8_t pBuffer=0;
  4.        
  5.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
  6.         //High-performance model default(Controlled by CTRL6_C register)
  7.         pBuffer=0x1C;//Accelerometer ODR=104Hz,+/-16g,Anti-aliasing filter bandwidth:400Hz
  8.         HAL_I2C_Mem_Write(&hi2c1,LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW,LSM6DS3_CTRL2_G_REG,1,&pBuffer, 1, 0x2000);
  9.         pBuffer=0x38;//enable Accelerometer X,Y,Z
  10.         HAL_I2C_Mem_Write(&hi2c1,LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW,LSM6DS3_CTRL10_C_REG,1,&pBuffer, 1, 0x2000);
  11.         pBuffer=0x40;//enable accelerometer int1
  12.         HAL_I2C_Mem_Write(&hi2c1,LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW,LSM6DS3_CTRL1_XL_REG,1,&pBuffer, 1, 0x2000);
  13.        
  14.        
  15.        
  16.         pBuffer=0x90;//Angular:104hz(Lowpass filter)  500dps(full-scale,degree/s)
  17.         HAL_I2C_Mem_Write(&hi2c1,LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW,LSM6DS3_TAP_CFG_REG,1,&pBuffer, 1, 0x2000);
  18.        
  19.         pBuffer=0x00;//Gyroscope pitch axis (X.Y.Z) output enable.
  20.         HAL_I2C_Mem_Write(&hi2c1,LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW,LSM6DS3_WAKE_UP_DUR,1,&pBuffer, 1, 0x2000);
  21.         pBuffer=0x02;//enable Gyroscope int2
  22.         HAL_I2C_Mem_Write(&hi2c1,LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW,LSM6DS3_WAKE_UP_THS,1,&pBuffer, 1, 0x2000);
  23.        
  24.         //WAKE_UP INTERRUPT Configuration
  25.         pBuffer=0x20;//Latched Interrupt.
  26.         HAL_I2C_Mem_Write(&hi2c1,LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW,LSM6DS3_MD1_CFG,1,&pBuffer, 1, 0x2000);
  27.        
  28.         pBuffer=0x40;//Block Data Update,Register address automatically incremented
  29.         HAL_I2C_Mem_Write(&hi2c1,LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW,LSM6DS3_TAP_THS_6D,1,&pBuffer, 1, 0x2000);
  30.        
  31.                 pBuffer=0x01;//Block Data Update,Register address automatically incremented
  32.         HAL_I2C_Mem_Write(&hi2c1,LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW,LSM6DS3_CTRL8_XL,1,&pBuffer, 1, 0x2000);
  33. }

  34. void Read_Accelerometer(uint16_t Accelerometer[3])
  35. {short ax,ay,az;
  36.         uint8_t pBuffer1[1];
  37.         uint8_t pBuffer2[1];
  38.         uint8_t pBuffer3[1];
  39.         uint8_t pBuffer4[1];
  40.         uint8_t pBuffer5[1];
  41.         uint8_t pBuffer6[1];
  42.         uint8_t pBuffer7[1];

  43.                 if((HAL_I2C_Mem_Read(&hi2c1, LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DS3_STATUS_REG, 1, pBuffer7, 6, 0x2000)&0x01)!=0)                              //óDêy&#190;Yéú3é
  44.         {
  45.         HAL_I2C_Mem_Read(&hi2c1, LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DS3_OUTX_H_XL, 1, pBuffer1, 6, 0x2000);
  46.         HAL_I2C_Mem_Read(&hi2c1, LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DS3_OUTX_L_XL, 1, pBuffer2, 6, 0x2000);
  47.         HAL_I2C_Mem_Read(&hi2c1, LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DS3_OUTY_H_XL, 1, pBuffer3, 6, 0x2000);
  48.         HAL_I2C_Mem_Read(&hi2c1, LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DS3_OUTY_L_XL, 1, pBuffer4, 6, 0x2000);
  49.         HAL_I2C_Mem_Read(&hi2c1, LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DS3_OUTZ_H_XL, 1, pBuffer5, 6, 0x2000);
  50.         HAL_I2C_Mem_Read(&hi2c1, LSM6DS3_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DS3_OUTZ_L_XL, 1, pBuffer6, 6, 0x2000);
  51.        
  52.        
  53.     ax=(pBuffer1[0]<<8)|pBuffer2[0];
  54.                 ay=(pBuffer3[0]<<8)|pBuffer4[0];
  55.                 az=(pBuffer5[0]<<8)|pBuffer6[0];
  56.                 printf(" acceleration£o%d, %d, %d\n",ax,ay,az);
  57.           printf("\r\n");

  58.         }
  59.        
  60. }
复制代码

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
773
金钱
773
注册时间
2021-4-15
在线时间
304 小时
发表于 2022-9-6 11:28:21 | 显示全部楼层
IIC 你可以用逻辑分析仪夹一下看看
日常敲键--头秃一片
回复

使用道具 举报

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2018-3-26
在线时间
287 小时
 楼主| 发表于 2022-9-6 11:44:12 | 显示全部楼层
日渐秃兀 发表于 2022-9-6 11:28
IIC 你可以用逻辑分析仪夹一下看看

应该问题在这个地方,HAL库不知道怎么实现了
  1. void LSM_WriteOneByte(u8 Add,u8 WriteAddr,u8 DataToWrite)     //IIC′ó&#214;&#184;&#182;¨μ&#216;&#214;·D′è&#235;ò&#187;&#184;&#246;×&#214;&#189;ú
  2. {                                                                                                                                                                          
  3.   IIC_Start();  
  4.         IIC_Send_Byte(Add);                                      //·¢&#203;íIICμ&#216;&#214;·
  5.         IIC_Wait_Ack();
  6.   IIC_Send_Byte(WriteAddr);                             //·¢&#203;íμ&#216;&#214;·
  7.         IIC_Wait_Ack();                                                                                                              
  8.         IIC_Send_Byte(DataToWrite);                           //·¢&#203;í×&#214;&#189;ú                                                          
  9.         IIC_Wait_Ack();                                
  10.   IIC_Stop();                                           //2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t  
  11. }

  12. u8 LSM_ReadOneByte(u8 Add,u8 ReadAddr)                  //IIC′ó&#214;&#184;&#182;¨μ&#216;&#214;·&#182;áè&#161;ò&#187;&#184;&#246;×&#214;&#189;ú
  13. {                                  
  14.         u8 temp=0;                                                                                                                                                               
  15.   IIC_Start();  
  16.         IIC_Send_Byte(Add);                                     //·¢&#203;íIICμ&#216;&#214;·
  17.         IIC_Wait_Ack();
  18.   IIC_Send_Byte(ReadAddr);                             //·¢&#203;íμ&#216;&#214;·
  19.         IIC_Wait_Ack();            
  20.         IIC_Start();                     
  21.         IIC_Send_Byte(Add+1);                           //&#189;&#248;è&#235;&#189;óê&#213;&#196;£ê&#189;                          
  22.         IIC_Wait_Ack();         
  23.   temp=IIC_Read_Byte(0);                  
  24.   IIC_Stop();                                           //2úéúò&#187;&#184;&#246;í£&#214;1ì&#245;&#188;t            
  25.         return temp;
  26. }
复制代码
回复

使用道具 举报

4

主题

896

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4305
金钱
4305
注册时间
2019-9-4
在线时间
896 小时
发表于 2022-9-6 12:09:23 | 显示全部楼层
可能是HAL库的时序要求达不到,HAL库代码实现起来比较臃肿,可以换成寄存器来编写驱动代码
回复

使用道具 举报

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2018-3-26
在线时间
287 小时
 楼主| 发表于 2022-9-6 12:45:57 | 显示全部楼层
A571157242 发表于 2022-9-6 12:09
可能是HAL库的时序要求达不到,HAL库代码实现起来比较臃肿,可以换成寄存器来编写驱动代码

有相关的资料分享一下吗?
回复

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
773
金钱
773
注册时间
2021-4-15
在线时间
304 小时
发表于 2022-9-7 10:12:27 | 显示全部楼层
支持者2400 发表于 2022-9-6 12:45
有相关的资料分享一下吗?

你可以用示波器或是 逻辑分析仪看一下是否有输出 看看是不是硬件配置问题 如果没问题可以再看看分析分析 用CubeMX生成的IIC控制我有使用过 可以正常使用的!你可以先排查硬件先!可以的话 再测试发送是否准确 你可以一直发送一段相同的数据 用示波器或是逻辑分析仪看看 是否有发送正确
日常敲键--头秃一片
回复

使用道具 举报

209

主题

771

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2018-3-26
在线时间
287 小时
 楼主| 发表于 2022-9-7 14:38:32 | 显示全部楼层
日渐秃兀 发表于 2022-9-7 10:12
你可以用示波器或是 逻辑分析仪看一下是否有输出 看看是不是硬件配置问题 如果没问题可以再看看分析分析  ...

我把库函数的IIC整体移过去了,还是不对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 04:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表