SYD8821 IIC模块使用说明

2023-05-16

 

SYD8821是具有全球领先低功耗(RX 2.4mA @-94.5dBm灵敏度,TX 4.3mA @0dBm输出功率)的蓝牙低功耗SOC芯片,在极低电流下实现了优异的射频性能,搭配176kB SRAM,512kB flash,非常适合中高阶可穿戴、智能家居、物联网等低功耗应用具体可咨询:http://www.sydtek.com/

 

SYD8821 IIC模块使用说明

 

   IIC测试必须要一个从机设备,单单SYD8821芯片是不可能实现的了,这里的从机设备采用KX022加速度传感器,SYD8821和KX022传感器的电路连接图如下:

 

  一共有六个管脚和GSENSOR连接,分别是;

  两个中断管脚:GPIO19/INT1_G ,GPIO18/INT2_G
 四个SPI的管脚:GPIO21/G-SDA ,GPIO20/G-SCL,GPIO15/SDO,GPIO17/CS

 这里是用IIC和该传感器连接,所以GPIO15固定拉低,GPIO17固定拉高

   打开工程“\SYD8821\SYD8821_SDK\Source Code\SYD8821\iic”可看到IIC的初始化配置如下:

int main()
{    
    uint8_t iic_buff[32]={0};
    int16_t x,y,z;
    uint16_t i=0;
    float vat=0.0;
    __disable_irq();
    //GPO
    pad_mux_write(LED4, 0);
    pad_mux_write(LED5, 0);
    pad_mux_write(LED6, 0);
    pad_mux_write(LED7, 0);
    gpo_config(LED4,1);
    gpo_config(LED5,1);
    gpo_config(LED6,1);
  gpo_config(LED7,1);
    
    //GPI
    pad_mux_write(KEY1, 0);
    pad_mux_write(KEY2, 0);
    pad_mux_write(KEY3, 0);
    gpi_config(KEY1, PULL_UP);
    gpi_config(KEY2, PULL_UP);
    gpi_config(KEY3, PULL_UP);

  //uart 0
    pad_mux_write(12, 7);
    pad_mux_write(13, 7);
    dbg_init();
    dbg_printf("SYD8821 IIC DEMO\r\n");

  //kx022 gsensor SDA AND CS LOW
    pad_mux_write(15, 0);  
    gpo_config(15,0);                         //固定拉低
    pad_mux_write(17, 0);  
    gpo_config(17,1);                         //固定拉高
    
    // IIC
    pad_mux_write(20, 6); //i2c 1 scl       //管脚选择为IIC功能
    pad_mux_write(21, 6); //i2c 1 sda     // 管脚选择为IIC功能

    /* Masters Init M0*/
    //set i2c clk rate param 0, (48/8)*50K=300k
    i2c_master_set_speed(1, 0);     //设置速度为480K
    i2c_master_enable(1, true);       //使能IIC模块
    i2c_master_enable_int(1, true);    //使能IIC中断 不过这里没有使用中断的功能
    i2c_master_set_address_mode(1, I2C_MASTER_1BYTE_ADDRESS);     //设置地址模式,这里的传感器寄存器地址为1个字节
    NVIC_EnableIRQ(I2CM0_IRQn);    //使能中断
    
    if(kx022_init()) dbg_printf("kx022 init succeed\r\n");     //进行传感器的初始化
    else dbg_printf("kx022 init faild\r\n");

    __enable_irq();
    while(1)
    {
        gpo_toggle(LED4);
        
                /*
        计算公式:加速度 = 读到的原始值 * 8000mG / 65536 / 1000  
        其中的8000mG是这样的:本例程的测量量程是 +-4G  也就是正负4G的范围,这里是在Resolution/Range寄存器里设置的
        那么所能读到的最大数据是65536,也就是说每个数据的刻度是 8000/65536 mg
        */
        gensor_read_xyz(&x, &y, &z);    //读取传感器的值
        vat=(float)x*8000/65536/1000;
        dbg_printf("x : %02x vat: %4.3f i:%d\r\n",x,vat,i);
        vat=(float)y*8000/65536/1000;
        dbg_printf("y : %02x vat: %4.3f i:%d\r\n",y,vat,i);
        vat=(float)z*8000/65536/1000;
        dbg_printf("z : %02x vat: %4.3f i:%d\r\n",z,vat,i);
        delay_ms(500);
        i++;

        delay_ms(1000);
    }        
}

    下面看看kx022_init源码:

