0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用PSoC 6制作完整的测试系统来与BMI160进行通话

设计idea 来源:互联网 作者:佚名 2018-05-24 09:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

我一直在研究一系列PSoC 6项目,以准备一些新视频并在Embedded World上使用。对于其中一个项目,我需要一个动作敏感的遥控器......并且我们很方便地将一台博世BMI160运动传感器放到了CY8CKIT-062-BLE开发套件随附的新CY8CKIT-028-EPD屏蔽罩上。

在本文中,我将向您展示如何使用PSoC 6制作完整的测试系统来与BMI160进行通话。步骤是:

  1. 克隆博世BMI160驱动程序库

  2. 创建一个新的PSoC 6项目并添加驱动程序库

  3. 为博世驱动程序创建HAL

  4. 创建主要固件并进行测试

克隆博世BMI160驱动程序库

当我开始这个时,我知道董事会有一个运动传感器,但我不知道是什么样的。我假设它是基于I2C的传感器,所以我连接了桥接控制面板并探测I2C总线。但是这就是它所说的:

桥梁控制面板

那么......到底什么?然后,我看了看董事会,试图弄清楚发生了什么......低下,看看......我的电路板是在添加运动传感器之前完成的原型。这里是:

这里是一块带有传感器的电路板。

当我插入该板并使用Bridge Control Panel进行测试时,我会得到:

接下来我做的就是看原理图。OK,您可以看到惯性测量单元(IMU)是连接到I2C总线的BMI160。另一件很酷的事情是,devkit团队连接了两条中断线。这些线路通常用于IMU向PSoC 6发送信号(例如,用户可能开始移动)。

查看原理图后,下一步是查看BMI160数据表并尝试弄清楚如何与设备进行连接。通常这些设备有一堆寄存器,其位数字段的数量令人难以置信。这一直是这个过程中不好玩的部分。但是这次当我去博世网站上的BMI160设备页面时,有一个按钮显示“文档和驱动程序”,当您点击它时,会有一个链接到BMI160驱动程序的GitHub。得分了!

要做到这一点,你只需要“git clonegit@github.com:BoschSensortec / BMI160_driver.git”

使用博世BMI160驱动程序库创建新的PSoC 6项目

所以,让我们继续测试它。首先创建一个新的PSoC 63项目

使用空白示意图

给它一个名字

添加Retarget I / O和FreeRTOS(从构建设置菜单中)

添加一个UART和一个I2C主控

要使I2C成为主设备,您需要双击并将其更改为主设备

然后分配引脚

运行“构建 - >生成应用程序”来获得您需要的所有PDL固件。

编辑stdio_user.h以使用UART(扫描stdio_user.h找到正确的位置)

#include"project.h"
/*Mustremainuncommentedtousethisutility*/
#defineIO_STDOUT_ENABLE
#defineIO_STDIN_ENABLE
#defineIO_STDOUT_UARTUART_1_HW
#defineIO_STDIN_UARTUART_1_HW
将“BMI_driver”目录添加到CM4项目的包含路径。(要进入此菜单,请右键单击该项目并选择“构建设置”)

将Bosch Driver文件添加到项目中

为博世驱动程序创建HAL

使用博世驱动器很简单。你所需要做的就是更新HAL。

  1. 提供写入I2C寄存器的功能

  2. 提供读取I2C寄存器的功能

  3. 提供延迟指定毫秒数的功能

  4. 创建一个结构来保存初始化信息和函数指针

该器件实现了赛普拉斯所称的“EZI2C”协议,该协议也称为I2C EEPROM协议。该器件被组织为一系列寄存器。每个寄存器都有一个从0-> 0xFF(单字节地址)的地址。要写入注册表,您需要

  1. 发送I2C启动

  2. 发送7位I2C地址

  3. 发送一个写入位(aka a 0)

  4. 发送要写入的寄存器地址(不要将I2C地址与内部BMI160地址混淆)

  5. 发送您想要写入的8位值

  6. 发送一个停止

EZI2C的一个很酷的事情是,它可以跟踪地址,并在每次写入时自动递增寄存器地址。这意味着您可以编写一个地址序列,而无需为每个地址执行完整的事务。

鉴于引入写函数很简单:

