一、学习说明

感觉就是配置I2C通信,然后直接移植51代码。。。

二、代码分享:

1、头文件:

#ifndef I2C_GYRO_H_
#define I2C_GYRO_H_ /***********函数声明***********/ extern void Gyro_Init(void);
extern void Read_GY(void); /*****************************/ /***********全局变量声明***********/ extern float Gyro_X ;
extern float Gyro_Y ;
extern float Gyro_Z ; /*********************************/ #endif

2、源文件:

#include "include.h"
#include "common.h"
#include "gpio.h"
#include "I2C_GYRO.h"
#include "lptmr.h" /***********管脚声明***********/ #define L3G_S_I2C_SDA (PTE21)//(PTB3)//(PTE0) //(PTE22)//(PTC1)//
#define L3G_S_I2C_SCL (PTE5)//(PTB2)//(PTE1)//(PTE20)//(PTC0)// /*****************************/ //IO方向设置
#define L3G_I2C_SDA_IN() DDRE21 = 0//输入模式
#define L3G_I2C_SDA_OUT() DDRE21 = 1//输出模式 //IO操作函数
#define L3G_I2C_SCL PTE5_OUT //SCL
#define L3G_I2C_SDA PTE21_OUT //SDA
#define L3G_I2C_READ_SDA PTE21_IN //输入SDA /***********全局变量声明***********/
float Gyro_X = 0;
float Gyro_Y = 0;
float Gyro_Z = 0;
/********************************/ //**********L3G4200D内部寄存器地址*********
#define L3G_WHO_AM_I 0x0F
#define L3G_CTRL_REG1 0x20
#define L3G_CTRL_REG2 0x21
#define L3G_CTRL_REG3 0x22
#define L3G_CTRL_REG4 0x23
#define L3G_CTRL_REG5 0x24
#define L3G_REFERENCE 0x25
#define L3G_OUT_TEMP 0x26
#define L3G_STATUS_REG 0x27
#define L3G_OUT_X_L 0x28
#define L3G_OUT_X_H 0x29
#define L3G_OUT_Y_L 0x2A
#define L3G_OUT_Y_H 0x2B
#define L3G_OUT_Z_L 0x2C
#define L3G_OUT_Z_H 0x2D
#define L3G_FIFO_CTRL_REG 0x2E
#define L3G_FIFO_SRC_REG 0x2F
#define L3G_INT1_CFG 0x30
#define L3G_INT1_SRC 0x31
#define L3G_INT1_TSH_XH 0x32
#define L3G_INT1_TSH_XL 0x33
#define L3G_INT1_TSH_YH 0x34
#define L3G_INT1_TSH_YL 0x35
#define L3G_INT1_TSH_ZH 0x36
#define L3G_INT1_TSH_ZL 0x37
#define L3G_INT1_DURATION 0x38
//****************************************
#define L3G_SlaveAddress 0xD2 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
#define L3G_SlaveAddfire 0x69 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改 //============================================================================
//函数名称:void L3G_I2C_Config(void)
//函数返回:无
//参数说明:无
//功能概要:配置I2C管脚
//============================================================================
void L3G_I2C_Config(void)
{
//L3G_I2C_SDA_OUT();
gpio_init(L3G_S_I2C_SDA,GPO,0);
gpio_init(L3G_S_I2C_SCL,GPO,1); L3G_I2C_SCL=1;
L3G_I2C_SDA=1;
} //============================================================================
//函数名称:void L3G_I2C_Start(void)
//函数返回:无
//参数说明:无
//功能概要:I2C启动
//============================================================================
void L3G_I2C_Start(void)
{
L3G_I2C_SDA_OUT();
L3G_I2C_SDA=1;
L3G_I2C_SCL=1;
lptmr_delay_us(1);
L3G_I2C_SDA=0;
lptmr_delay_us(1);
L3G_I2C_SCL=0;
} //============================================================================
//函数名称:void L3G_I2C_Stop(void)
//函数返回:无
//参数说明:无
//功能概要:I2C停止
//============================================================================
void L3G_I2C_Stop(void)
{
L3G_I2C_SDA_OUT();
L3G_I2C_SDA=0;
L3G_I2C_SCL=1;
lptmr_delay_us(1);
L3G_I2C_SDA=1;
lptmr_delay_us(1);
L3G_I2C_SCL=0;
} //============================================================================
//函数名称:void L3G_I2C_Mack(void)
//函数返回:无
//参数说明:无
//功能概要:
//============================================================================
void L3G_I2C_Mack(void)
{
L3G_I2C_SDA_OUT();
L3G_I2C_SDA=0;
L3G_I2C_SCL=1;
lptmr_delay_us(1);
L3G_I2C_SCL=0;
L3G_I2C_SDA=1;
} //============================================================================
//函数名称:void L3G_I2C_Mnack(void)
//函数返回:无
//参数说明:无
//功能概要:读取完的完成停顿信号
//============================================================================
void L3G_I2C_Mnack(void)
{
L3G_I2C_SDA_OUT();
L3G_I2C_SDA=1;
lptmr_delay_us(1);
L3G_I2C_SCL=1;
lptmr_delay_us(1);
L3G_I2C_SCL=0;
lptmr_delay_us(1);
//L3G_I2C_SDA=0;
} //============================================================================
//函数名称:uint8_t L3G_I2C_Cack(void)
//函数返回:无
//参数说明:无
//功能概要:发送间隔函数
//============================================================================
uint8_t L3G_I2C_Cack(void)
{
L3G_I2C_SDA_IN();
L3G_I2C_SCL=0;
lptmr_delay_us(1);
L3G_I2C_SCL=1;
lptmr_delay_us(1);
if(L3G_I2C_READ_SDA)
{
//L3G_I2C_Stop();
//return 0xff;
}
L3G_I2C_SCL=0;
L3G_I2C_SDA_OUT();
return 0;
} //============================================================================
//函数名称:void L3G_I2C_WriteByte(unsigned char data)
//函数返回:无
//参数说明:无
//功能概要:I2C发送一个字节的数据
//============================================================================
void L3G_I2C_WriteByte(unsigned char data)
{
unsigned char i=8;
L3G_I2C_SDA_OUT();
while(i--)
{
lptmr_delay_us(1);
if(data & 0x80)
L3G_I2C_SDA=1;
else
L3G_I2C_SDA=0;
lptmr_delay_us(1);
L3G_I2C_SCL=1;
lptmr_delay_us(1);
L3G_I2C_SCL=0;
data<<=1;
}
} //============================================================================
//函数名称:uint8_t L3G_I2C_ReadByte(void)
//函数返回:无
//参数说明:无
//功能概要:I2C接收一个字节的数据
//============================================================================
uint8_t L3G_I2C_ReadByte(void)
{
unsigned char i;
unsigned char data=0;
char temp;
L3G_I2C_SDA_IN();
for(i=0;i<8;i++)
{
data<<=1;
lptmr_delay_us(1);
L3G_I2C_SCL=1;
temp=L3G_I2C_READ_SDA;
if(temp)
data++;
lptmr_delay_us(1);
L3G_I2C_SCL=0;
}
return data;
} //============================================================================
//函数名称:uint8_t L3G_I2C_WR_REG(uint8_t dev_addr, uint8_t reg_addr, uint8_t writeData)
//函数返回:无
//参数说明:无
//功能概要:I2C向一个地址写一个数据
//============================================================================
uint8_t L3G_I2C_WR_REG(uint8_t dev_addr, uint8_t reg_addr, uint8_t writeData)
{
L3G_I2C_Start();
L3G_I2C_WriteByte(dev_addr);
L3G_I2C_Cack();
L3G_I2C_WriteByte(reg_addr);
L3G_I2C_Cack();
L3G_I2C_WriteByte(writeData);
L3G_I2C_Cack();
L3G_I2C_Stop(); return 0;
} //============================================================================
//函数名称:uint8_t L3G_I2C_RD_REG(uint8_t dev_addr, uint8_t reg_addr)
//函数返回:无
//参数说明:无
//功能概要:I2C从一个地址读一个数据
//============================================================================
uint8_t L3G_I2C_RD_REG(uint8_t dev_addr, uint8_t reg_addr)
{
uint8_t read_reg = 0;
L3G_I2C_Start();
L3G_I2C_WriteByte(dev_addr);
L3G_I2C_Cack();
L3G_I2C_WriteByte(reg_addr);
L3G_I2C_Cack();
L3G_I2C_Start();
L3G_I2C_WriteByte(dev_addr + 1);
L3G_I2C_Cack();
read_reg = L3G_I2C_ReadByte();
L3G_I2C_Mnack();
L3G_I2C_Stop(); return read_reg;
} //============================================================================
//函数名称:uint8_t L3G_I2C_RD_Buffer(uint8_t dev_addr, uint8_t reg_addr, uint8_t data_num, uint8_t *readBuffer)
//函数返回:无
//参数说明:无
//功能概要:I2C向一个地址写一连串数据
//============================================================================
uint8_t L3G_I2C_RD_Buffer(uint8_t dev_addr, uint8_t reg_addr, uint8_t data_num, uint8_t *readBuffer)
{
uint8_t i = 0;
L3G_I2C_Start();
L3G_I2C_WriteByte(dev_addr);
L3G_I2C_Cack();
L3G_I2C_WriteByte(reg_addr);
L3G_I2C_Cack();
L3G_I2C_Start();
L3G_I2C_WriteByte(dev_addr + 1);
L3G_I2C_Cack(); for(i = 0; i < data_num; i++){
*(readBuffer+i) = L3G_I2C_ReadByte();
if(i == data_num - 1)
L3G_I2C_Mnack();
else
L3G_I2C_Mack();
}
L3G_I2C_Stop(); return 0;
} //============================================================================
//函数名称:void Gyro_Init( __RAMFUNC void)
//函数返回:无
//参数说明:无
//功能概要://初始化为指定模式
//============================================================================
void Gyro_Init(void)
{
L3G_I2C_Config();
L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG1,0xcf); //数据手册30 0xbf 400hz 20~110截止频率
L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG2,0x20);//前两位00,后两位高通滤波器模式选择,后四位截止频率 0x29
L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG3,0x00);
L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG4,0x30);
L3G_I2C_WR_REG(L3G_SlaveAddress,L3G_CTRL_REG5,0x00);
} //============================================================================
//函数名称:void Read_GY(void)
//函数返回:无
//参数说明:无
//功能概要:陀螺仪传感器测量值读取接口
//============================================================================ uint8_t tmpBuffer[6] = {0}; void Read_GY(void)
{
//int16_t x_h = 0,x_l = 0,y_l = 0,y_h = 0,z_h = 0,z_l = 0;//Gyro_X = 0,Gyro_Y = 0,Gyro_Z = 0;
//Gyro_Init();
L3G_I2C_RD_Buffer(L3G_SlaveAddress,0xA8,6,tmpBuffer); /*
Gyro_X = ((short)((tmpBuffer[1]<<8)|tmpBuffer[0]))>>2;// 14位精度 Gyro_Y = ((short)((tmpBuffer[3]<<8)|tmpBuffer[2]))>>2;// 14位精度 Gyro_Z = ((short)((tmpBuffer[5]<<8)|tmpBuffer[4]))>>2;// 14位精度
*/ int temp; temp = ((short)((tmpBuffer[1]<<8)|tmpBuffer[0]))>>4;//2;// 14位精度 1g数值为1024(原本为4096,但是右移了(无效位2位)(有效位14位)两位)
Gyro_X = (double)Gyro_X*0.5+(double)temp*0.5; temp = ((short)((tmpBuffer[3]<<8)|tmpBuffer[2]))>>4;//2;// 14位精度
Gyro_Y = (double)Gyro_Y*0.5+(double)temp*0.5; temp = ((short)((tmpBuffer[5]<<8)|tmpBuffer[4]))>>4;//2;// 14位精度
Gyro_Z = (double)Gyro_Z*0.5+(double)temp*0.5;
}