uint8_t  kx022_init(void)
{
    uint8_t i,st;     
    kx022_write_reg(0x00, 0x24);  
    for(i=0; i<(sizeof(kx022_init_data)); i+=2)
    {
        kx022_write_reg(kx022_init_data[i], kx022_init_data[i+1]);
    }
    kx022_read_reg(KX022_INT_REL, &st);
    kx022_read_reg(KX022_WHO_AM_I_REG, &st);
    
    if(st == 0x14) return 1;
    #ifdef CONFIG_UART_ENABLE
    dbg_printf("WHO I ME: %4X \r\n",st);
    #endif
    return 0;
}

    其中主要调用kx022_read_reg和kx022_write_reg对传感器的寄存器进行初始化,这两个函数的源码如下:

/*
kx022写寄存器函数
参数: uint8_t addr  寄存器地址
             uint8_t value 寄存器数据
注意ID地址不作为传入参数 已经在全部变量定义好了
*/
void kx022_write_reg(uint8_t addr, uint8_t value)
{    
    __align(4) uint8_t val=0;
    val=value;
    i2c_write(1,I2C_ID_KX022,addr,&val,0x01);
}
/*
kx022读寄存器函数
参数: uint8_t addr  寄存器地址
             uint8_t value 读到的内容
注意ID地址不作为传入参数 已经在全部变量定义好了
*/
void kx022_read_reg(uint8_t addr, uint8_t *p_value)
{
    __align(4) uint8_t val=0;
    i2c_read(1,I2C_ID_KX022,addr,&val,0x01);
    *p_value=val;
}

    主要调用i2c_write和i2c_read读进行实际的操作,这里都是操作一个字节!

    当然还有操作多个字节的,比如读取加速度值得gensor_read_xyz函数:

/*
kx022获取加速度传感器三个轴的数据函数
传入参数:uint16_t *p_x X轴数据存储指针
                    uint16_t *p_y y轴数据存储指针
                    uint16_t *p_z z轴数据存储指针
*/
void gensor_read_xyz(int16_t *p_x, int16_t *p_y, int16_t *p_z)
{
//        uint8_t st;
//        uint8_t val[2];
//        int16_t x,y,z;
//            kx022_read_reg(KX022_X_OUTL_REG, &val[0]);
//            kx022_read_reg(KX022_X_OUTL_REG+1, &val[1]);
//            x = (val[0]) | ((int16_t)val[1] << 8);
//            kx022_read_reg(KX022_Y_OUTL_REG, &val[0]);
//            kx022_read_reg(KX022_Y_OUTL_REG+1, &val[1]);
//            y = (val[0]) | ((int16_t)val[1] << 8);
//            kx022_read_reg(KX022_Z_OUTL_REG, &val[0]);
//            kx022_read_reg(KX022_Z_OUTL_REG+1, &val[1]);
//            z = (val[0]) | ((int16_t)val[1] << 8);
//            
//            *p_x=x;
//            *p_y=y;
//            *p_z=z;

        uint8_t st;
        __align(4) uint8_t val[6];
    
        kx022_read_nreg(KX022_X_OUTL_REG, val,6);
        *p_x = (val[0]) | ((int16_t)val[1] << 8);
        *p_y = (val[2]) | ((int16_t)val[3] << 8);
        *p_z = (val[4]) | ((int16_t)val[5] << 8);
}       

     这里一次获取了6个寄存器的值,这里IIC只有32个byte,所以最多一次只能够读取32个字节的数据!

 

    IIC测试如果没有挂接从机设备,那么时序如下:

    可以看到从机没有应答,时序停止,挂机从机设备后结果如下:

    可以看到正确的完整的时序,下面是gensor_read_xyz函数中注释的部分打开的时候的时序图,每次读取一个寄存器的值,知道读完六个寄存器:

     下面是上面的gensor_read_xyz函数产生的时序:

 

这里上传逻辑分析仪数据;https://download.csdn.net/download/chengdong1314/10304560

 