staticint8_tBMI160BurstWrite(uint8_tdev_addr,uint8_treg_addr,uint8_t*data,uint16_tlen)
{

Cy_SCB_I2C_MasterSendStart(I2C_1_HW,dev_addr,CY_SCB_I2C_WRITE_XFER,0,&I2C_1_context);
Cy_SCB_I2C_MasterWriteByte(I2C_1_HW,reg_addr,0,&I2C_1_context);
for(inti=0;i

为了阅读你做一个类似的交易来写。具体的步骤是:

  1. 发送I2C启动

  2. 发送7位I2c地址

  3. 发送一个WRITE位aka 0

  4. 发送您想要读取的寄存器地址

  5. 发送I2C重新启动

  6. 读一个字节

  7. 发送NAK

  8. 发送一个停止

读取事务与写入类似,您可以通过发送ACK继续读取连续字节。您读取的最后一个字节应该是NAK,以告诉远程设备您正在读取。鉴于代码也很简单。

//ThisfunctionsupportstheBMP180libraryandreadI2CRegisters
staticint8_tBMI160BurstRead(uint8_tdev_addr,uint8_treg_addr,uint8_t*data,uint16_tlen)
{

Cy_SCB_I2C_MasterSendStart(I2C_1_HW,dev_addr,CY_SCB_I2C_WRITE_XFER,0,&I2C_1_context);
Cy_SCB_I2C_MasterWriteByte(I2C_1_HW,reg_addr,0,&I2C_1_context);
Cy_SCB_I2C_MasterSendReStart(I2C_1_HW,dev_addr,CY_SCB_I2C_READ_XFER,0,&I2C_1_context);
for(inti=0;i

我的读写功能都有一个错误。那个错误是?没有错误检查。我看到了一些间歇性的奇怪现象,其中I2C总线被锁定,最终需要重置才能修复。这可以通过检查I2C功能上的错误代码来防止。

既然我们有读写功能,我们可以设置我们的设备:要做到这一点:

  1. 设置一个类型为bmi160_dev的结构

  2. 初始化函数指针

  3. 初始化设备的设置

  4. 最后发送设置

staticstructbmi160_devbmi160Dev;

staticvoidsensorsDeviceInit(void)
{

int8_trslt;
vTaskDelay(500);//guess

/*BMI160*/
bmi160Dev.read=(bmi160_com_fptr_t)BMI160BurstRead;
bmi160Dev.write=(bmi160_com_fptr_t)BMI160BurstWrite;
bmi160Dev.delay_ms=(bmi160_delay_fptr_t)vTaskDelay;

bmi160Dev.id=BMI160_I2C_ADDR;//I2Cdeviceaddress

rslt=bmi160_init(&bmi160Dev);//initializethedevice
if(rslt==0)
{
printf("BMI160I2Cconnection[OK].
");
bmi160Dev.gyro_cfg.odr=BMI160_GYRO_ODR_800HZ;
bmi160Dev.gyro_cfg.range=BMI160_GYRO_RANGE_125_DPS;
bmi160Dev.gyro_cfg.bw=BMI160_GYRO_BW_OSR4_MODE;

/*SelectthepowermodeofGyroscopesensor*/
bmi160Dev.gyro_cfg.power=BMI160_GYRO_NORMAL_MODE;

bmi160Dev.accel_cfg.odr=BMI160_ACCEL_ODR_1600HZ;
bmi160Dev.accel_cfg.range=BMI160_ACCEL_RANGE_4G;
bmi160Dev.accel_cfg.bw=BMI160_ACCEL_BW_OSR4_AVG1;
bmi160Dev.accel_cfg.power=BMI160_ACCEL_NORMAL_MODE;

/*Setthesensorconfiguration*/
bmi160_set_sens_conf(&bmi160Dev);
bmi160Dev.delay_ms(50);
}
else
{
printf("BMI160I2Cconnection[FAIL].
");
}
}

创建主要固件并进行测试

最后,我通过运行打印出加速数据的无限循环来测试固件。

voidmotionTask(void*arg)
{
(void)arg;
I2C_1_Start();
sensorsDeviceInit();
structbmi160_sensor_dataacc;

while(1)
{

bmi160_get_sensor_data(BMI160_ACCEL_ONLY,&acc,NULL,&bmi160Dev);
printf("x=%4dy=%4dz=%4d
",acc.x,acc.y,acc.z,);
vTaskDelay(200);
}
}

现在你应该有这样的:

最后整个节目一举成名

#include"project.h"
#include"FreeRTOS.h"
#include"task.h"
#include
#include"bmi160.h"

staticstructbmi160_devbmi160Dev;

staticint8_tBMI160BurstWrite(uint8_tdev_addr,uint8_treg_addr,uint8_t*data,uint16_tlen)
{

Cy_SCB_I2C_MasterSendStart(I2C_1_HW,dev_addr,CY_SCB_I2C_WRITE_XFER,0,&I2C_1_context);
Cy_SCB_I2C_MasterWriteByte(I2C_1_HW,reg_addr,0,&I2C_1_context);
for(inti=0;i
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PSoC
    +关注

    关注

    12

    文章

    179

    浏览量

    94590
  • BMI160
    +关注

    关注

    1

    文章

    7

    浏览量

    8290
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Molex PowerWize BMI面板对板母线互连系统技术解析

    Molex PowerWize BMI大电流面板对板/母线互连采用Molex COEUR插座技术,有助于确保在插配接口上有低接触电阻,从而最大限度地减少发热并实现高载流能力。Molex
    的头像 发表于 11-20 09:29 165次阅读

    如何仅使用 MiniWiggler连接并更改 BMI 的默认值?

    在我的项目中,我使用的是ARM XMC1402-Q064X0200 AA微控制器。 默认情况下, BMI 设置为 0xF8C7 ,这会使设备进入ASC BSL(UART 引导加载程序)模式。在这
    发表于 08-12 08:01

    即时通话软件音频传输质量测试方案介绍

    本套测试方案的核心目的是通过POLQA(Perceptual Objective Listening Quality Assessment)主观音质评价测试反映即时通话软件在使用过程
    的头像 发表于 08-10 15:21 3402次阅读
    即时<b class='flag-5'>通话</b>软件音频传输质量<b class='flag-5'>测试</b>方案介绍

    无法在调试中连接到PSOC4怎么解决?

    您好,我有一块使用 PSOC4 CY8C4013SXI-410 制作的小板。非常简单的设备,它只有三个 GPIO 引脚并通过 5 引脚 SWD 进行编程。我遇到的问题是程序员能够看到该设备但无法对其
    发表于 07-22 06:02

    PSoC 6 BLE PIONEER KIT烧录Bluetooth_LE_Battery_Server的demo进行调试时,无法成功烧录的原因?

    我在使用PSoC 6 BLE PIONEER KIT调试时,尝试烧录Bluetooth_LE_Battery_Server的demo进行调试时,发现无法成功烧录,并提示如下信息,请问下是什么原因呢
    发表于 07-01 07:37

    季丰电子自建引脚完整测试能力

    季丰可靠性测试项目拓展AEC-Q100车规芯片验证C6:LI - Lead Integrity 引脚完整性Q100要求。
    的头像 发表于 06-23 09:22 839次阅读
    季丰电子自建引脚<b class='flag-5'>完整</b>性<b class='flag-5'>测试</b>能力

    信号完整测试基础知识

    ,高速系统的信号完整性直接关系到数据传输的可靠性和系统的整体性能。因此,深入理解信号完整性的基本原理和测试方法对于确保高速
    的头像 发表于 04-24 16:42 3326次阅读
    信号<b class='flag-5'>完整</b>性<b class='flag-5'>测试</b>基础知识

    使用罗德与施瓦茨RTE1104示波器进行电源完整测试

    电源完整性(Power Integrity, PI)测试在现代电子系统设计中至关重要。随着电子设备对电源质量的要求越来越高,电源噪声和瞬态变化对系统性能的影响愈发显著。本文将详细介绍如
    的头像 发表于 04-23 16:51 634次阅读
    使用罗德与施瓦茨RTE1104示波器<b class='flag-5'>进行</b>电源<b class='flag-5'>完整</b>性<b class='flag-5'>测试</b>

    普源DHO3000系列示波器电源完整测试

    整个系统的性能和可靠性。普源DHO3000系列示波器凭借其卓越的性能和丰富的功能,成为进行电源完整测试的绝佳工具。本文将详细探讨基于普源DHO3000系列示波器的电源
    的头像 发表于 04-15 14:45 600次阅读
    普源DHO3000系列示波器电源<b class='flag-5'>完整</b>性<b class='flag-5'>测试</b>

    技术资讯 | 信号完整测试基础知识

    本文重点信号完整测试需要从测试电路板和原型获取实验数据并加以分析。在理想的工作流程中,还会仿真信号完整性指标,并将其与实际测量值进行比较。
    的头像 发表于 04-11 17:21 1926次阅读
    技术资讯 | 信号<b class='flag-5'>完整</b>性<b class='flag-5'>测试</b>基础知识

    怎样使用防水测试仪对手机进行测试

    在当今手机不离手的时代,手机的防水性能越来越重要。那么,如何使用防水测试测试手机呢?以下是一个简单易懂的操作过程的详细说明。一、前期准备(1)选择合适的防水测试仪:根据手机的尺寸和
    的头像 发表于 02-27 16:58 1705次阅读
    怎样使用防水<b class='flag-5'>测试</b>仪对手机<b class='flag-5'>进行</b><b class='flag-5'>测试</b>

    是德科技发布LPDDR6完整解决方案,助力内存设计与测试

    近日,是德科技正式推出了针对LPDDR6(第六代低功耗双倍数据速率内存标准)的完整设计和测试解决方案,旨在引领内存系统技术创新的新潮流。 该解决方案覆盖了从设计到
    的头像 发表于 02-13 10:39 779次阅读

    英飞凌PSOC Control C3正式问世

    近期,英飞凌公司宣布其最新的PSOC Control系列中的C3产品已经正式问世,并宣布量产。作为PSOC Control系列的首个量产产品,PSOC Control C3的推出标志着英飞凌在电机
    的头像 发表于 02-08 14:45 1209次阅读

    基于PSOC6的智能环境监控系统

    本项目是基于PSOC6进行开发,它具有以下特性Psoc6-evaluationkit-062S2是RT-Thread联合英飞凌推出的一款集成32位双核CPU子系统(ARMCortex-
    的头像 发表于 01-07 19:54 1208次阅读
    基于<b class='flag-5'>PSOC6</b>的智能环境监控<b class='flag-5'>系统</b>

    为什么活动现场都是使用内部通话系统而不是对讲机?

    无论多好的对讲机,本质的核心技术采用半双工通信,同一个频道下听和说无法同时进行,且通话时需要长按PTT按键,这对于直播现场的岗位很不适用,如导播需要双手操作切换台,摄像师需要操作摄像机等,这个时候
    发表于 12-16 16:19