当前位置: 代码迷 >> 驱动开发 >> 使用SPI总线读写LSM9DS0 总是有有关问题,请大家来看看代码
  详细解决方案

使用SPI总线读写LSM9DS0 总是有有关问题,请大家来看看代码

热度:214   发布时间:2016-04-28 10:01:15.0
使用SPI总线读写LSM9DS0 总是有问题,请大家来看看代码
本帖最后由 wangjing20081996 于 2015-03-09 14:50:45 编辑

 用SPI总线跟LSM9DS0传感器建立通信,MCU是LPC 1114,读取时不能得到有效值,需要多次读才可以,写入时要需要写入几次
代码如下:


uartSendByte (0x55);  //printf flag
 // read ID
 {
 LPC_GPIO2->DATA=(LPC_GPIO2->DATA&(~0x100)); //cs_XM is low
 myDelay(100);
 SPI0_SendData(0x8f);
 x= SPI0_SendData(0x00);
 myDelay(10);
 uartSendByte (x);
 LPC_GPIO2->DATA|=0x100;  //cs_XM is high
  }
 uartSendByte (0xaa);   //printf flag
//set CTRL_REG1_XM=ox57
 for(i=0;i<2;i++) //If set CTRL_REG1_XM once,the value not change
 {
// LPC_GPIO2->DATA=(LPC_GPIO2->DATA&(~0x100));
    myDelay(10);
 SPI0_SendData((CTRL_REG1_XM));
 SPI0_SendData((0x57));
// LPC_GPIO2->DATA|=0x100;
  }
  LPC_GPIO2->DATA|=0x100;
//read the CTRL_REG1_XM
 for(i=0;i<3;i++) //If read CTRL_REG1_XM once,the value is incorrect.    when I change the time to 2, the output is :55 00 AA 00 FF FF FF 5A 04 CC CC......
 {
 LPC_GPIO2->DATA=(LPC_GPIO2->DATA&(~0x100));
 SPI0_SendData((0x80|CTRL_REG1_XM));
 x=SPI0_SendData(0);
 uartSendByte (x);
 myDelay( 1000);
 LPC_GPIO2->DATA|=0x100;
 }
//set CTRL_REG3_XM=0x04
 LPC_GPIO2->DATA=(LPC_GPIO2->DATA&(~0x100));
 for(i=0;i<2;i++) //If set CTRL_REG3_XM once,the value not change
 {   
 myDelay(10);
 SPI0_SendData(CTRL_REG3_XM);
 SPI0_SendData(0x04);
  }
 LPC_GPIO2->DATA|=0x100;
//read CTRL_REG3_XM
 for(i=0;i<2;i++) //If read CTRL_REG3_XM once,the value is incorrect.
 {
 LPC_GPIO2->DATA=(LPC_GPIO2->DATA&(~0x100));
 SPI0_SendData((0x80|CTRL_REG3_XM));
 x=SPI0_SendData(0);
 uartSendByte (x);
 myDelay( 1000);
 LPC_GPIO2->DATA|=0x100;
 }
 uartSendByte (0x5a); //print flag
 while(1)
 {
//It only read the OUT_X_L_M ,but the value was same when the sensor was moved
   {
   LPC_GPIO2->DATA=(LPC_GPIO2->DATA&(~0x100));
   SPI0_SendData(0x80|OUT_X_L_M);
   x=SPI0_SendData(0);
   uartSendByte(x);
   myDelay(1000);
   LPC_GPIO2->DATA|=0x100;
   }
 }
结果如下:
55 00 AA 00 FF 57 FF FF 5A 04 CC CC CC.....
这儿,57跟04都是读到了正确值,这儿是读了3次
如果将CTRL_REG1_XM  读2次,输出如下:
55 00 AA 00 FF FF FF 5A 04 CC CC......

花了好久来解决这个问题,请大家分析分析

------解决思路----------------------
可能是你的时间测试有问题。 你可以看看波形和datasheet给的值是否符合。 
------解决思路----------------------
spi 时钟看看是不是太高了,用示波器看下信号线波形
  相关解决方案