微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > 06 并不成功的LinkNode的三轴加速度计

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评测】—— by johnrey
http://bbs.eeworld.com.cn/forum. ... &fromuid=536508

就是说,其实SPI根本就没通,id都读不对了你去强读就没意义了,要冷静。我看你挺淡定的啊,怎么连强读数据这种事情都干出来了

你可以进这个linksprite的网站看看有没有解决方案:http://cnlearn.linksprite.com/

好着啊,是你考虑的太复杂了吧




代码如下:

  1. uint16_t x_a,y_a,z_a;
  2. bool flag = 0;
  3. SPI spi_master(P0_6,P0_5,P0_7); //mosi miso sclk
  4. DigitalOut cs(P0_4);
  5. Serial pc(P0_23,P0_25);
  6. uint8_t LIS3DH_SPI_RD(uint8_t addr)
  7. {
  8. uint8_t temp;
  9. cs = 0;
  10. wait_us(10);
  11. spi_master.write(addr);
  12. temp=spi_master.write(0xff);
  13. wait_us(10);
  14. cs = 1;
  15. return temp;
  16. }
  17. void LIS3DH_SPI_WR(uint8_t addr,uint8_t wrdata)
  18. {
  19. cs = 0;
  20. wait_us(10);
  21. spi_master.write(addr);
  22. spi_master.write(wrdata);
  23. wait_us(10);
  24. cs = 1;
  25. }
  26. void SPI_LIS3DH_Init()
  27. {
  28. spi_master.format(8,3);
  29. spi_master.frequency(100000);
  30. wait_ms(5);
  31. LIS3DH_SPI_WR(0x24,0x80);
  32. wait_ms(5);
  33. LIS3DH_SPI_WR(0x20,0x17);
  34. LIS3DH_SPI_WR(0x23,0x80);
  35. }
  36. void get_val(void)
  37. {
  38. uint8_t Dx_L=1,Dy_L=1,Dz_L=1;
  39. uint8_t Dx_H=1,Dy_H=1,Dz_H=1;
  40. if(LIS3DH_SPI_RD(0x0f|0x80)==0x33)
  41. {
  42. printf("check device ok!\r\n");
  43. flag=1;
  44. Dx_H=LIS3DH_SPI_RD(0x29|0x80);
  45. Dx_L=LIS3DH_SPI_RD(0x28|0x80);
  46. Dy_H=LIS3DH_SPI_RD(0x2b|0x80);
  47. Dy_L=LIS3DH_SPI_RD(0x2A|0x80);
  48. Dz_H=LIS3DH_SPI_RD(0x2d|0x80);
  49. Dz_L=LIS3DH_SPI_RD(0x2C|0x80);
  50. }
  51. else printf("check device err!\r\n");
  52. x_a=Dx_H<<8|Dx_L/16;
  53. y_a=Dy_H<<8|Dy_L/16;
  54. z_a=Dz_H<<8|Dz_L/16;
  55. }
  56. int main(void)
  57. {
  58. SPI_LIS3DH_Init();
  59. while(1)
  60. {
  61. get_val();
  62. if(flag)
  63. {
  64. printf("Dx=:%d\r\n",x_a);
  65. printf("Dy=:%d\r\n",y_a);
  66. printf("Dz=:%d\r\n",z_a);
  67. flag=0;
  68. wait(1);
  69. }
  70. }
  71. }

复制代码

验证下其他寄存器读取是不是也不正常呗

enna,那基本判定硬件问题吧。代码都是一字未改。不知道是不是焊接啥的问题

要是硬件那就没辙了,只能放弃了,不行你可以免费给换个器件,就是焊接手工基本不可能的样子

这个好像太难了。还好bmp180还能用

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top