06 并不成功的LinkNode的三轴加速度计
时间:10-02
整理:3721RD
点击:
概要:按照官方代码,读不到正常数据。初步估计原因可能有以下几个:1、SPI驱动有问题。可是呢IO口没有引出,没法测试。2、主芯片和LIS3DH之间的连接有问题,导致不能正常通信。看了看引脚太小,没法测试。具体过程描述如下。
LinkNode上有一个LIS3DH,可是官方手册上并没有给出参考代码。就连SPI的参考代码都没有。不过linksprite的wiki上有,可以在以下网址找到(http://linksprite.com/wiki/index ... IS3DH_accelerometer)。
本来想利用mbed的库从头建个工程看看,但是搜索了以下,发现LIS3DH的库和项目都只有2个,而且都是i2c接口的。虽然芯片CS拉高就是i2c模式,但是看原理图,并没有看到有接i2c上拉电阻,所以还是乖乖用SPI,参考官方代码来写吧。有时间再转换一下i2c驱动到SPI吧。
官方代码比较简单,就是写了一个SPI的初始化,读写寄存区的子函数,然后调用。结果烧写以后满屏的“device err”。这又是什么鬼?!
看了下代码,每次读数都会查看下芯片的ID,如果是0x33,表示有芯片,如果不是,则显示上图的出错信息。
打印了一下收到的who am i,发现都是255。这说明MI上全是高电平啊。
绕过who am I检测,强制读取三轴的值就是这么个死相
改造下显示代码,其实是以下这么回事,也就是说,读到的全是1。和读who am I的结果一致。真是醉了
可怜的SPI引脚也没有引出,无法测试。有没有人可以跑动这个例程的呢?
代码如下:
LinkNode上有一个LIS3DH,可是官方手册上并没有给出参考代码。就连SPI的参考代码都没有。不过linksprite的wiki上有,可以在以下网址找到(http://linksprite.com/wiki/index ... IS3DH_accelerometer)。
本来想利用mbed的库从头建个工程看看,但是搜索了以下,发现LIS3DH的库和项目都只有2个,而且都是i2c接口的。虽然芯片CS拉高就是i2c模式,但是看原理图,并没有看到有接i2c上拉电阻,所以还是乖乖用SPI,参考官方代码来写吧。有时间再转换一下i2c驱动到SPI吧。
官方代码比较简单,就是写了一个SPI的初始化,读写寄存区的子函数,然后调用。结果烧写以后满屏的“device err”。这又是什么鬼?!
看了下代码,每次读数都会查看下芯片的ID,如果是0x33,表示有芯片,如果不是,则显示上图的出错信息。
打印了一下收到的who am i,发现都是255。这说明MI上全是高电平啊。
绕过who am I检测,强制读取三轴的值就是这么个死相
改造下显示代码,其实是以下这么回事,也就是说,读到的全是1。和读who am I的结果一致。真是醉了
可怜的SPI引脚也没有引出,无法测试。有没有人可以跑动这个例程的呢?
汇总帖在此:
【linknode评测】—— by johnrey
http://bbs.eeworld.com.cn/forum. ... &fromuid=536508
就是说,其实SPI根本就没通,id都读不对了你去强读就没意义了,要冷静。我看你挺淡定的啊,怎么连强读数据这种事情都干出来了
你可以进这个linksprite的网站看看有没有解决方案:http://cnlearn.linksprite.com/
好着啊,是你考虑的太复杂了吧
代码如下:
- uint16_t x_a,y_a,z_a;
- bool flag = 0;
- SPI spi_master(P0_6,P0_5,P0_7); //mosi miso sclk
- DigitalOut cs(P0_4);
- Serial pc(P0_23,P0_25);
- uint8_t LIS3DH_SPI_RD(uint8_t addr)
- {
- uint8_t temp;
- cs = 0;
- wait_us(10);
- spi_master.write(addr);
- temp=spi_master.write(0xff);
- wait_us(10);
- cs = 1;
- return temp;
- }
- void LIS3DH_SPI_WR(uint8_t addr,uint8_t wrdata)
- {
- cs = 0;
- wait_us(10);
- spi_master.write(addr);
- spi_master.write(wrdata);
- wait_us(10);
- cs = 1;
- }
- void SPI_LIS3DH_Init()
- {
- spi_master.format(8,3);
- spi_master.frequency(100000);
- wait_ms(5);
- LIS3DH_SPI_WR(0x24,0x80);
- wait_ms(5);
- LIS3DH_SPI_WR(0x20,0x17);
- LIS3DH_SPI_WR(0x23,0x80);
- }
- void get_val(void)
- {
- uint8_t Dx_L=1,Dy_L=1,Dz_L=1;
- uint8_t Dx_H=1,Dy_H=1,Dz_H=1;
- if(LIS3DH_SPI_RD(0x0f|0x80)==0x33)
- {
- printf("check device ok!\r\n");
- flag=1;
- Dx_H=LIS3DH_SPI_RD(0x29|0x80);
- Dx_L=LIS3DH_SPI_RD(0x28|0x80);
- Dy_H=LIS3DH_SPI_RD(0x2b|0x80);
- Dy_L=LIS3DH_SPI_RD(0x2A|0x80);
- Dz_H=LIS3DH_SPI_RD(0x2d|0x80);
- Dz_L=LIS3DH_SPI_RD(0x2C|0x80);
- }
- else printf("check device err!\r\n");
- x_a=Dx_H<<8|Dx_L/16;
- y_a=Dy_H<<8|Dy_L/16;
- z_a=Dz_H<<8|Dz_L/16;
- }
- int main(void)
- {
- SPI_LIS3DH_Init();
- while(1)
- {
- get_val();
- if(flag)
- {
- printf("Dx=:%d\r\n",x_a);
- printf("Dy=:%d\r\n",y_a);
- printf("Dz=:%d\r\n",z_a);
- flag=0;
- wait(1);
- }
- }
- }
验证下其他寄存器读取是不是也不正常呗
enna,那基本判定硬件问题吧。代码都是一字未改。不知道是不是焊接啥的问题
要是硬件那就没辙了,只能放弃了,不行你可以免费给换个器件,就是焊接手工基本不可能的样子
这个好像太难了。还好bmp180还能用