6轴传感器LSM330DLC的底层驱动

最近在看LIS3DH加速度传感器,这是看到的底层驱动部分说明,拷贝过来,以备查阅。

地址:http://blog.sina.com.cn/s/blog_a20257d80102w0sw.html

这几天发现有几个同行在论坛发帖说LSM330DLC访问不了,所以将自己的底层调试过程贴出来,和大家一起讨论学习,有说不清楚的地方,还请砖下留人!      

      LSM330DLC 是意法半导体的一款6轴传感器芯片,可以采用I2C接口或者SPI接口,在这个项目中,使用了I2C接口。MCU使用的是STM32F103。​

       I2C的调试主要关注的是如下几个参数:I2C1使用的是APB1时钟,该项目中APB1的时钟是24M,所以I2C1->CR2 |=24;  I2C1->CCR = 0X801E,各位的含义如下:​

1,采用快速模式​

2,最后12位为分频系数,通过分频将24M分频成I2C设备能接受的时钟信号。​由于CCR寄存器使用的是快速模式,且DUTY =0,即Tlow/Thigh = 2​,所以看看LSTM330DLC的手册可以知道低电平持续的时间是1.3us,而高电平持续的时间是0.6us,SCL的时钟频率是最大400KHz,

 

3、根据公式1计算CCR的值为 24000000/2/400K = 30,而SCL和SDA的最大上升时间是0.3us,所以可以因此确定TRISE寄存器的值为300/(1000/24)=7+1 =8 ,其实我调试时,用了一个比较大的值。​​

下面就是读写的方法:读写的方法,数据手册给了一幅图:​

从图上可以看出,字节是需要ACK的,最后一个字节是不需要ACK的。​

另外需要注意的是加速度寄存器的地址是0X30,而角速度传感器的设备地址是0XD4​

u8 I2C_EE_ByteRead(u8 devAddr,u8 ReadAddr)

{

u8 result;

I2C_EE_ArrayRead(devAddr,&result, ReadAddr, 1);

return result;

}

void I2C_EE_ByteWrite( u8 devAddr, u8* pBuffer, u8 WriteAddr)

{

I2C_GenerateSTART(ENABLE);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(devAddr

WRITE_CMD, I2C_Direction_Transmitter);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

//I2C_SendData((u8)(WriteAddr>>8));

//while(! I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData( WriteAddr);

while(! I2C_CheckEvent( I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData( *pBuffer);

while(!I2C_CheckEvent( I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_GenerateSTOP(ENABLE);

}

void I2C_EE_ArrayWrite(u8 devAddr,u8* pBuffer, u8 WriteAddr, u8 NumByteToWrite)

{

while(I2C_GetFlagStatus(I2C_FLAG_BUSY));

I2C_GenerateSTART( ENABLE);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(devAddr

WRITE_CMD, I2C_Direction_Transmitter);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

//I2C_SendData((u8)(WriteAddr>>8));

//while(! I2C_CheckEvent( I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData( WriteAddr

ADDR_AUTO_INC);

while(! I2C_CheckEvent( I2C_EVENT_MASTER_BYTE_TRANSMITTED));

while(NumByteToWrite--)

{

I2C_SendData(*pBuffer);

pBuffer++;

while (!I2C_CheckEvent( I2C_EVENT_MASTER_BYTE_TRANSMITTED));

}

I2C_GenerateSTOP( ENABLE);

}

void I2C_EE_ArrayRead(u8 devAddr,u8* pBuffer, u8 ReadAddr, u32 NumByteToRead)

{

while(I2C_GetFlagStatus( I2C_FLAG_BUSY));

I2C_GenerateSTART( ENABLE);

while(!I2C_CheckEvent( I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(devAddr

WRITE_CMD, I2C_Direction_Transmitter);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

I2C_Cmd(ENABLE);

//I2C_SendData((u8)(ReadAddr>>8));

//while(! I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData(ReadAddr

ADDR_AUTO_INC);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_GenerateSTART( ENABLE);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));

I2C_Send7bitAddress(devAddr

READ_CMD, I2C_Direction_Receiver);

while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

while(NumByteToRead)

{

if(NumByteToRead == 1)

{

I2C_AcknowledgeConfig(DISABLE);

I2C_GenerateSTOP( ENABLE);

return;

}

if(I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED))

{

*pBuffer = I2C_ReceiveData();

pBuffer++;

NumByteToRead--;

}

}

I2C_AcknowledgeConfig(ENABLE);

}

void I2C_EE_WaitEepromStandbyState( u8 devAddr )

{

volatile u16 SR1_Tmp = 0;

do

{

I2C_GenerateSTART(ENABLE);

SR1_Tmp = I2C_ReadRegister(I2C_Register_SR1);

I2C_Send7bitAddress(devAddr

WRITE_CMD, I2C_Direction_Transmitter);

}while(!(I2C_ReadRegister(I2C_Register_SR1) & 0x0002));

I2C_ClearFlag(I2C_FLAG_AF);

I2C_GenerateSTOP(ENABLE);

}

调试阶段,代码行没整理,希望对大家有所帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值