SmartBond TINY™DA14530和DA14531是蓝牙®低能耗解决方案,为下一个10亿个物联网设备供电
SmartBond TINY™是世界上最小和最低功耗的蓝牙5.1芯片系统,在任何系统中添加低功耗蓝牙,在高容量下的成本为0.50美元。
这种令人敬畏的组合将移动连接到以前遥不可及的地方,触发一亿个物联网设备的浪潮,所有的智能磁共振微小。
低系统成本是通过SmartBond TINY的高水平集成来实现的:一个完整的蓝牙低能耗系统可以通过添加6个微小的外部无源,一个晶体和电源来实现。为了降低进入门槛,SmartBond TINY还将提供一个易于使用的微型模块,包含所有需要的组件,使任何应用程序添加低功耗蓝牙成为一个简单的插入。
记录低冬眠和有源功耗,确保长操作和货架寿命,即使是最小的,一次性电池。SmartBond TINY基于功能强大的32位arm Cortex M0+,集成了内存和一套完整的模拟和数字外设,非常节能,在最新的IoT连接EEMBC基准测试中,IoTMark™获得了创纪录的18300分。DA14531可在一个微小的2.0 x 1.7毫米包装,是其前身的一半大小,或任何其他领先制造商的产品。它还配有一个灵活的SDK,支持Keil和GCC等主要编译器。DA14530引脚兼容DA14531引脚2.2x3.0mm FCGQFN24封装,并通过内部LDO操作提供成本节约,消除了直流-直流电感的成本。
生命周期状态
好处
未来证明,符合蓝牙5.1(核心)
优化为连接医疗,连接的消费者的一次性产品亚博电竞菠菜
- 旨在使用一次性,甚至印刷电池
- 适用于最小容量的电池,<<30mAh
- 支持多年的保质期
- 浪涌电流可限制具有高内阻的一次性电池
- 包装设计允许具有最小可能的占地面积的低成本制造
只需要一个32MHz的晶体
在旁路模式不需要DC-DC电感
使用1.5V电池时不需要升压转换器
加速生产的生产线工具,导致更快的市场时间和最短的生产测试时间,每个设备
亚博国际官网平台网址
连接的消费者:
信标,智能标签,遥控器,近距离标签,连接手表,触控笔,鼠标,玩具,低功耗传感器,蓝牙LE在“BLE PIPE”上添加到现有应用程序亚博国际官网平台网址
联系医疗:
连接注射器,吸入器,葡萄糖监测器,智能贴片,血压计,温度计
汽车:
轮胎压力,监控系统和低功率无线传感器
包
FCGQFN24,2.2x3x0.4
WLCSP17 1.7 x2.05x0.5
相关链接
开发工具包和参考设计
开发工具包- USB | |
开发工具包-专业版 | |
|
DA14531产品概述视频
生产线工具套件网络研讨会
MikroBUS单击单板网络研讨会
IOT播客
模块 | 关键特性 | |
---|---|---|
DA14531 / SmartBond TINY模块 |
|
现在从Digikey购买 现在从Avnet购买 |
DA16600模块 |
|
联系我们 |
DA14531 BDE-BLEM301 |
|
联系你当地的对话销售代表或电子邮件12:info@bdecomm.com |
DA14531洪hj - 531国际货币基金组织(imf) |
|
立即购买 |
DA14531 Honjia hj - 131 imh |
|
立即购买 |
DA14531
两个星期前
SPI芯片选择在多个奴隶
发布的jackphan80点 5回复你好,
我正在使用Pro Dev Board在DA14531中的多个SPI传感器从站工作。我试图打开芯片选择奴隶,但我不成功。
我在BLE论坛上读过这个话题,但是不清楚如何切换到选片:
以下是我的两个传感器DPS368和KX132的代码(每个传感器都经过测试,在其端口和引脚设置时工作良好)
在设置开始时,它只工作一个传感器:
spi_sel_pins.spi_cs_port = dps368_spi_cs_port;
spi_sel_pins。spi_cs_pin = DPS368_SPI_CS_PIN;
当我切换以选择另一个传感器KX132时,它不适用于该第二传感器。
GPIO_ConfigurePin(KX132_SPI_CS_PORT, KX132_SPI_CS_PIN, OUTPUT, PID_SPI_EN, true);
spi_sel_pins。spi_cs_port = KX132_SPI_CS_PORT;
spi_sel_pins。spi_cs_pin = KX132_SPI_CS_PIN;
请给我一个选择芯片的配置建议。
非常感谢,
杰克
// ===============================================================================
// ================================= 在文件user_periph_setup.c
// ===============================================================================
_spi_sel_pins spi_sel_pins;
spi_cfg_t spi_cfg;
空白GPIO_reservations(空白)
{
保留gpio (dps368_spi_miso, dps368_spi_miso_port, dps368_spi_miso_pin, pid_spi_di);
保留_GPIO(DPS368_SPI_MOSI,DPS368_SPI_MOSI_PORT,DPS368_SPI_MOSI_PIN,PID_SPI_DO);
保留gpio (dps368_spi_clk, dps368_spi_clk_port, dps368_spi_clk_pin, pid_spi_clk);
保留_GPIO(DPS368_SPI_CS,DPS368_SPI_CS_PORT,DPS368_SPI_CS_PIN,PID_SPI_EN);
保留_GPIO(kx132_spi_cs,kx132_spi_cs_port,kx132_spi_cs_pin,pid_spi_en);
Reserve_gpio (dps368_int, dps368_int_port, dps368_int_pin, pid_gpio);
#如果定义(CFG_PRINTF_UART2)
Reserve_gpio (uart2_tx, uart2_tx_port, uart2_tx_pin, pid_uart2_tx);
# endif
}
// ===============================================================================
空白set_pad_functions(空白)
{
spi_cfg。spi_ms = SPI_MS_MODE_MASTER;
spi_cfg。spi_cp = SPI_CP_MODE_3;
spi_cfg。spi_speed = SPI_SPEED_MODE_2MHz;
spi_cfg.spi_wsz = spi_mode_8bit;
spi_cfg。spi_cs = SPI_CS_0;
spi_cfg。spi_irq = SPI_IRQ_DISABLED;
spi_cfg.cs_pad。端口= (GPIO_PORT) spi_sel_pins.spi_cs_port;
spi_cfg.cs_pad。销= (GPIO_PIN) spi_sel_pins.spi_cs_pin;
#如果定义(__DA14531__)
//在P0_0上禁用HW RST,这样它就可以用作SPI MOSI。
gpio_disable_hw_reset();
# endif
GPIO_ConfigurePin (spi_sel_pins (GPIO_PORT)。spi_sel_pins spi_cs_port (GPIO_PIN)。spi_cs_pin, OUTPUT, PID_SPI_EN, true);
GPIO_ConfigurePin (spi_sel_pins (GPIO_PORT)。spi_sel_pins spi_clk_port (GPIO_PIN)。spi_clk_pin, OUTPUT, PID_SPI_CLK, false);
gpio_configurepin((gpio_port)spi_sel_pins.spi_do_port,(gpio_pin)spi_sel_pins.spi_do_pin,输出,pid_spi_do,false);
GPIO_ConfigurePin (spi_sel_pins (GPIO_PORT)。spi_sel_pins spi_di_port (GPIO_PIN)。spi_di_pin, INPUT, PID_SPI_DI, false);
GPIO_ConfigurePin(KX132_SPI_CS_PORT, KX132_SPI_CS_PIN, OUTPUT, PID_SPI_EN, true);
gpio_configurepin(dps368_spi_cs_port,dps368_spi_cs_pin,输出,pid_spi_en,true);
GPIO_ConfigurePin(DPS368_INT_PORT, DPS368_INT_PIN, INPUT, PID_GPIO, false);
#如果定义(CFG_PRINTF_UART2)
//配置UART2 TX Pad
gpio_configurein (UART2_TX_PORT, UART2_TX_PIN, OUTPUT, PID_UART2_TX, false);
# endif
}
// ===============================================================================
空白init_spi_pads (void) {
memset (&spi_sel_pins 0 sizeof (_spi_sel_pins));
spi_sel_pins.spi_cs_port = dps368_spi_cs_port;
spi_sel_pins。spi_cs_pin = DPS368_SPI_CS_PIN;
spi_sel_pins.spi_clk_port = dps368_spi_clk_port;
spi_sel_pins。spi_clk_pin = DPS368_SPI_CLK_PIN;
spi_sel_pins。spi_do_port = DPS368_SPI_MOSI_PORT;
spi_sel_pins。spi_do_pin = DPS368_SPI_MOSI_PIN;
spi_sel_pins。spi_di_port = DPS368_SPI_MISO_PORT;
spi_sel_pins。spi_di_pin = DPS368_SPI_MISO_PIN;
#如果定义(__DA14531__)
/ / spi_uses_p00 = (SPI_CS_PIN = = GPIO_PIN_0) | | (SPI_CLK_PIN = = GPIO_PIN_0) | | (SPI_DO_PIN = = GPIO_PIN_0) | | (SPI_DI_PIN = = GPIO_PIN_0);
# endif
}
// ===============================================================================
空白periph_init(空白)
{
#如果定义(__DA14531__)
//在Boost模式下,使DCDC转换器为使用的gpio提供VBAT_HIGH
syscntl_dcdc_turn_on_in_boost (SYSCNTL_DCDC_LEVEL_3V0);
其他#
//启动外设的电源域
SetBits16 (PMU_CTRL_REG PERIPH_SLEEP 0);
while (!(GetWord16(SYS_STAT_REG) & PER_IS_UP));
SetBits16 (CLK_16M_REG XTAL16_BIAS_SH_ENABLE 1);
# endif
/ /罗补丁
patch_func ();
/ /初始化设备
#如果定义(CFG_PRINTF_UART2)
/ /初始化UART2
uart_initialize (UART2 &uart_cfg);
# endif
//设置pad功能
init_spi_pads ();/ /多个奴隶
set_pad_functions ();
//启用垫子
GPIO_set_pad_latch_en(真正的);
/ /初始化SPI
spi_initialize(&spi_cfg);
}
空白chipSelectKx132 (void) {
GPIO_ConfigurePin(KX132_SPI_CS_PORT, KX132_SPI_CS_PIN, OUTPUT, PID_SPI_EN, true);
spi_sel_pins。spi_cs_port = KX132_SPI_CS_PORT;
spi_sel_pins。spi_cs_pin = KX132_SPI_CS_PIN;
}
void chipelectdps368(空白){
gpio_configurepin(dps368_spi_cs_port,dps368_spi_cs_pin,输出,pid_spi_en,true);
spi_sel_pins.spi_cs_port = dps368_spi_cs_port;
spi_sel_pins。spi_cs_pin = DPS368_SPI_CS_PIN;
}
// ===============================================================================
// ================================= 在文件user_periph_setup.h
// ===============================================================================
//为SPI设置引脚
#定义DPS368_SPI_CLK_PORT GPIO_PORT_0
#定义DPS368_SPI_CLK_PIN GPIO_PIN_4
#定义DPS368_SPI_MOSI_PORT GPIO_PORT_0
#define dps368_spi_mosi_pin gpio_pin_0.
#define dps368_spi_miso_port gpio_port_0.
#定义DPS368_SPI_MISO_PIN GPIO_PIN_3
#定义KX132_SPI_CS_PORT GPIO_PORT_0
#定义KX132_SPI_CS_PIN GPIO_PIN_1
#定义DPS368_SPI_CS_PORT GPIO_PORT_0
#定义DPS368_SPI_CS_PIN GPIO_PIN_7
//设置多个slave
typedef struct __spi_sel_pins
{
uint8_t spi_cs_port;
uint8_t spi_cs_pin;
uint8_t spi_clk_port;
uint8_t spi_clk_pin;
uint8_t spi_do_port;
uint8_t spi_do_pin;
uint8_t spi_di_port;
uint8_t spi_di_pin;
} _spi_sel_pins;
// ===============================================================================
// ================================= 在文件user_app.c
// ===============================================================================
/ /调用
chipSelectDps368 ();
//从传感器Dps368读取数据:WORKED FINE
//切换到选择另一个传感器Kx132: NOT SUCCESS (no error but cannot talk to the sensor)
chipSelectKx132 ();
1周前
嗨jackphan,
你应该设置SPI EN为LOW - spi_cs_low(),当你想与特定的SPI设备“对话”时,
假设您将SPI_DEVICE_1和SPI_DEVICE_2相应地具有SPI_EN_1和SPI_EN_2。
如果你想与SPI_DEVICE_1“对话”,你应该设置SPI_EN_1为LOW - spi_cs_low() - SPI_EN_2为HIGH - spi_cs_high()。
谢谢,PM_DIALOG.
3天前
你好,
通过对话框工程师的支持,我可以成功获取配置以选择我的多个传感器从站。我想和你共享我的片段代码(基于项目BLE_PRESSURE_SENSENSOR_BMP388的示例):
#定义DPS368_SPI_CLK_PORT GPIO_PORT_0
#定义DPS368_SPI_CLK_PIN GPIO_PIN_4
#定义DPS368_SPI_MOSI_PORT GPIO_PORT_0
#define dps368_spi_mosi_pin gpio_pin_0.
#define dps368_spi_miso_port gpio_port_0.
#定义DPS368_SPI_MISO_PIN GPIO_PIN_3
#定义KX132_SPI_CS_PORT GPIO_PORT_0
#定义KX132_SPI_CS_PIN GPIO_PIN_1
#定义DPS368_SPI_CS_PORT GPIO_PORT_0
#定义DPS368_SPI_CS_PIN GPIO_PIN_7
//在一个传感器
static int dps368WriteTwoBytes(uint8_t addr, uint8_t txValue)常量
{
int ret = SPI_TRANSMITED_FALSE;
uint8_t tmp [2];
GPIO_SetInactive (DPS368_SPI_CS_PORT DPS368_SPI_CS_PIN);//设置物理引脚LOW
spi_cs_low();// SPI集芯片选择逻辑低
tmp[0] = addr & 0x7F;
tmp [1] = txValue;
ret = spi_send(&tmp, 2, SPI_OP_BLOCKING);
GPIO_SetActive (DPS368_SPI_CS_PORT DPS368_SPI_CS_PIN);//设置物理引脚高
spi_cs_high();// SPI集芯片选择逻辑高
返回受潮湿腐烂;
}
//在另一个传感器
static bool spiRead(uint8_t addr, uint8_t * const data, uint8_t len) uint8_t addr, uint8_t len
{
int ret = SPI_TRANSMITED_FALSE;
addr = addr |;
GPIO_SetInactive (KX132_SPI_CS_PORT KX132_SPI_CS_PIN);//设置物理引脚LOW
spi_cs_low();// SPI集芯片选择逻辑低
//设置要读取的寄存器地址
if (spi_send(&addr, 1, SPI_OP_BLOCKING) == SPI_TRANSMITED_CORRECT) {
ret = spi_receive(data, len, SPI_OP_BLOCKING);
}
GPIO_SetActive (KX132_SPI_CS_PORT KX132_SPI_CS_PIN);//设置物理引脚高
spi_cs_high();// SPI集芯片选择逻辑高
if (ret == SPI_TRANSMITED_CORRECT){返回true;}
Else {return false;}
}
空白periph_init(空白)
{
......
//在函数集的末尾:
spi_set_cs_mode (SPI_CS_GPIO);
}
空白set_pad_functions(空白)
{
#如果定义(__DA14531__)
//在P0_0上禁用HW RST,这样它就可以用作SPI MOSI。
gpio_disable_hw_reset();
# endif
GPIO_ConfigurePin(KX132_SPI_CS_PORT, KX132_SPI_CS_PIN, OUTPUT, PID_GPIO, true);
GPIO_ConfigurePin(DPS368_SPI_CS_PORT, DPS368_SPI_CS_PIN, OUTPUT, PID_GPIO, true);
GPIO_ConfigurePin(DPS368_SPI_MISO_PORT, DPS368_SPI_MISO_PIN, INPUT, PID_SPI_DI, false);
GPIO_ConfigurePin(DPS368_SPI_MOSI_PORT, DPS368_SPI_MOSI_PIN, OUTPUT, PID_SPI_DO, false);
GPIO_ConfigurePin(DPS368_SPI_CLK_PORT, DPS368_SPI_CLK_PIN, OUTPUT, PID_SPI_CLK, false);
}
这里的关键是:
.在调用函数spi_cs_low()之前,我们应该调用函数gpio_setinactive(..),以便物理地将此引脚设置为低
.在调用spi_cs_high()函数之前,我们应该调用GPIO_SetActive(..)函数来物理地设置这个PIN高
在user_app.c文件中,我们只是像往常一样调用函数来读取数据。每个传感器文件中的功能已经通过选择正确的选定引脚来处理。
这是我的代码片段在user_app.c:
kx132GetAccelData ();
dps368ReadTemperature ();
我们不需要从两个传感器读取数据之间有任何代码。
我希望这对你有所帮助。
杰克
两个星期前
嗨jackphan,
谢谢你的问题。总体思路是将每个SPI设备+的MISO/MOSI/CLK线连接在相同的引脚上,并将CS连接在不同的引脚上。我检查了你的代码,这是你已经做的。每次您想要与SPI设备“对话”时,您应该将特定设备的CS线拉到LOW。通过这样做,您将启用它,然后开始输出数据和时钟。
因此,我的推荐将是每次要与不同的SPI设备通信时配置不同的SPI_EN引脚。之后,您还需要根据特定SPI设备的配置初始化531的SPI模块。例如,它可能具有不同的频率,不同的极性等。
因此,您可能需要为SPI使用不同的配置结构—spi_cfg_t。
还请查看SPI外设示例,以便了解如何将SPI CS配置为low - spi_cs_low()和high - spi_cs_high()。
如果您已经完成了上述过程,我建议使用逻辑分析仪工具,探测所有SPI线并共享捕获。
谢谢,PM_DIALOG.