你好,
我们希望定期读取i2c上的传感器,最好是在da14585醒来做BLE广告时。
要读取传感器,我们必须首先通过高引脚驱动唤醒传感器,等待~1ms,然后通过i2c读取8字节的数据。
这个序列本身可以工作,但当我尝试在系统供电的回调用户\u app\u main\u loop\u callbacks.app\u或在睡眠前在用户\u app\u main\u loop\u callbacks.app\u中执行此操作时,我不知何故陷入了困境。
从periph_init调用初始化i2c的顺序:
void init_acc_i2c(void)
{
SetBits16 (CLK_PER_REG I2C_ENABLE 1);//启动I2C时钟
SetWord16 (I2C_ENABLE_REG 0 x0);//关闭I2C控制器
设置字16(I2C_CON_REG,0x0063)//12c主机,7bit从机地址,100kbit
SetWord16 (I2C_TAR_REG ACCELEROMETER_I2C_ADDR);
SetWord16(I2C_ENABLE_REG,0x1);//启用I2C控制器
}
读取传感器数据的代码,我试图从上面描述的回调调用:
空白read_sensor_sequentially(空白)
{
int i;
uint8_t数据[8];
GPIO_设置激活(加速计_启用_端口、加速计_启用_引脚);
systick_wait (1000);
全局_INT_DISABLE();
SetWord16(I2C_数据_命令_注册表,0x00);
(我= 0;< 7;我+ +)
{
正在等待I2C FIFO已满();
SetWord16(I2C_数据_CMD_注册表,0x0100);
}
全局_INT_RESTORE();
(我= 0;< 7;我+ +)
{
WAIT_FOR_RECEIVED_BYTE ();//等待接收的数据
数据[i]=(0xFF&GetWord16(I2C_data_CMD_REG));//获取接收到的字节
}
GPIO_设置未激活(加速计_启用_端口、加速计_启用_引脚);
等待_I2C _FIFO _为空();//等待Tx FIFO为空
等待直到没有主活动();//等待,直到没有主活动
}
有可能使用任何回调来实现这一点吗?
致以最亲切的问候
马丁
嗨mapart,
如果定期读取传感器,可以使用app_easy_timer()API。每次计时器过期时,都会触发已注册的回调,因此您需要注册正在读取传感器的回调。如果DA1458每次读取传感器,请分享更多详细信息?设备在广告或连接间隔之间进入睡眠模式。您是否将其配置为进入深度睡眠模式,如SDK的ble_app_睡眠模式示例所示?
谢谢,下午好
你好,
要提供一些上下文:
SDK版本,6.0.10.511。
我们在这个项目中使用了ble_app_安全性作为基础,但将其配置为使用扩展睡眠模式。这使得设备在广告之间进入睡眠状态。
理想情况下,我们希望在da14585每次醒来做广告时读取此传感器。
如果我们使用app_easy_timer(),设备会从睡眠中醒来,只是为了读取传感器,对吗?
对我们来说,最好是在设备已经醒着的时候读取传感器。
致以最亲切的问候
马丁
嗨mapart,
通过使用app_easy_timer(),可以实现对传感器的周期性读取。你的设备最初是广告的,当它的广告传感器应该被应用程序定期读取,在一段时间后,你停止广告,当设备通过配置唤醒控制器醒来时,应用程序应该开始再次定期读取传感器。那是正确的吗?或者你想在每个广告间隔读取传感器?请让我知道并分享你到底想要完成什么。为了给你提供正确的指导方针,这将是非常有帮助的。
谢谢,下午好
你好,
是的,我想在每个广告间隔(687.5毫秒)读取传感器。
我想我设法通过使用回调来实现:
user_app_main_loop_callbacks.app_on_system_powered
谢谢你的帮助。
顺致敬意,
马丁
嗨mapart,
很高兴你解决了问题,谢谢你接受了答案。
谢谢,下午好
你好,对话框,
一个类似的例子与另一个工作流-
传感器>>i2c>>DA14586。
RTC >> GPIOx / WKUP中断>> DA14586
BLE会按照SDK提供的样例应用进行广告的正常操作。亚博国际官网平台网址
当RTC发出中断且BLE仍处于播发模式时-
记录时间戳;记录传感器数据;在闪存中存储传感器数据;
当BLE连接到peer -
禁用RTC中断;将Flash数据通过BLE传输到中央设备(通常是智能手机);
你能帮我插入代码和处理-吗
1.RTC中断处理(活动和休眠状态)
2 .使用Dialog中的DSPS进行BLE传输。
谢谢
嗨rajucoolsuraj,
如果我能正确理解,你想唤醒设备时得到一个中断正确吗?因此,设备将处于睡眠模式,当你从RTC(请澄清什么是RTC)获得中断时,设备将唤醒并开始广告。如果您想遵循这个实现,我建议您看看SDK的ble_app_sleepmode示例。唯一的区别是,在本例中,DA14585/6从按下按钮生成的中断中唤醒。您是在使用DSPS应用程序代码还是已经开发了自定义应用程序?请检查DSPS应用程序代码中的user_send_ble_data()。另外,我建议您查看一下DSPS用户手册,并检查图6和图7。
https://support.dialog-semiconductor.com/system/files/resources/UM-B-038%20DA14580%20Serial%20Port%20Service%20reference%20application_v2.0.pdf
谢谢,下午好
谢谢对话,
我想在这里评估和发布。
我还提出了另一篇关于I2C控制器与传感器接口的文章。
似乎控制器在SDA线上发送了从设备地址后没有发送备用设备的寄存器地址。
我能得到帮助吗?
谢谢
拉
霍尼韦尔
嗨rajucoolsuraj,
我已经在这个论坛帖子中回复了你:
https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bluetooth-low-energy-%E2%80%93-software/rtc-pcf85063a-i2c-using-i2ceeprom-api
谢谢,下午好
谢谢对话,
但是,当我想要在没有睡眠模式的情况下启用GPIO IRQ时。
在与对等方连接之前,我应该在什么时候处理中断;外设什么时候做广告?
谢谢
拉
嗨rajucoolsuraj,
您可以在初始化时启用IRQ(.app_on_init)或在用户_app_adv_start中启用IRQ。但是请注意,您不必使用任何睡眠模式来检测中断。如果您想要任何睡眠模式配置,您应该使用唤醒控制器。
谢谢,下午好
谢谢对话,
我将在激活和睡眠模式中使用WakeUp IRQ。它似乎比GPIO更好。
如果通过GPIO使用唤醒IRQ可能会导致任何错误的遭遇,我想知道
谢谢
嗨rajucoolsuraj,
我强烈建议查看一下SDK的ble_app_sleepmode示例,以便了解如何使用唤醒控制器。
谢谢,下午好
你好,对话框,
按钮回调的自定义消息处理程序中连接时的唤醒控制器用法是最好的用例示例。
如果在实现过程中出现任何逻辑故障,我将返回。
谢谢
嗨rajucoolsuraj,
如果你想要任何一种睡眠模式,解决方案是使用唤醒控制器来检测中断和唤醒。请检查app_button_enable()函数,该函数在设备进入睡眠模式之前启用唤醒控制器。可以使用wkupct_enable_irq()函数选择可以检测唤醒中断的GPIO。您还可以配置极性和恢复时间以及。由于设备进入睡眠状态,你向唤醒控制器发送一个中断,注册到wkupct_register_callback()的回调函数将被触发。
谢谢,下午好
你好,对话框,
我已经使用WakeUp controller callback registration注册了多个回调,如何处理来自多个GPIO的中断?
它是注册GPIO中触发的最后一个吗?
谢谢
问候
拉
嗨rajucoolsuraj,
你能澄清一下你做了什么吗?如果我能够正确理解,您是否将固件配置为从不同的GPIO唤醒?如果是,第一次开机将唤醒您的芯片。
谢谢,下午好
你好,对话框,
谢谢。
另外,如何通过唤醒控制器检查触发中断的GPIO管脚源?
SDK中是否有任何寄存器或机制允许我验证中断源?
谢谢
拉
嗨rajucoolsuraj,
没有寄存器指示发生中断的端口/引脚,为了检查脉冲源,您可以在设备被唤醒后立即读取引脚的状态。因此,根据pin状态,您必须决定将触发哪个回调函数。请尽量不要在论坛上重复你的问题,你已经创建了一个类似的论坛帖子,我已经在那里回复了你:
https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bluetooth-low-energy-%E2%80%93-software/multiple-code-space-wkupenableirq
谢谢,PM_DIalog
你好,对话框,
很抱歉,有重复。是的,谢谢你的支持。
此外,我还提出了另一个问题。
问候
拉
嗨rajucoolsuraj,
没问题!让我们在您的其他论坛帖子中继续对话。
谢谢,下午好