这里上传本节博客源代码:https://download.csdn.net/download/chengdong1314/10304570

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SYD8821 IIC模块使用说明 的相关文章

  • STM32 HAL库 STM32CubeMX -- I2C(IIC)

    文章目录 一 I2C 协议简介I2C 物理层I2C协议层I2C架构通讯过程 二 STM32Cube MX配置三 I2C HAL库函数 一 I2C 协议简介 I2C 通讯协议 Inter xff0d Integrated Circuit 也就
  • LPC1768 IIC通信示——PCF8563

    PCF8563与AT24C02一样 xff0c 是典型的IIC通信器件 xff0c 这里就以它为例 xff0c 编写基于LPC1768硬件IIC的通信代码 xff1a 上图是PCF8563各个寄存器地址 xff0c PCF8563的IIC地
  • STM32基于IIC协议的OLED模块的使用

    前言 一 项目涉及的内容 项目简介 二 模块实操 1 IIC模块 1 1 IIC协议格式 1 2 开始信号与停止信号 1 3 写数据 1 3 1 硬件IIC代码编写 1 3 2 软件模拟IIC代码编写 2 OLED板块 前言 本篇文章对使用
  • IIC通讯详解笔记

    IIC概述 IIC总线是一种串行半双工两线总线 一根是双向的数据线SDA xff0c 另一根是时钟线SCL 所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上 xff0c 各设备的时钟线SCL接到总线的SCL上 硬件拓扑如下图所示
  • IIC通信协议

    IIC通信协议 一 什么是IIC通信协议 xff1f 二 IIC协议时序分析1 空闲状态2 起始信号和停止信号3 数据传输 xff08 1 xff09 写操作 字节写 xff08 2 xff09 写操作 页写 xff08 3 xff09 读
  • IIC通讯总结

    1 IIC简介 IIC全称Inter Integrated Circuit 是由PHILIPS公司在80年代开发的两线式串行总线 xff0c 用于连接微控制器及其外围设备 IIC属于半双工同步通信方式 2 IIC特点 xff08 1 xff
  • 基于STM32平台的BMP180测试(模拟IIC)

    1 测试描述 xff1a 使用模拟IIC xff0c 从BMP180中获取ID号 温度值 气压值以及计算海拔高度 2 测试准备 xff1a 硬件平台 xff1a 原子战舰V3开发板 测试工具 xff1a 逻辑分析仪 串口调试工具 3 数据手
  • STM32 模拟IIC驱动MS5607气压传感器调试记录

    标题 STM32 模拟IIC驱动MS5607调试记录 因项目需求 xff0c 需使用MS5607的作为检测气压 xff0c 再此写下自己遇见的问题以及调试记录 硬件原理图如下 xff1a IIC接口总线使用了气压传感器 xff0c SHT3
  • IIC上拉电阻的选择

    上周项目评审的时候 xff0c 评审部门问了我一个问题 xff1a 为什么单片机内部有上拉电阻 xff0c 你们还要用外部的上拉电阻 xff1f 我的答复如下 xff1a 上拉电阻的选取要考虑上限值和下限值这两点 xff1a 上限值的最大限
  • iic片选PCA9548A芯片

    PCA9548A数据表 产品信息和支持 TI com iic片选深入 从上图中我们可以看到通过iic的iic 例如 iic0 扩展出8路iic来访问slave 例如8个口的光模块 那么里面的原理是什么呢 我们先来看PCA9548A 文档 需
  • 通信协议(三)——IIC协议

    1 基础知识 1 1 概念 IIC通讯协议 Inter xff0d Integrated Circuit xff0c 也常被写作I2C 是由 Philips 公司开发的一种简单 双向二线制同步串行总线 xff0c 只需要两根线即可在连接于总
  • SYD8821 IIC模块使用说明

    SYD8821是具有全球领先低功耗 RX 2 4mA 64 94 5dBm灵敏度 xff0c TX 4 3mA 64 0dBm输出功率 的蓝牙低功耗SOC芯片 xff0c 在极低电流下实现了优异的射频性能 xff0c 搭配176kB SRA
  • 总线协议一(UART/RS232/RS485/IIC/SPI)

    目录 基础概述 xff1a 一 UART xff08 为串口通信方式 xff09 二 RS232协议 三 RS485协议 四 I2C总线协议 五 SPI总线 六 I2C和SPI的区别 基础概述 xff1a 总线的本质就是一根导线 xff0c
  • STM32软件模拟iic驱动oled(显示汉字,图片)(二)

    在上一篇介绍的软件模拟iic及iic源码后 xff0c 今天来实现显示汉字与图片以及各个函数的介绍 一 函数介绍及使用 1 显示字符 OLED ShowStr unsigned char x unsigned char y unsigned
  • 通信协议详解(二):IIC总线协议(传输时序+数据格式+设计实现)

    文章目录 一 IIC xff08 Inter Integrated Circuit xff09 介绍二 传输协议1 时序传输时序写操作时序数据有效性开始 amp 结束信号从机应答信号 2 数据格式 三 设计实现1 时钟2 传输过程3 三态门
  • UART,SPI,IIC,RS232通信时序和规则

    一 UART 1 串口通信方式 2 串口通信步骤 注意 xff1a 串口协议规定 xff0c 闲置时必须是高电平 校验位 xff1a 是使用奇偶校验 停止位必须高电平 一个0和多个0区分是靠掐时间 异步通信 xff1a 时钟各不一样 二 I
  • 12.RTT-IIC设备-AHT10温湿度传感器

    本系列博客更新结束啦 xff01 完结啦 xff01 xff01 xff01 撒花 xff01 xff01 xff01 关于RTT的设备和驱动专题更新完毕啦 xff0c 本期是最后一期 一段学习旅途的结束意味着下一段学习冒险的开始 虽然本系
  • AT24C02的使用说明和完整代码-51单片机

    AT24C02的使用说明和完整代码 51单片机 简述 at24c02为存储器芯片 可以使用单片机将数据存入其中 同时也可以任意读取 at24c02的原理及使用方法在其说明资料中已有充分的讲述 本篇仅对其使用的关键步骤进行罗列 以及说明一下具
  • 基于STM32 的IIC 模拟主机编写

    最近在学习STM32 的IIC IO 模拟主机方式 好像失败了 include myiic h include delay h MCU VERSION DATA 作者 other Function IIC
  • I2C与SPI通信总线协议

    仅以寄存器地址为8Bit的器件为例 例如MPU6500 LSM6DS3 I2C通信协议 I2C 的要点是了解I2C通信帧的组成部分 START起始位 STOP停止位 ACK NACK信号 从机器件地址 从机寄存器地址 I2C读的时序比较繁琐

