用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 时钟看看是不是太高了,用示波器看下信号线波形