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库IIC驱动

    1 STM32上IIC的一些争议 关于STM32的IIC驱动 xff0c 网上有很多争论 xff0c 究竟是使用STM32自带的硬件IIC还是用IO口和软件模拟IIC呢 xff1f 下面这个图形象展示了这些争论 总结一些 xff1a ST为
  • 对IIC总线时序的一点理解以及ACK和NACK(NAK)

    参考自 xff1a http blog chinaunix net uid 16100003 id 3059814 html 关于IIC的响应问题 xff1a 对于每一个接收设备 xff08 从设备 xff0c slaver xff09 x
  • 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板块 前言 本篇文章对使用
  • OLED显示屏驱动:8080并口,IIC,SPI三种驱动方式

    本文介绍了对OLED的几种驱动方式 xff0c 8080并口 xff0c IIC xff0c SPI三种驱动方式 xff0c 采用的单片机是STM32F407 文章目录 一 OLED驱动原理介绍二 8080并口驱动方式三 IIC驱动方式四
  • 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
  • argparse模块使用说明

    深度学习的工程中 xff0c py文件中的main函数一开始总会有大量的参数传入 xff0c 而通常使用的方法就是使用argparse通过命令行传入 xff0c 这篇博文旨在记录argparse的常用方法 一 语句简介 1 载入argpar
  • STM32F1 TCA9548A 驱动多个IIC器件

    TCA9548A的用途就是IIC扩展 xff0c 每个TCA9548A可以扩展出8路IIC TCA9548A芯片带有地址选择引脚A0 A1 A2 xff0c 根据高低电平不同 xff0c 从MCU的一路IIC最多可以接入8个TCA9548A
  • IIC详细解答+ 面试 + 代码

    目录 IIC背景提炼部分 xff08 面试 xff09 xff08 详解 43 代码 xff09 协议部分IIC部分初始化 IIC 的 IO 口IIC 开始信号IIC发送一个字节IIC 读一个字节响应ACK和非响应NACKIIC 停止信号
  • 通信协议(三)——IIC协议

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

    IIC的基本介绍 IIC总线的发展 xff1a 芯片间总线 xff08 Inter Interface Circuit xff0c IIC xff09 xff0c 是应用广泛的芯片间串行扩展总线 目前世界上采用的IIC总线一共有两个规范 x
  • IIC的地址

    7位寻址 在7位寻址过程中 xff0c 从机地址在启动信号后的第一个字节开始传输 xff0c 该字节的前7位为从机地址 xff0c 第8位为读写位 xff0c 其中0表示写 xff0c 1表示读 图1 xff1a 7位寻址 I2C总线规范规
  • SYD8821 串口模块使用说明【串口0中断要屏蔽底层调用】

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

    SYD8821是具有全球领先低功耗 RX 2 4mA 64 94 5dBm灵敏度 xff0c TX 4 3mA 64 0dBm输出功率 的蓝牙低功耗SOC芯片 xff0c 在极低电流下实现了优异的射频性能 xff0c 搭配176kB SRA
  • STM32软件模拟iic驱动oled(显示汉字,图片)(一)

    一 iic驱动模式 1 硬件驱动 xff1a 所谓硬件驱动就是使用STM32板子上固定的iic接口 xff0c 但是由于板载iic数量有限 xff0c 且大多和别的外设有引脚复用 xff0c 在别的外设使用的情况下还得通过重映射引到别的引脚
  • UART,SPI,IIC,RS232通信时序和规则

    一 UART 1 串口通信方式 2 串口通信步骤 注意 xff1a 串口协议规定 xff0c 闲置时必须是高电平 校验位 xff1a 是使用奇偶校验 停止位必须高电平 一个0和多个0区分是靠掐时间 异步通信 xff1a 时钟各不一样 二 I
  • AT24C02的使用说明和完整代码-51单片机

    AT24C02的使用说明和完整代码 51单片机 简述 at24c02为存储器芯片 可以使用单片机将数据存入其中 同时也可以任意读取 at24c02的原理及使用方法在其说明资料中已有充分的讲述 本篇仅对其使用的关键步骤进行罗列 以及说明一下具
  • I2C走线技巧、及上拉电阻、电源电压、总线电容三者间的函数关系

    目录 I2C总线PCB布线注意事项 博客其他文档可以学习 https www cnblogs com zhiqiang zhang I2C总线线路的走线方式 I2C器件与I2C总线的接线方式 I2C总线连接规范 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