3192|18

932

帖子

3

TA的资源

纯净的硅(中级)

楼主
 

【CH579M-R1】+求助:驱动LSM303DLH磁场传感器不成功 [复制链接]

 
 

    网购的一块LSM303DLH磁场传感器模块,准备用CH579M-R1开发板来驱动,下面是模块的照片:

    模块上有8个引脚,其中4个是I2C通讯用的(包括电源正负极),另外4个分别是ADDR(加速度地址选择)、INT1、INT2、DRY(磁场数据准备好检测)。

    通过分析商家提供的资料及STM32驱动代码,只有I2C通讯的内容,因此我只连接了I2C的SDA和DCK以及3.3V电源,其他引脚空置未连接。

    范例中对LSM303DLH的初始化仅仅操作了3个寄存器,代码如下:

*********************************************
* 函数名称:InitLSM303D(void)
* 函数功能:初始化LSM303D
* 入口参数:无
* 出口参数:无
* 备    注:根据需要请参考数据手册,进行修改
*********************************************/
void InitLSM303D(void)
{
    I2C_8bitSingle_Write(M_SlaveAddress,0x00,0x14);
    I2C_8bitSingle_Write(M_SlaveAddress,0x02,0x00);
    I2C_8bitSingle_Write(M_SlaveAddress,0x20,0x2F);   //测量范围,正负2g,16位模式0x27
}

 

    其中的第三行原来写入的是0x27,即正常模式、50Hz传输率,在测试中我修改为0x2F,即传输率改为100Hz。

    模块中磁场传感器的数据读取地址与运动传感器的数据读取地址不同,我查阅了数据手册,是正确的。读取数据的代码如下:

/*********************************************
* 函数名称:InitLSM303D(void)
* 函数功能:磁场数据和加速度数据读取
* 入口参数:无
* 出口参数:无
* 备    注:根据需要请参考数据手册,进行修改
*********************************************/
void LSM303D_Read(void)
{
	//磁场数据读取
    I2C_8bitAddrRead(M_SlaveAddress,0x03,6,(uint8_t *)BUF);//OUT_X_M
    M_x=(BUF[0] << 8) | BUF[1];         //合成16位数据
    M_y=(BUF[2] << 8) | BUF[3];         //合成16位数据
	M_z=(BUF[4] << 8) | BUF[5];         //合成16位数据
//    angle= atan2(M_y,M_x) * (180 / 3.14159265) + 180; //角度(度)angle in degrees
//    DATA_printf(TX_DATA,angle);         //转换角度轴数据到数组
//    Send_data('M');                     //发送数据,M:磁场0-360
    DATA_printf(TX_DATA,M_x);
	LCD_write_ASCII(0,2,1,TX_DATA);
    DATA_printf(TX_DATA,M_y);
	LCD_write_ASCII(0,3,1,TX_DATA);
    DATA_printf(TX_DATA,M_z);
	LCD_write_ASCII(0,4,1,TX_DATA);

//    LCD_write_value(0,2,5,0,0,M_x);
//    LCD_write_value(0,3,5,0,0,M_y);
//    LCD_write_value(0,4,5,0,0,M_z);
	
    //加速度数据读取
    BUF[0]=I2C_8bitSingle_Read(A_SlaveAddress,0x28);//OUT_X_A
    BUF[1]=I2C_8bitSingle_Read(A_SlaveAddress,0x29);//OUT_X_A

    BUF[2]=I2C_8bitSingle_Read(A_SlaveAddress,0x2A);//OUT_Y_A
    BUF[3]=I2C_8bitSingle_Read(A_SlaveAddress,0x2B);//OUT_Y_A

    BUF[4]=I2C_8bitSingle_Read(A_SlaveAddress,0x2C);//OUT_Z_A
    BUF[5]=I2C_8bitSingle_Read(A_SlaveAddress,0x2D);//OUT_Z_A
	  	  	
    A_x=(BUF[1] << 8) | BUF[0];         //合成16位数据
    A_y=(BUF[3] << 8) | BUF[2];         //合成16位数据
    A_z=(BUF[5] << 8) | BUF[4];         //合成16位数据
    A_x/=16.383;                        //mg
    A_y/=16.383;                        //mg
    A_z/=16.383;                        //mg
//    DATA_printf(TX_DATA,A_x);           //转换X轴数据到数组
//    Send_data('x');		   	            //发送数据,mg为单位
//    DATA_printf(TX_DATA,A_y);           //转换X轴数据到数组
//    Send_data('y');			            //发送数据,mg为单位
//    DATA_printf(TX_DATA,A_z);           //转换X轴数据到数组
//    Send_data('z');	                    //发送数据,mg为单位
//    USART1_SendData(0X0D);              //换行
//    USART1_SendData(0X0A);              //回车	
    DATA_printf(TX_DATA,A_x);
    LCD_write_ASCII(40,2,1,TX_DATA);
    DATA_printf(TX_DATA,A_y);
    LCD_write_ASCII(40,3,1,TX_DATA);
    DATA_printf(TX_DATA,A_z);
    LCD_write_ASCII(40,4,1,TX_DATA);

//    LCD_write_value(40,2,5,0,0,A_x);
//    LCD_write_value(40,3,5,0,0,A_y);
//    LCD_write_value(40,4,5,0,0,A_z);
	
    Delayms(1);						
}

    原代码是将读取的数据通过串口发送,我修改成显示在LCD屏幕中。

    代码编译通过后,下载到开发板上测试,磁场和加速度三个轴数值全部相同,分别是514和31,无论如何移动模块方位都不会变化:

    用商家提供的范例直接编译,提示缺少库文件:

    在论坛里下载到虾版的测试帖子,也是提示缺少文件而无法编译:

    花了两天时间仔细查阅数据手册,也没有找到解决问题的方法。另外分析商家提供的代码,发现定义了不少模块中的寄存器地址,但没有找到何处引用这些定义的:

