佚名通过本文主要向大家介绍了lsm9ds0,spi总线,spi总线协议,spi总线工作原理,spi总线时序等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 使用SPI总线读写LSM9DS0 总是有问题,请大家来看看代码
描述:
用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......
花了好久来解决这个问题,请大家分析分析
解决方案1:
描述:
本帖最后由 wangjing20081996 于 2015-03-09 14:50:45 编辑
LSM9DS0 传感器 SPI
用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......
花了好久来解决这个问题,请大家分析分析
解决方案1:
spi 时钟看看是不是太高了,用示波器看下信号线波形
解决方案2:可能是你的时间测试有问题。 你可以看看波形和datasheet给的值是否符合。