ADXL345的调试也很简单,下面我们简单的认识一下这个图吧,如图,VSS是ADXL345的电源,其内部的模拟电路,传感器都由这个电源供应,因此他的噪声也希望越小越好。在这里,为了简化电路,可以把VDD接在VSS,每个管脚附近都放置一个低ESR的陶瓷电容器。
可采用和SPI数字通信。
上述两种情况下,ADXL345作为从机运行。CS引脚上拉至VDD I/O,I2C模式使能。CS引脚应始终上拉至VDD I/O或由外部控制器驱动,因为CS引脚无连接时,默认模式不存在。因此,如果没有采取这些措施,可能会导致该器件无法通信。SPI模式下,CS引脚由总线主机控制。SPI和I2C两种操作模式下,ADXL345写入期间,应忽略从ADXL345传输到主器件的数据。
如果采用SPI接口的话,CS需要由主机来控制。这里我采用了IIC接口。使用I2C时,CS引脚必须连接至VDD I/O,ALT ADDRESS引脚必须连接至任一VDD I/O或接地。ALT管脚引脚处于高电平,器件的7位I2C地址是0x1D,随后为R/W位。这转化为0x3A写入,0x3B读取。通过ALT引脚(引脚12)接地,可以选择备用I2C地址0x53(随后为R/W位)。这转化为0xA6写入,0xA7读取。这一点需要特别注意,特别是自己写驱动的时候,如果注意不到,那么肯定会不对的。
IIC的驱动函数看各自的平台,我采用的LM3S811。驱动程序采用了TI的驱动库,主要有以下几个子函数,详细可以参考LM3S的库。
// 定义I2C主机结构体
typedef struct
{
unsigned char ucSLA; // 从机地址(这是7位纯地址,不含读写控制位)
unsigned long ulAddr; // 数据地址
unsigned char *pcData; // 指向收发数据缓冲区的指针
unsigned int uiSize;
} tI2CM_DEVICE;
extern void I2CM_Error(unsigned long ulStatus) ;
// 对tI2CM_DEVICE结构体变量初始化设置所有数据成员
extern void I2CM_DeviceInitSet(tI2CM_DEVICE *pDevice, unsigned char ucSLA,
unsigned long ulAddr,
unsigned char *pcData,
unsigned int uiSize);
// 对tI2CM_DEVICE结构体变量设置与数据收发相关的成员(数据地址、数据缓冲区、数据大小)
extern void I2CM_DeviceDataSet(tI2CM_DEVICE *pDevice, unsigned long ulAddr,
unsigned char *pcData,
unsigned int uiSize);
// I2C主机初始化
extern void I2CM_Init(void);
// I2C主机发送或接收数据
extern unsigned long I2CM_SendRecv(tI2CM_DEVICE *pDevice, tBoolean bFlag);
// 定义宏函数:发送数据
#define I2CM_DataSend(pDevice) I2CM_SendRecv(pDevice, false)
// 定义宏函数:接收数据
#define I2CM_DataRecv(pDevice) I2CM_SendRecv(pDevice, true)