#ifndef __LSM303D_H
#define __LSM303D_H


//磁场内部寄存器***********************************
/* Magnetometer registers磁力计寄存器 */
#define CRA_REG_M		0x00	/* Configuration register A */
#define CRB_REG_M		0x01	/* Configuration register B */
#define MR_REG_M		0x02	/* Mode register */
/* resume state index恢复状态索引 */
#define RES_CRA_REG_M		0	/* Configuration register A */
#define RES_CRB_REG_M		1	/* Configuration register B */
#define RES_MR_REG_M		2	/* Mode register */
/* Output register start address输出寄存器起始地址 */
#define OUT_X_M			    0x03
/* Magnetic Sensor Operation Mode磁传感器操作模块 */
#define NORMAL_MODE     	0x00
#define POS_BIAS         	0x01
#define NEG_BIAS         	0x02
#define CC_MODE          	0x00
#define SC_MODE			    0x01
#define SLEEP_MODE		    0x03
 //加速度内部寄存器***********************************
#define AXISDATA_REG	  	    0x28
#define WHOAMI_LSM303DLH_ACC	0x32	/*	Expctd content for WAI	*/
/*	CONTROL REGISTERS	*/
#define WHO_AM_I		0x0F	/*	WhoAmI register		*/
#define CTRL_REG1		0x20	/*				*/
#define CTRL_REG2		0x21	/*				*/
#define CTRL_REG3		0x22	/*				*/
#define CTRL_REG4		0x23	/*				*/
#define	CTRL_REG5		0x24	/*				*/

#define	INT_CFG1		0x30	/*	interrupt 1 config	*/
#define	INT_SRC1		0x31	/*	interrupt 1 source	*/
#define	INT_THS1		0x32	/*	interrupt 1 threshold	*/
#define	INT_DUR1		0x33	/*	interrupt 1 duration	*/

#define	INT_CFG2		0x34	/*	interrupt 2 config	*/
#define	INT_SRC2		0x35	/*	interrupt 2 source	*/
#define	INT_THS2		0x36	/*	interrupt 2 threshold	*/
#define	INT_DUR2		0x37	/*	interrupt 2 duration	*/

#define	M_SlaveAddress    0x3C
#define	A_SlaveAddress    0x30


void InitLSM303D(void);         //传感器初始化
void LSM303D_Read(void);        //读取传感器数据


#endif

    在上面的定义中真正用到的仅仅是两个I2C地址,其他的没有发现在哪引用。

    在淘宝搜索了同类产品,发现他们提供的资料完全一致,应该都是同一出处的。

    我现在的疑问是:

    1、模块上的ADDR,INT1,INT2,DRY引脚该如何连接(我暂时只需要读取磁场传感器数据,尚未涉及运动传感器数据)?

    2、上述的模块初始化代码是否还缺少,导致模块尚未进入正常工作?

    3、读取数据前是否还有先决条件?

 