随机推荐

  • Mac上安装Node Exporter

    文章目录 安装Node Exporter方法一 xff1a 手动安装方法二 xff1a docker安装 运行测试 node exporter 可以采集机器 xff08 物理机 虚拟机 云主机等 xff09 的监控指标数据 xff0c 能够
  • Docker安装Grafana

    文章目录 Grafana介绍拉取镜像准备相关挂载目录及文件启动容器访问测试添加 Prometheus 数据源常见问题 看板配置 Grafana介绍 上篇博客介绍了prometheus的安装 xff1a Docker部署Prometheus
  • Springboot应用接入Prometheus监控

    文章目录 接入介绍操作步骤修改应用的依赖及配置步骤1 xff1a 修改 pom 依赖步骤2 xff1a 修改配置 本地验证prometheus配置 接入介绍 在使用 Spring Boot 作为开发框架时 xff0c 需要监控应用的状态 x
  • Spring Boot自带监控组件—Actuator介绍

    文章目录 Actuator介绍启用与暴露的区别Spring Boot集成Actuator应用监控框架Actuator监控端点启用端点端点的默认暴露规则案例 自定义端点 Actuator介绍 Actuator是Spring Boot提供的应用
  • Git Commit提交规范总结

    文章目录 前言git commit 提交规范提交消息头 commit message header 提交消息具体内容 commit message body 提交消息尾述 commit message footer Revert 表情 Em
  • 常用kubectl命令总结

    文章目录 配置kubeconfig帮助信息命令查看具体某一个命令的帮助信息列出全局的选项参数 xff08 适用所有的命令 xff09 显示合并的 kubeconfig 配置或一个指定的 kubeconfig 文件 基本命令罗列所支持的完整资
  • 解决:org.apache.catalina.connector.ClientAbortException: java.io.IOException: 断开的管道

    文章目录 项目场景问题描述原因分析解决方案 项目场景 jdk11 Spring Boot 2 x 项目 xff0c Tomcat容器 Nginx 问题描述 系统日志中 xff0c 时不时会出现下面的异常信息 xff1a org apache
  • 解决:No converter for [xxxx] with preset Content-Type ‘text/plain;version=0.0.4;charset=utf-8‘

    文章目录 项目背景问题描述问题分析解决方案方案一 xff1a 修改Controller定义方案二 xff1a 修改Controller返回值方案三 xff1a 全局处理 项目背景 Spring Boot 2 X 问题描述 错误信息如下 xf
  • SYD8821 串口模块使用说明【串口0中断要屏蔽底层调用】

    SYD8821是具有全球领先低功耗 RX 2 4mA 64 94 5dBm灵敏度 xff0c TX 4 3mA 64 0dBm输出功率 的蓝牙低功耗SOC芯片 xff0c 在极低电流下实现了优异的射频性能 xff0c 搭配176kB SRA
  • MySQL的information_schema库下的常用sql

    文章目录 information schema TABLES查看该数据库实例下所有库大小 MB为单位 查看该实例下各个库大小 MB为单位 查看表大小 MB为单位 熟练使用 information schema库里的表 显示在库里的表 xff
  • shell脚本批量转文件格式:dos2unix

    文章目录 可以使用shell脚本实现 xff1a span class token shebang important bin sh span span class token assign left variable dir span s
  • 解决:com.atomikos.icatch.SysException: Error in init: Log already in use? tmlog in ./

    文章目录 项目场景问题描述原因分析详细分析 解决方案 项目场景 Spring Boot 2 x xff0c 集成 atomikos 问题描述 今天在同一个环境启动两个项目时报错 xff0c 因为两个项目同时涉及到分布式事物和切换数据源相关
  • Nginx日志介绍

    文章目录 access log日志流量统计 access log 日志文件一般存放在 var log nginx 下 xff0c 可以使用 tail f命令查看access日志 span class token function tail
  • JVM (Micrometer)-4701面板参数介绍

    文章目录 Quick Facts 概览 堆和非堆内存有以下几个概念 I O Overview xff08 服务黄金指标 xff09 JVM Memory xff08 JVM内存 xff09 JVM Misc xff08 JVM负载 xff0
  • curl文件传输命令

    CURL curl transfer a URL curl 是一个利用URL语法在命令行下工作的文件传输工具 支持文件上传和下载 格式 curl options URLs URL xff1a 通过大括号指定多个url 示例 xff1a cu
  • RS-485信号解析

    这次来看看RS 485信号 使用绿联的USB转RS485模块 线用的颜色不对 xff0c 类型也不对 xff0c 实际使用中请用带屏蔽层的双绞线 示波器CH1是R xff08 B xff09 示波器CH2是R 43 xff08 A xff0
  • T t与T t = T()的区别

    主要的区别就是默认构造函数对内置类型的初始化上 如果没有T中没有定义构造函数 xff0c 则对于 T t xff0c 并不会对 t 中内置类型设置初始值 xff0c 是一个随机值 但对于 T t 61 T xff0c 对 t 中内置类型会设
  • Effective STL:杂记(一)

    1 避免使用vector lt bool gt vector lt bool gt 实际上并不能算是一个STL容器 xff0c 实际上也并不存储bool 因为一个对象要成为STL容器 xff0c 就必须满足C 43 43 标准的第23 1节
  • 限制长度双向链表的插入操作

    面试遇到的问题 xff0c 一开始面试官是问我有什么方案可以实现排行榜 xff0c 当时给出了两个方案 后面面试官又在我的其中一种方案上让我手写代码实现排序双线链表的插入 xff0c 根据score值插入 xff0c 并且链表长度限制在10
  • SYD8821 IIC模块使用说明

    SYD8821是具有全球领先低功耗 RX 2 4mA 64 94 5dBm灵敏度 xff0c TX 4 3mA 64 0dBm输出功率 的蓝牙低功耗SOC芯片 xff0c 在极低电流下实现了优异的射频性能 xff0c 搭配176kB SRA