智能车学习(十一)——陀螺仪学习的更多相关文章

  1. 智能车学习(十五)——K60野火2013版例程

    一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,);//定时中断初始化 set_vector_handler(PIT0_ ...

  2. 201521123061 《Java程序设计》第十一周学习总结

    201521123061 <Java程序设计>第十一周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 本周学习的是如何解决多线程访问中的互斥 ...

  3. 201521123072《java程序设计》第十一周学习总结

    201521123072<java程序设计>第十一周学习总结 1. 本周学习总结 2. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问 ...

  4. 201521123038 《Java程序设计》 第十一周学习总结

    201521123038 <Java程序设计> 第十一周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多 ...

  5. 杨其菊/常惠琢《面向对象程序设计(java)》第十一周学习总结

    <面向对象程序设计>第十一周学习总结 第一部分:理论知识 JAVA的集合框架 JAVA的集合框架实现对各种数据结构的封装,以降低对数据管理与处理的难度. 所谓框架就是一个类库的集合,框 ...

  6. 【转载】 强化学习(十一) Prioritized Replay DQN

    原文地址: https://www.cnblogs.com/pinard/p/9797695.html ------------------------------------------------ ...

  7. “2017面向对象程序设计(Java)第十一周学习总结”存在问题的反馈及教学安排

    “2017面向对象程序设计(Java)第十一周学习总结”存在问题的反馈及教学安排1.“提出表扬的同学:姜依萍,王雪玲,徐楠,相文君,赵晓未提交作业的同学:任红强,王瑞强,宗鹏新,扎西才让,布旦刀杰,范 ...

  8. 20172325 2017-2018-2 《Java程序设计》第十一周学习总结

    20172325 2017-2018-2 <Java程序设计>第十一周学习总结 教材学习内容总结 Android简介 Android操作系统是一种多用户的Linux系统,每个应用程序作为单 ...

  9. 20172330 2017-2018-1 《Java程序设计》第十一周学习总结

    20172330 2017-2018-1 <程序设计与数据结构>第十一周学习总结 教材学习内容总结 本周的学习内容为集合 Android简介 Android操作系统是一种多用户的Linux ...

  10. 孤荷凌寒自学python第八十一天学习爬取图片1

    孤荷凌寒自学python第八十一天学习爬取图片1 (完整学习过程屏幕记录视频地址在文末) 通过前面十天的学习,我已经基本了解了通过requests模块来与网站服务器进行交互的方法,也知道了Beauti ...

