上一篇我们将了树莓派的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通信相关推荐

  1. 树莓派3B+使用GPIO实现串口通信

    文章目录 介绍 方案介绍 串口配置的各种坑 配置步骤 启用串口ttyS0 关闭Console 测试 连线 编辑文件 运行代码 ttyS0串口权限 参考文献 介绍   由于项目原因需要使用树莓派连接串口 ...

  2. 利用树莓派(3B+)板载蓝牙(ble)实现与蓝牙热敏打印机的通信

    1.1运行环境 树莓派:型号为树莓派3B+,使用的镜像为:2018-04-18-raspbian-stretch.img 蓝牙打印机:深圳市邦贝特科技有限公司的DL58蓝牙热敏手持打印机 可二次开发的 ...

  3. 基于树莓派3b的嵌入式实验——蓝牙通信实验(python)

    1.实验内容 本实验以树莓派开发板作为控制板,通过树莓派的 USB 母座连接 USB 转串口模块,再使用 板载蓝牙连接蓝牙模块,通过蓝牙模块发送控制信息,板载蓝牙模块接收并点亮 LED 模块 上不同位 ...

  4. 树莓派3B+ 串口使用大全(实现串口通信功能)

    1.树莓派串口控制台功能 在2018-10-09-raspbian-stretch.img镜像中,要使用串口来调试设备,需要修改conig.txt文件. 1. sudo systemctl disab ...

  5. 树莓派cpu检测_【树莓派3B+测评】线程的挂起与恢复CPU温度检测

    [树莓派3B+测评]线程的挂起与恢复&CPU温度检测 [复制链接] 本帖最后由 donatello1996 于 2018-12-22 17:33 编辑 在TCP通信中,除了线程的创建和删除以外 ...

  6. 树莓派移植SX1278 LoRa通信--使用wiringPiSPI移植SPI通信接口

    一.SPI接口 树莓派3B+上的SPI接口如下所示,有两组SPI,分别由CE0和CE1来进行选择. 首先查看树莓派的SPI是否启用,在/dev查看是否有spidev0.0和spidev0.1 如果不存 ...

  7. 单片机串口控制树莓派3B播放HDMI视频,omxplayer,

    使用树莓派3B通过HDMI播放视频.并且使用串口去控制播放哪个视频. 1. 问题解耦 单片机串口控制树莓派3B播放视频? = 树莓派播放视频 + 单片机串口传参控制树莓派 树莓派播放视频:树莓派播放视 ...

  8. 树莓派3b接收USB串口数据并解析处理

    通过树莓派3b使用wiringPi接收串口数据,并对帧头帧尾进行判断,解析出符合帧协议的数据. 1. 帧头.帧尾.帧长度定义 我们在这里定义串口数据的帧头为 0x3A 0x3B,帧尾为 0x7E 0x ...

  9. 树莓派3b+串口配置

    前言 树莓派从大的方向来说一共出了3代,每一代的CPU外设基本相同,但内核不同,外设里面一共包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0) ...

最新文章

  1. python面向对象编程138讲_Python---面向对象编程-1
  2. 优化 Golang 分布式行情推送的性能瓶颈
  3. SignalR的使用
  4. C#WinForm WebBrowser (二) 实用方法总结
  5. java代码连接redis_java代码连接redis
  6. 裁员30%?互联网行业裁员力度进前三 求职竞争加剧
  7. Web端调用Outlook 的发信窗口
  8. 用python统计文章中单词出现的频次
  9. jni开发-java调用c函数,c调用java函数实现
  10. mysql 遍历二叉树_数据结构-二叉树遍历
  11. SharePoint2007文档的点击率统计
  12. 几种RIA技术(富互联网应用程序)比较
  13. android 9坚果r1,坚果R1、小米MIX2S、一加6对比评测 骁龙845旗舰怎么选?
  14. 螺钉螺母匹配问题---快速排序
  15. 超级学习者的6个习惯:快速深入地学习任何技能
  16. C语言代码质量与架构调整(三)
  17. 两个umijs/max项目使用微前端简单示例
  18. iOS 中将数据导出成Excel文件 ---- libxlsxwriter框架
  19. 室内施工图LiSP_CAD快速做室内设计图的技巧
  20. C++及数据结构复习笔记(十二)(列表)

热门文章

  1. 国外十大在线支付服务网站
  2. python分割文本_切分文本Python
  3. c语言 教学目标,c语言选择结构程序设计教学目标
  4. css -moz_moz-border-radius(CSS属性)
  5. Nginx配置SSL支持htpps访问
  6. nacos配置中心提示com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException UNAVAILABLE io exceptio
  7. iOS开发中SDK是什么?
  8. android 二维码扫描动画实现
  9. volatile关键字简单理解
  10. 阿里云虚拟机 php $_SESSION 失效问题