中级会员
- 积分
- 388
- 威望
- 217
- 贡献
- 99
- 兑换币
- 121
- 注册时间
- 2013-6-1
- 在线时间
- 36 小时
- 毕业学校
- 燕山大学
|
1贡献
想用I2C写L3G4200但是不成功,读取那个寄存器都是0XD3···········把陀螺仪拔出来也是0xd3··········无语了····写入和读取
/**
* --------------基于"拉普兰德K60底层库V3"的工程(LPLD_MAG3110)-----------------
* @file LPLD_MAG3110.c
* @version 0.2[By LPLD]
* @date 2013-10-3
* @brief 利用I2C模块,读取MAG3110三轴地磁传感器的值。
*
* 版权所有:北京拉普兰德电子技术有限公司
*
* mail:support@lpld.cn
* 硬件平台: LPLD K60 Card / LPLD K60 Nano
*
* 本工程基于"拉普兰德K60底层库V3"开发,
* 所有开源代码均在"lib"文件夹下,用户不必更改该目录下代码,
* 所有用户工程需保存在"project"文件夹下,以工程名定义文件夹名,
* 底层库使用方法见相关文档。
*
*/
#include "common.h"
//包含MAG3110设备头文件
#include "L3G4200.h"
/****************************************
说明:
*将MAG3110的SCL引脚连接开发板的PTB0引脚
将MAG3110的SDA引脚连接开发板的PTB1引脚
将MAG3110的VCC和GND分别接开发板的3V3和GND
*将MiniUSB线插入RUSH Kinetis开发板的USB
插座,并连接至电脑USB接口。
*使用串口调试助手波特率设置为115200
*使用串口调试助手查看运行结果
*摆动MAG3110来观察输出值的变化
****************************************/
//*****************************************************************
//初始化L3G4200D,根据需要请参考pdf进行修改************************
uint8 InitL3G4200D()
{
uint8 device_id;
I2C_InitTypeDef i2c_init_param;
//初始化MAG3110_I2CX
i2c_init_param.I2C_I2Cx = L3G4200_I2CX; //在DEV_MAG3110.h中修改该值
i2c_init_param.I2C_ICR = L3G4200_SCL_400KHZ; //可根据实际电路更改SCL频率
i2c_init_param.I2C_SclPin = L3G4200_SCLPIN; //在DEV_MAG3110.h中修改该值
i2c_init_param.I2C_SdaPin = L3G4200_SDAPIN; //在DEV_MAG3110.h中修改该值
i2c_init_param.I2C_IntEnable = FALSE;
i2c_init_param.I2C_Isr = NULL;
i2c_init_param.I2C_OpenDrainEnable = FALSE;
LPLD_I2C_Init(i2c_init_param);
L3G4200_WriteReg(CTRL_REG1, 0xff); //0000 1111
L3G4200_WriteReg(CTRL_REG2, 0x00);
L3G4200_WriteReg(CTRL_REG3, 0x08);
L3G4200_WriteReg(CTRL_REG4, 0x10);//量程 500
L3G4200_WriteReg(CTRL_REG5, 0x00);
device_id =L3G4200_ReadReg(WHO_AM_I);
return device_id;
}
void L3G4200_WriteReg(uint8 RegisterAddress, uint8 Data)
{
unsigned long int time_out;
//发送从机地址
LPLD_I2C_Start(L3G4200_I2CX);
LPLD_I2C_WriteByte(L3G4200_I2CX, L3G4200_DEV_WRITE);
while(!(L3G4200_I2CX->S & I2C_S_IICIF_MASK))
{
if(time_out>60000) //如果等待超时,强行退出
{
printf("从机寻址超时");
break;
}
else time_out++;
}
L3G4200_I2CX->S |= I2C_S_IICIF_MASK;
//写MAG3110寄存器地址
LPLD_I2C_WriteByte(L3G4200_I2CX, RegisterAddress);
while(!(L3G4200_I2CX->S & I2C_S_IICIF_MASK))
{
if(time_out>80000) //如果等待超时,强行退出
{
printf("写时写寄存器地址超时");
break;
}
else time_out++;
}
L3G4200_I2CX->S |= I2C_S_IICIF_MASK;
//向寄存器中写具体数据
LPLD_I2C_WriteByte(L3G4200_I2CX, Data);
while(!(L3G4200_I2CX->S & I2C_S_IICIF_MASK))
{
if(time_out>80000) //如果等待超时,强行退出
{
printf("写数据超时");
break;
}
else time_out++;
}
L3G4200_I2CX->S |= I2C_S_IICIF_MASK;
LPLD_I2C_Stop(L3G4200_I2CX);
L3G4200_Delay(); L3G4200_Delay();
}
uint8 L3G4200_ReadReg(uint8 RegisterAddress)
{
uint8 result;
unsigned long int time_out;
//发送从机地址
LPLD_I2C_Start(L3G4200_I2CX);
LPLD_I2C_WriteByte(L3G4200_I2CX,L3G4200_DEV_WRITE);
while(!(L3G4200_I2CX->S & I2C_S_IICIF_MASK))
{
if(time_out>60000) //如果等待超时,强行退出
{
printf("从机寻址超时");
break;
}
else time_out++;
}
L3G4200_I2CX->S |= I2C_S_IICIF_MASK;
//写MAG3110寄存器地址
LPLD_I2C_WriteByte(L3G4200_I2CX, RegisterAddress);
while(!(L3G4200_I2CX->S & I2C_S_IICIF_MASK))
{
if(time_out>80000) //如果等待超时,强行退出
{
printf("读时写寄存器地址超时");
break;
}
else time_out++;
}
L3G4200_I2CX->S |= I2C_S_IICIF_MASK;
LPLD_I2C_ReStart(L3G4200_I2CX);//再次产生开始信号
LPLD_I2C_WriteByte(L3G4200_I2CX, L3G4200_DEV_READ);//发送从机地址和读取位
while(!(L3G4200_I2CX->S & I2C_S_IICIF_MASK))
{
if(time_out>60000) //如果等待超时,强行退出
{
printf("从机重启超时");
break;
}
else time_out++;
}
L3G4200_I2CX->S |= I2C_S_IICIF_MASK;
//转换主机模式为读
LPLD_I2C_SetMasterWR(L3G4200_I2CX, I2C_MRSW);
//关闭应答ACK
LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_OFF);//关闭ACK
//读IIC数据
result =LPLD_I2C_ReadByte(L3G4200_I2CX);
//关闭应答ACK
//LPLD_I2C_WaitAck(L3G4200_I2CX, I2C_ACK_OFF);//关闭ACK
//result =LPLD_I2C_ReadByte(L3G4200_I2CX);
//发送停止信号
LPLD_I2C_Stop(L3G4200_I2CX);
L3G4200_Delay(); L3G4200_Delay();
return result;
}
void L3G4200_Delay(void)
{
int n;
for(n=1;n<1000;n++) {
asm("nop");
}
}
|
|