LIS3DHは、X、Y、Z軸の加速度を検出し、しきい値を設定し、加速度がしきい値を超えたときに割り込みをトリガーするために使用できる3軸加速度センサーです。
読み取りと書き込みのためにSPIとIICをサポートします。
以下は主にIICの読み取りと書き込みの方法です。
1.読み取りおよび書き込みプロセスを登録します
まず、ハードウェア接続によってモジュールのIICアドレスが決定され
ます。SAOピンが接地されている場合、IICアドレスは0X30(最下位ビットを含まない)です。V3.3に
接続されている場合、IICアドレスは0X32(最下位ビットを含まない)です。
このデバイスアドレスは非常に重要です。対応するデバイスアドレスを最初に書き込んでから、コマンドを書き込む必要があるためです。
最初に送信されるデバイスアドレスは最初の7ビットのみであり、最後のビットが読み取りビットと書き込みビットを決定することに注意してください。0はレジスタの書き込み用、1はレジスタの読み取り用です。したがって、レジスタの書き込み時には「LIS_ADDR | 0x00」と書き込み、読み取りの場合は「LIS_ADDR」になります。 | 0x01 "
a。ホストはスレーブにバイトを書き込みます。次の表は、IICを介してLIS3DHレジスタにバイトを書き込むフローを示しています。簡単に言うと、最初に書き込みコマンド+ IICアドレスのバイトを書き込み、次に書き込みたいレジスタアドレスのバイトを書き込み、最後に書き込みたいレジスタの内容のバイトを書き込みます。
例:
//IIC写一个字节
//reg:寄存器地址
//data:数据
//返回值:0,正常
//其他,错误代码
uint8_t LIS_Write_Byte(uint8_t reg,uint8_t data)
{
IIC_Start();
IIC_Send_Byte(LIS_ADDR|0x00);//发送器件地址+写命令
if(IIC_Wait_Ack()) //等待应答
{
IIC_Stop();
return 1;
}
IIC_Send_Byte(reg|0x00); //写寄存器地址 D7位为低用于单字节传输
IIC_Wait_Ack(); //等待应答
IIC_Send_Byte(data); //发送数据
if(IIC_Wait_Ack()) //等待ACK
{
IIC_Stop();
return 1;
}
IIC_Stop();
AP_interface->ol_Sleep(5000);
return 0;
}
b。LIS3DHは、レジスターの1バイトを読み取ります。
プロセス:最初に1バイトの書き込みコマンド+ IICアドレスを書き込み、次に読み取りたいレジスターを書き込みます。次に、1バイトの読み取りコマンド+ IICアドレスを書き込み、最後に1バイトのデータを読み取ります
例:
//IIC读一个字节
//reg:寄存器地址
//返回值:读到的数据
uint8_t LIS_Read_Byte(uint8_t reg)
{
uint8_t res=0x00;
IIC_Start();
IIC_Send_Byte(LIS_ADDR|0x00);//发送器件地址+写命令
if(IIC_Wait_Ack()) //等待ACK
{
IIC_Stop();
return 1;
}
IIC_Send_Byte(reg); //写寄存器地址
IIC_Wait_Ack(); //等待应答
IIC_Start();
IIC_Send_Byte(LIS_ADDR|0x01); //发送器件地址+读命令
IIC_Wait_Ack(); //等待应答
res = IIC_Read_Byte(0); //读取数据,发送nACK
IIC_Stop(); //产生一个停止条件
return res;
}
c。IIC書き込みレジスタは継続的に:
例:
//IIC连续写
//addr:器件地址
//reg:寄存器地址
//len:写入长度
//buf:数据区
//返回值:0,正常
// 其他,错误代码
uint8_t LIS_Write_Len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf)
{
uint8_t i;
IIC_Start();
IIC_Send_Byte(LIS_ADDR|0x00);//发送器件地址+写命令
if(IIC_Wait_Ack()) //等待应答
{
IIC_Stop();
return 1;
}
IIC_Send_Byte(reg|0x80); //写寄存器地址 D7位为高用于多字节传输
IIC_Wait_Ack(); //等待应答
for(i=0;i<len;i++)
{
IIC_Send_Byte(buf[i]); //发送数据
if(IIC_Wait_Ack()) //等待ACK
{
IIC_Stop();
return 1;
}
}
IIC_Stop();
return 0;
}
d。IICモードでレジスタを継続的に読み取ります。MAKとNMAKに注意してください。
例:
//IIC连续读
//addr:器件地址
//reg:要读取的寄存器地址
//len:要读取的长度
//buf:读取到的数据存储区
//返回值:0,正常
// 其他,错误代码
uint8_t LIS_Read_Len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf)
{
IIC_Start();
IIC_Send_Byte(LIS_ADDR|0x00);//发送器件地址+写命令
if(IIC_Wait_Ack()) //等待应答
{
IIC_Stop();
return 1;
}
IIC_Send_Byte(reg|0x80); //写寄存器地址 D7位为高用于多字节传输
IIC_Wait_Ack(); //等待应答
IIC_Start();
IIC_Send_Byte(LIS_ADDR|0x01);//发送器件地址+读命令
IIC_Wait_Ack(); //等待应答
while(len)
{
if(len==1)*buf=IIC_Read_Byte(0);//读数据,发送nACK
else *buf=IIC_Read_Byte(1); //读数据,发送ACK
len--;
buf++;
}
IIC_Stop(); //产生一个停止条件
return 0;
}
2.割り込みアプリケーションをトリガーするようにしきい値振動を設定します
まず、WHO_AM_Iというレジスターを読み取ることにより、このレジスターによって読み取られる値が定数0x33であるため、チップが使用可能であるかどうかを判別するために使用できます。
割り込みをトリガーするしきい値の設定例:
この例では、割り込みラッチを設定します。つまり、INT1_SRCレジスタが再度読み取られるまで割り込みはクリアされず、INT1_SRCが再度読み取られるまでピンが強制されます。
LIS_Write_Byte(CTRL_REG1,0x3F); //设置低功耗模式 xyz轴使能 采样频率25HZ
LIS_Write_Byte(CTRL_REG2,0x09); //高通滤波正常模式,数据从内部滤波器到输出寄存器 高通滤波器使能到中断1
LIS_Write_Byte(CTRL_REG3,0x40); //使能AOI中断1
LIS_Write_Byte(CTRL_REG4,0x80); //分辨率为+-2g 则单位为 4000/(2^8)=16mg 仅在LSB和MSB被读时才更新数据
LIS_Write_Byte(CTRL_REG5,0x08); //寄存器锁存中断,只有读INT1_SRC可以恢复
LIS_Write_Byte(INT1_THS,0x10); //设置阈值 16*16=256 mg
LIS_Write_Byte(INT1_DURATION,0x00); //中断持续时间设置,此处设为0,因为不读INT1_SRC中断就一直锁存
LIS_Read_Byte(REFERENCE); //读虚寄存器,强制将高通滤波器值加载到当前加速度值,开始比较
//INT1_CFG使能中断 中断模式为 “OR”组合 只使能xyz轴高事件
//LIS_Write_Byte(INT1_CFG,0x2A);
//INT1_CFG使能中断 中断模式6-direction position 使能xyz轴高低事件
LIS_Write_Byte(INT1_CFG,0xFF);
LIS_Read_Byte(INT1_SRC);//清除中断位
さらに、指定した時間をトリガーするように割り込みを設定することもできます。そうすると、ピンが復元されます。主にINT1_DURATION(33h)レジスタを設定します
このODRは、GTRL_REG1を介して設定できます。
最後の割り込み期間はINT1_DURATION / ODRです
3. X、Y、Z軸方向の加速度値を読み取るFIFOモード
高速の読み取りおよび書き込み要件の場合、FIFOを使用して加速を読み取る必要がある場合があります
LIS3DHには4つのFIFOモードがあります。
1、バイパスモード
中間モード、モードを切り替えるときにのみ使用されます
2、FIFOモード
データがバッファをいっぱいにしたら、いっぱいにするのをやめます
3、ストリームモード
データは継続的に出力され、バッファがいっぱいになると古いデータが上書きされ、データは順番に1バイト進められます。
4、Stream-to-FIFOモード
FIFOバッファがストリームモードになり始め、割り込みピンの選択がトリガーされたら、FIFOモードに切り替えます。FIFO_CTRL_REG(2Eh)のTRビットは、制御用のINT1ピンかINT2ピンかを判別できます。
例:XYZ軸方向の加速度を読み取るには、ストリームモードを使用します。
ウォーターマークとは、読み取り時にデータの合計量が指定された範囲を超えているかどうかを確認するためにFSS [4:0]を構成することを指します。たとえば、FIFOバッファの最大レベルは32であるため、20に設定できます。読み取り時にデータが20を超える場合、FIFO_SRC_REG(2Fh)(WTM)ビットは1に設定され、それ以外の場合は0に設定されます。
同時に、32レベルのバッファがすべていっぱいの場合、FIFO_SRC_REG(2Fh)のOVRN_FIFOは1に設定されます。
//测试FIFO
IIC_WriteByte(LIS3DH_CTRL_REG1,0x80|0x0F); //0010 0111 低功耗模式
IIC_WriteByte(LIS3DH_CTRL_REG2,0x00); //高通滤波关闭
IIC_WriteByte(LIS3DH_CTRL_REG3,0x06); //使能FIFO中断 0000 0110
IIC_WriteByte(LIS3DH_CTRL_REG4,0x00); //分辨率+-16g 0011 0000
IIC_WriteByte(LIS3DH_CTRL_REG5,0x48); //FIFO使能 0100 1000
IIC_WriteByte(LIS3DH_FIFO_CTRL,0x80|0x1D); //0100 1111 配置FIFO模式和水印
IIC_ReadByte(LIS3DH_INT1_SRC); //清除中断位
collect_LIS_Data();
void collect_LIS_Data(void)
{
uint16_t LIS_temp_data[3] = {0,0,0};
uint8_t data_len,i;
FIFO_data_len = IIC_ReadByte(LIS3DH_FIFO_SRC);
FIFO_data_len &= 0x1F;
for(i=0;i<FIFO_data_len;i++)
{
LIS3DH_ReadData(LIS_temp_data); //读取3个方向的数据
}
}
データは常に更新されるため、定期的に読み取る必要があり、読み取り間隔はODRによって制御および調整できます。