补充内容 (2020-10-16 13:07): 经过各位的热心帮助,已经基本可以读出数据了,关键还是要对模块加热。

最新回复

沁恒CH579M-R1开发板测评 汇总贴:https://bbs.eeworld.com.cn/thread-1140005-1-1.html   详情 回复 发表于 2020-10-19 10:41
点赞 关注
 
 

回复
举报

9790

帖子

24

TA的资源

版主

沙发
 

模块断电重上电后,读一下默认值非零的寄存器,看和数据手册中的数据一样吗?

点评

经测试读取寄存器20h初始化前后的数值均为2,该寄存器的初始值应该是7,初始化的值是39(0x27),但我读取的这两个值都是2,也许是读取的代码有问题,但这段I2C的代码读取DS1307却正常,没有错误。  详情 回复 发表于 2020-10-10 12:16
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

1万

帖子

24

TA的资源

版主

板凳
 

记得LSM303上电后默认是低功耗模式,要先设置控制寄存器,这样传感器才会工作。

点评

已经设置成正常模式了。  详情 回复 发表于 2020-10-10 11:50
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

4
 
dcexpert 发表于 2020-10-10 11:49 记得LSM303上电后默认是低功耗模式,要先设置控制寄存器,这样传感器才会工作。

已经设置成正常模式了。

 
 
 

回复

1万

帖子

24

TA的资源

版主

5
 

先读取WHO_AM_I寄存器内容,看看是不是正确的。

 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

6
 
littleshrimp 发表于 2020-10-10 11:09 模块断电重上电后,读一下默认值非零的寄存器,看和数据手册中的数据一样吗?

经测试读取寄存器20h初始化前后的数值均为2,该寄存器的初始值应该是7,初始化的值是39(0x27),但我读取的这两个值都是2,也许是读取的代码有问题,但这段I2C的代码读取DS1307却正常,没有错误。

点评

再看看是不是7位地址,和8位地址的问题 如果不行再换一个假地址(随便写一个)看一下读到的数据有没有变化 再不行换个单片机试试,先把除这个传感器板子的硬件问题  详情 回复 发表于 2020-10-10 13:32
 
 
 

回复

9790

帖子

24

TA的资源

版主

7
 
hujj 发表于 2020-10-10 12:16 经测试读取寄存器20h初始化前后的数值均为2,该寄存器的初始值应该是7,初始化的值是39(0x27),但我读取 ...

再看看是不是7位地址,和8位地址的问题

如果不行再换一个假地址(随便写一个)看一下读到的数据有没有变化

再不行换个单片机试试,先把除这个传感器板子的硬件问题

点评

好的,我再多测试几个寄存器看看。 再用逻辑分析仪抓取I2C通讯的时序,看看这里会不会仍有问题。  详情 回复 发表于 2020-10-10 15:17
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

8
 
littleshrimp 发表于 2020-10-10 13:32 再看看是不是7位地址,和8位地址的问题 如果不行再换一个假地址(随便写一个)看一下读到的数据有没有 ...

好的,我再多测试几个寄存器看看。

再用逻辑分析仪抓取I2C通讯的时序,看看这里会不会仍有问题。

 
 
 

回复

7608

帖子

18

TA的资源

五彩晶圆(高级)

9
 

用的老的std库,st好像不支持了,可以自己找一下以前的版本. 黄色叹号是找不到,你先核对一下文件路径对不对.

点评

    谢谢指点!     下载的程序因缺少文件所以无法编译成功,移植的代码中也许是I2C的读写有问题,读取的数据全部相同,正在进一步分析测试中。  详情 回复 发表于 2020-10-12 08:09
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

10
 
freebsder 发表于 2020-10-11 21:33 用的老的std库,st好像不支持了,可以自己找一下以前的版本. 黄色叹号是找不到,你先核对一下文件路径对不对. ...

    谢谢指点!

    下载的程序因缺少文件所以无法编译成功,移植的代码中也许是I2C的读写有问题,读取的数据全部相同,正在进一步分析测试中。

 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

