树莓派3B 之IIC通信
上一篇我们将了树莓派的uart通信。
本篇幅我们来讲一下,树莓派IIC通信。
读取slave 的数据。
依然我们用wirningPi库,驱动IIC 的引脚编号8/9,分别用作SDA/SCL。
我们用来读取陀螺仪模块的三个方向姿态角数据。
bsp_iic.cpp:
#include "jy901_Init.h"
#include <stdio.h>//读取到的原始角度
float x_angle = 0; // roll
float y_angle = 0; // pitch
float z_angle = 0; // yaw//===========================================================================
//使用何种滤波器
#define USE_MIDDLE_FILTER 1
#define USE_AVERAGE_FILTER 1 - USE_MIDDLE_FILTERstatic const int SIZE = 5; //排序数组长度
short x_f = 0;
short y_f = 0;
short z_f = 0;
short x_buff[SIZE],y_buff[SIZE],z_buff[SIZE];#if USE_MIDDLE_FILTER
/** bubble sort 冒泡法排序*/
void bubble_sort(short *data, short size)
{short i;short temp;while(size > 1){for(i = 0; i < size; i++){if(data[i] > data[i+1]){temp = data[i];data[i] = data[i+1];data[i+1] = temp;}}size--;}}//中值滤波器
short median_filter(short data[])
{short output;bubble_sort(data,SIZE);return output = data[SIZE/2];
}
#endif/*USE_MIDDLE_FILTER*/#if USE_AVERAGE_FILTER
//均值滤波器
short average_calculate(short *data, short size)
{int i,j,temp,sum = 0;short ave;for(j = 0; j < size; j++) //冒泡排序{for(i = j; i < size - j; i++){if(data[i] > data[i+1]){temp = data[i];data[i] = data[i+1];data[i+1] = temp;}}}for(i = 0; i < size; i++) //原本用来虑掉突变的最大最小值{sum += data[i];}ave = sum/(SIZE);return ave;
}short average_filter(short data[])
{short output;output = average_calculate(data,SIZE);return output;
}
#endif /*USE_AVERAGE_FILTER*/int fd;//初始化树莓派的IIC
void Bsp_Jy901Init(void)
{wiringPiSetup();fd = wiringPiI2CSetup(DEV_SLAVE);
}
//原始角度数据读取
static void Bsp_Jy901_SrcDataRead(short *roll_angSrc, short *pitch_angSrc, short *yaw_angSrc)
{
// int fd;// wiringPiSetup();
// fd = wiringPiI2CSetup(DEV_SLAVE);*roll_angSrc = wiringPiI2CReadReg16(fd, Roll);*pitch_angSrc = wiringPiI2CReadReg16(fd, Pitch);*yaw_angSrc = wiringPiI2CReadReg16(fd, Yaw);
}//数据采样
void sample_data(void)
{short i;short x_buff_efs[SIZE],y_buff_efs[SIZE],z_buff_efs[SIZE];static int first_time = 0;if(first_time == 0) //第一次开机读取五个数据{for(i = 0; i < SIZE; i++){Bsp_Jy901_SrcDataRead(&x_buff[i], &y_buff[i], &z_buff[i]);}first_time = 1;}for(i = 0; i < SIZE; i++) //先将读取的组数据放到备份缓冲区{x_buff_efs[i] = x_buff[i];y_buff_efs[i] = y_buff[i];z_buff_efs[i] = z_buff[i];}#if USE_MIDDLE_FILTERx_f = median_filter(x_buff_efs); //取出中间值y_f = median_filter(y_buff_efs);z_f = median_filter(z_buff_efs);
#endif
#if USE_AVERAGE_FILTERx_f = average_filter(x_buff_efs);y_f = average_filter(y_buff_efs);z_f = average_filter(z_buff_efs);
#endiffor(i = 0; i < SIZE-1; i++) // 依次左移,最后一位放新数据{x_buff[i] = x_buff[i+1];y_buff[i] = y_buff[i+1];z_buff[i] = z_buff[i+1];}Bsp_Jy901_SrcDataRead(&x_buff[SIZE-1], &y_buff[SIZE-1], &z_buff[SIZE-1]);}
//===========================================================================
//===============================MODE_CHANGE==================
/** mode change :* 0 6axis* 1 9axis */
void Bsp_Jy901ModeChg(int mode)
{wiringPiI2CWriteReg16(fd, AXIS_CHG, mode);
}//===============================MODE_CHANGE==================short roll_angle = 0;
short pitch_angle = 0;
short yaw_angle = 0;//循环获取原始角度原始数据
static void Bsp20180130_Jy901_SrcDataRead(void)
{roll_angle = wiringPiI2CReadReg16(fd, Roll);pitch_angle = wiringPiI2CReadReg16(fd, Pitch);yaw_angle = wiringPiI2CReadReg16(fd, Yaw);
}//最终输出角度
void Bsp_Jy901_AngOut(void)
{
// Bsp_Jy901_SrcDataRead();Bsp20180130_Jy901_SrcDataRead();x_angle = (roll_angle/32768.0)*181;y_angle = (pitch_angle/32768.0)*181;z_angle = (yaw_angle/32768.0)*181;}
bsp_iic.h
#ifndef JY901_INIT_H
#define JY901_INIT_H#include "wiringPiI2C.h"
#include "wiringPi.h"//从机地址
#define DEV_SLAVE 0x50//寄存器地址
#define SETUP_SAVE 0x00
#define CALSW 0x01
#define RSW 0x02
#define RRATE 0x03
#define BAUD 0x04
#define AXOFFSET 0x05
#define AYOFFSET 0x06
#define AZOFFSET 0x07
#define GXOFFSET 0x08
#define GYOFFSET 0x09
#define GZOFFSET 0x0a
#define HXOFFSET 0x0b
#define HYOFFSET 0x0c
#define HZOFFSET 0x0d
#define D0MODE 0x0e
#define D1MODE 0x0f
#define D2MODE 0x10
#define D3MODE 0x11
#define D0PWMH 0x12
#define D1PWMH 0x13
#define D2PWMH 0x14
#define D3PWMH 0x15
#define D0PWMT 0x16
#define D1PWMT 0x17
#define D2PWMT 0x18
#define D3PWMT 0x19
#define IICADDR 0x1a
#define LEDOFF 0x1b
#define GPSBAUD 0x1c#define YYMM 0x30
#define DDHH 0x31
#define MMSS 0x32
#define MS 0x33
#define AX 0x34
#define AY 0x35
#define AZ 0x36
#define GX 0x37
#define GY 0x38
#define GZ 0x39
#define HX 0x3a
#define HY 0x3b
#define HZ 0x3c#define Roll 0x3d
#define Pitch 0x3e
#define Yaw 0x3f#define TEMP 0x40
#define D0Status 0x41
#define D1Status 0x42
#define D2Status 0x43
#define D3Status 0x44
#define PressureL 0x45
#define PressureH 0x46
#define HeightL 0x47
#define HeightH 0x48
#define LonL 0x49
#define LonH 0x4a
#define LatL 0x4b
#define LatH 0x4c
#define GPSHeight 0x4d
#define GPSYAW 0x4e
#define GPSVL 0x4f
#define GPSVH 0x50
#define Q0 0x51
#define Q1 0x52
#define Q2 0x53
#define Q3 0x54#define DIO_MODE_AIN 0
#define DIO_MODE_DIN 1
#define DIO_MODE_DOH 2
#define DIO_MODE_DOL 3
#define DIO_MODE_DOPWM 4
#define DIO_MODE_GPS 5#define AXIS_6 0
#define AXIS_9 1
#define AXIS_CHG 0x24 //读写函数
void Bsp_Jy901Init(void);
void Bsp_Jy901ModeChg(int mode);
void Bsp_Jy901_AngOut(void);#endif // JY901_INIT_H
在这里面我们深究一下,可以知道IIC的内部实现部分被封装。
用户是看不到的,所以我们只能看到函数的借口封装。
由图中可以看到,IIC的读1byte/2byte全部都封装好了。
我们直接调用就可以了。
树莓派3B 之IIC通信相关推荐
- 树莓派3B+使用GPIO实现串口通信
文章目录 介绍 方案介绍 串口配置的各种坑 配置步骤 启用串口ttyS0 关闭Console 测试 连线 编辑文件 运行代码 ttyS0串口权限 参考文献 介绍 由于项目原因需要使用树莓派连接串口 ...
- 利用树莓派(3B+)板载蓝牙(ble)实现与蓝牙热敏打印机的通信
1.1运行环境 树莓派:型号为树莓派3B+,使用的镜像为:2018-04-18-raspbian-stretch.img 蓝牙打印机:深圳市邦贝特科技有限公司的DL58蓝牙热敏手持打印机 可二次开发的 ...
- 基于树莓派3b的嵌入式实验——蓝牙通信实验(python)
1.实验内容 本实验以树莓派开发板作为控制板,通过树莓派的 USB 母座连接 USB 转串口模块,再使用 板载蓝牙连接蓝牙模块,通过蓝牙模块发送控制信息,板载蓝牙模块接收并点亮 LED 模块 上不同位 ...
- 树莓派3B+ 串口使用大全(实现串口通信功能)
1.树莓派串口控制台功能 在2018-10-09-raspbian-stretch.img镜像中,要使用串口来调试设备,需要修改conig.txt文件. 1. sudo systemctl disab ...
- 树莓派cpu检测_【树莓派3B+测评】线程的挂起与恢复CPU温度检测
[树莓派3B+测评]线程的挂起与恢复&CPU温度检测 [复制链接] 本帖最后由 donatello1996 于 2018-12-22 17:33 编辑 在TCP通信中,除了线程的创建和删除以外 ...
- 树莓派移植SX1278 LoRa通信--使用wiringPiSPI移植SPI通信接口
一.SPI接口 树莓派3B+上的SPI接口如下所示,有两组SPI,分别由CE0和CE1来进行选择. 首先查看树莓派的SPI是否启用,在/dev查看是否有spidev0.0和spidev0.1 如果不存 ...
- 单片机串口控制树莓派3B播放HDMI视频,omxplayer,
使用树莓派3B通过HDMI播放视频.并且使用串口去控制播放哪个视频. 1. 问题解耦 单片机串口控制树莓派3B播放视频? = 树莓派播放视频 + 单片机串口传参控制树莓派 树莓派播放视频:树莓派播放视 ...
- 树莓派3b接收USB串口数据并解析处理
通过树莓派3b使用wiringPi接收串口数据,并对帧头帧尾进行判断,解析出符合帧协议的数据. 1. 帧头.帧尾.帧长度定义 我们在这里定义串口数据的帧头为 0x3A 0x3B,帧尾为 0x7E 0x ...
- 树莓派3b+串口配置
前言 树莓派从大的方向来说一共出了3代,每一代的CPU外设基本相同,但内核不同,外设里面一共包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0) ...
最新文章
- python面向对象编程138讲_Python---面向对象编程-1
- 优化 Golang 分布式行情推送的性能瓶颈
- SignalR的使用
- C#WinForm WebBrowser (二) 实用方法总结
- java代码连接redis_java代码连接redis
- 裁员30%?互联网行业裁员力度进前三 求职竞争加剧
- Web端调用Outlook 的发信窗口
- 用python统计文章中单词出现的频次
- jni开发-java调用c函数,c调用java函数实现
- mysql 遍历二叉树_数据结构-二叉树遍历
- SharePoint2007文档的点击率统计
- 几种RIA技术(富互联网应用程序)比较
- android 9坚果r1,坚果R1、小米MIX2S、一加6对比评测 骁龙845旗舰怎么选?
- 螺钉螺母匹配问题---快速排序
- 超级学习者的6个习惯:快速深入地学习任何技能
- C语言代码质量与架构调整(三)
- 两个umijs/max项目使用微前端简单示例
- iOS 中将数据导出成Excel文件 ---- libxlsxwriter框架
- 室内施工图LiSP_CAD快速做室内设计图的技巧
- C++及数据结构复习笔记(十二)(列表)
热门文章
- 国外十大在线支付服务网站
- python分割文本_切分文本Python
- c语言 教学目标,c语言选择结构程序设计教学目标
- css -moz_moz-border-radius(CSS属性)
- Nginx配置SSL支持htpps访问
- nacos配置中心提示com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException UNAVAILABLE io exceptio
- iOS开发中SDK是什么?
- android 二维码扫描动画实现
- volatile关键字简单理解
- 阿里云虚拟机 php $_SESSION 失效问题