随机推荐

  1. centos7时间同步和时区设置

    centos7时间同步和时区设置 安装ntp服务的软件包 sudo yum install ntp 将ntp服务设置为缺省启动 systemctl enable ntpd 修改启动参数,增加-g -x ...

  2. Linux基础命令总结

    1.pwd  查看当前工作目录 2.ls [目录] 列出指定目录下的所有文件,使用 ls -l 或者 ll 列出文件详细列表包括权限.大小等文件默认大小以字节B为单位,目录大小为4096B  ls - ...

  3. Tomcat服务器绑定域名的配置

    前面写到过Linux下tomcat服务器的部署,实际上只要域名正常解析到了服务器,那么不用绑定域名也是可以正常访问的,比如默认情况下访问xxx.net:8080与www.xxx.net:8080都可以 ...

  4. python模块名和文件名冲突解决

    对于python初学者,很容易练习到一个随机数生成的程序,代码如下: #!/usr/bin/python import random print(random.randint(12,20)) 这个小程 ...

  5. code vs1517 求一次函数解析式(数论 纯数学知识)

    1517 求一次函数解析式  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解  查看运行结果     题目描述 Description 相信大家都做过练 ...

  6. List,Set,Map用法以及区别

    List,Set,Map是否继承自Collection接口? 答:List,Set是,Map不是. 如图: Collection ├List │├LinkedList │├ArrayList │└Ve ...

  7. SQL Server 子查询

    这些主要是老师上课讲的一些知识点,自己做了一些整理放在这里~~~ 子查询可以是标量的.多值的或是表值的. 在期待单个值的地方可以使用标量子查询.例如,以下查询返回具有最大员工编号的员工信息: SELE ...

  8. 20145213《Java程序设计》实验五Java网络编程及安全

    20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...

  9. java常用工具类(java技术交流群57388149)

    package com.itjh.javaUtil;   import java.util.ArrayList; import java.util.List;   /** * * String工具类. ...

  10. php继承、多态

    继承: 概念:子类可以继承父类的一切 特点:单继承:一个子类只能有一个父类,一个父类可以派生出多个子类 方法重写:在子类里面对父类的方法进行重写. 重写:override 重载,编译多态:overlo ...