11
 

    经过几天的调试,终于完成了与LSM303DLH的I2C通讯,成功地对LSM303DLH进行了读写操作。看来DS1307日历模块对I2C通讯的容错性更强,我原来的代码对DS1307日历模块能够读写数据,却愣是无法与LSM303DLH模块进行通讯,经过仔细地对照逻辑分析仪抓取的时序与数据表中的要求核对和慢慢调整,终于完成了I2C通讯。下图为测试过程:

 

    这是读出的数据:

    不过目前传感器模块返回的数据不正确,不会随传感器位置转动而改变,似乎LSM303DLH模块尚未正确配置,但从逻辑分析仪抓取的时序图上看,应该已经将三个寄存器的配置数据发送到传感器模块内了,但不知道为何传感器没能正常工作。按照找到的范例,模块的初始化配置为:

    I2C_8bitSingle_Write(M_SlaveAddress,0x00,0x14);   //0x14|0x10
    I2C_8bitSingle_Write(M_SlaveAddress,0x02,0x00);
    I2C_8bitSingle_Write(M_SlaveAddress,0x20,0x27);   //测量范围,正负2g,16位模式0x27

    逻辑分析仪抓取的时序图如下:

    上面的时序图是给寄存器0x00发送数据0x14以及给寄存器0x02发送数据库0x00,下面的时序图是给寄存器0x20发送数据0x27。从时序图上看,发送的地址和数据都正确,模块也正常接收到数据(有Ack回应)。

    下面是接收数据的时序图:

    下面是测试过程的动画:

 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

12
 
本帖最后由 hujj 于 2020-10-14 21:08 编辑

    不知是杜邦线接触不好还是其他原因,今天偶尔一次能读到磁场数据,转动模块方向,数据会有变化,但昙花一现,之后又读不出正解数据了。

 
 
 

回复

7608

帖子

18

TA的资源

五彩晶圆(高级)

13
 

加油,加油,挺详细的

点评

谢谢鼓励,还在继续探索中。  详情 回复 发表于 2020-10-15 09:04
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

1942

帖子

2

TA的资源

版主

14
 

磁场传感器应该需要校准吧,如果是读不到数据,且时序没有问题,你尝试一下吧通信线改短一点,这种通信问题需要不停的调试。

如果觉得和磁力传感器通信不了(但和加速度计能够通信),可以尝试重新用热风枪吹一下磁力传感器,之前就有同事遇到这个坑。

点评

    十分感谢!真的用电吹风稍微吹了一下模块,又可以读到数据了。怪不得我有时用手按压一下模块,偶尔也能读到数据,我还以为是接触不良引起的呢。  详情 回复 发表于 2020-10-15 09:29
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

15
 
freebsder 发表于 2020-10-14 21:03 加油,加油,挺详细的

谢谢鼓励,还在继续探索中。

 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

16
 
w494143467 发表于 2020-10-14 22:28 磁场传感器应该需要校准吧,如果是读不到数据,且时序没有问题,你尝试一下吧通信线改短一点,这种通信问题 ...

    十分感谢!真的用电吹风稍微吹了一下模块,又可以读到数据了。怪不得我有时用手按压一下模块,偶尔也能读到数据,我还以为是接触不良引起的呢。

点评

这个只是经验,那同事当时卡了两天,找了各种解决方案,最后主管来了一句,吹它,后来就可以了,我同事激动的不行,哈哈 你这个帖子可以整理一下然后发一个经验贴,要是写的好,可以给你加精!  详情 回复 发表于 2020-10-15 09:49
 
 
 

回复

1942

帖子

2

TA的资源

版主

17
 
hujj 发表于 2020-10-15 09:29     十分感谢!真的用电吹风稍微吹了一下模块,又可以读到数据了。怪不得我有时用手按压一下模 ...

这个只是经验,那同事当时卡了两天,找了各种解决方案,最后主管来了一句,吹它,后来就可以了,我同事激动的不行,哈哈

你这个帖子可以整理一下然后发一个经验贴,要是写的好,可以给你加精!

点评

谢谢版主鼓励!现在还没有稳定地读取到数据,完全成功之后一定会总结一下经验教训的。  详情 回复 发表于 2020-10-15 10:04
 
 
 

回复

932

帖子

3

TA的资源

纯净的硅(中级)

18
 
w494143467 发表于 2020-10-15 09:49 这个只是经验,那同事当时卡了两天,找了各种解决方案,最后主管来了一句,吹它,后来就可以了,我同事激 ...

谢谢版主鼓励!现在还没有稳定地读取到数据,完全成功之后一定会总结一下经验教训的。

 
 
 

回复

1万

帖子

203

TA的资源

管理员

19
 

沁恒CH579M-R1开发板测评

汇总贴:https://bbs.eeworld.com.cn/thread-1140005-1-1.html

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表