当DA14581开始广告时,意外的GPIO更改

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
10个帖子/ 0新
最后一篇
zheshen
离线
最后一次露面:1年9个月前
加入:2015-08-11 20:01
当DA14581开始广告时,意外的GPIO更改

DA14581有两条GPIO线配置为输出,并在固件初始化时设置为高。这些线路上的负脉冲触发主控制器上的级中断。

我发现的是每500次大约1次,当DA14581刚刚启动并使用主机控制器进行了一些握手然后开始广告,这两个GPIO线同时触发了主机控制器上的意外中断。DA14581子卡由外部电源供电。我确保没有固件代码将在此时更改GPIO线路状态。

DA14581配置了扩展的睡眠模式。当它连接或断电时,从未发现此问题。

任何洞见都将不胜感激。

设备:
mhv_dialog.
离线
最后一次露面:三个月两个星期前
职员
加入:15 2013-12-06
你好,

你好,

当使用延长睡眠时,您将看到以下行为:在每次唤醒时,在user_peri_setup .c (peri_init()函数)中重新初始化gpio。这个函数将重新锁存所有输出锁存,并完全按照您描述的那样操作,并将所有gpio设置为同一文件的set_pad_functions()中定义的状态。

/ MHv

zheshen
离线
最后一次露面:1年9个月前
加入:2015-08-11 20:01
不需要的间歇性

间歇性不需要的中断从睡眠中没有出现系统唤醒。相反,他们在首次开启广告时首次在第一次开启。我将startup_sleep_delay_default更改为3秒,以便在睡眠仍然禁用时始终启动广告,但我仍然看到了不必要的中断。

此外,我从未见过这一点,而Ble连接并启用延长睡眠。

mt_dialog.
离线
最后一次露面:三个月三个星期前
职员
加入:2015-06-08 11:34
Zheshen,

Zheshen,

你能告诉我们你正在使用哪些销钉和问题?您确定这些引脚是否不受581的任何外围设备,因此它们可以接管特定引脚的控制,也许是SPI接口的引脚?你还能让我们知道你使用的最初的例子,以便开发您的申请吗?也许这是电源相关的,所以请您检查电源并监控事件发生时的状态吗?您是否确定外部设备上发生的中断是因为GPIO的切换(您是否使用分析仪监视引脚?)。事实上,您注意到设备将您在无线电活动活动之前切换为输出的引脚,可能是由于您启用了诊断引脚,您是否在项目上有这种功能性?

谢谢mt_dialog.

zheshen
离线
最后一次露面:1年9个月前
加入:2015-08-11 20:01
mt_dialog:

mt_dialog:

请参阅下面的代码。rf_wake和rf_rdyn都被配置为从端口1的GPIO线(DA14581输出和主机输入),并且在启动应用程序后预计将空闲。在意外的DA14581 RESET上,RF_WAKE线路持续时间较低,这将触发主机控制器上的中断,这将关闭并将DA14581电源作为响应。RF_RDYN用于SPI同步信号。在此问题之前,DA14581和主机之间的握手涉及SPI数据传输(主机为SPI Master)和RF_RDYN信令,没有找到问题。

spi_slave_init在set_pad_functions和powerup uart2之后在periph_init中调用。函数deassert_rf_wake()在periph_init中调用rf_wake高的rf_wake(),因此在系统初始化和唤醒睡眠时调用。function assert_rf_wake()设置RF_WAKE LOW但未在固件代码中的任何位置调用。

所有SPI信号配置GPIO线从端口0。该项目基于SDK 5.0,没有使用特定的示例。我无法捕获导致问题的RF_WAKE或RF_RDYN上的确切脉冲,因为DA14581每隔几秒就会上电一次,这个问题可能几个小时后才会出现。我在主机端的执行跟踪显示了RF_WAKE和RF_RDYN上的中断同时被引发。

我不确定你说的诊断针是什么。set_pad_functions函数定义了我正在使用的所有引脚。

#define gpio_uart2_port gpio_port_0.

#define gpio_uart2_tx_pin gpio_pin_0.
#定义GPIO_UART2_RX_PIN GPIO_PIN_1

#define gpio_spi_port gpio_port_0.

#define gpio_spi_cs_pin gpio_pin_4
#define gpio_spi_clk_pin gpio_pin_5.
#define gpio_spi_di_pin gpio_pin_6.
#定义GPIO_SPI_DO_PIN GPIO_PIN_7

#定义GPIO_RF_PORT GPIO_PORT_1

#定义GPIO_RF_WAKE_PIN GPIO_PIN_0
#define gpio_rf_rdyn_pin gpio_pin_1

void set_pad_functions(void)//设置GPIO端口功能模式
{
// UART引脚配置
gpio_configurepin(gpio_uart2_port,gpio_uart2_tx_pin,输出,pid_uart2_tx,false);
GPIO_ConfigurePin(GPIO_UART2_PORT, GPIO_UART2_RX_PIN, INPUT_PULLDOWN, PID_UART2_RX, false);

//未使用的引脚配置
gpio_configurepin(gpio_unused_port,gpio_unused_otp_pin,input_pulldown,pid_gpio,false);
gpio_configurepin(gpio_unused_port,gpio_unused3_pin,input_pulldown,pid_gpio,false);

// SPI引脚配置
gpio_configurepin(gpio_spi_port,gpio_spi_clk_pin,输入,pid_spi_clk,false);
GPIO_ConfigurePin(GPIO_SPI_PORT, GPIO_SPI_CS_PIN, INPUT, PID_SPI_EN, true);//活动低电平
gpio_configurepin(gpio_spi_port,gpio_spi_do_pin,input_pulldown,pid_gpio,false);//最初设置为下拉,当CS被断言时将设置为输出。
GPIO_ConfigurePin(GPIO_SPI_PORT, GPIO_SPI_DI_PIN, INPUT, PID_SPI_DI, false);

// RF_WAKE和RF_RDYN引脚配置
GPIO_ConfigurePin(GPIO_RF_PORT, GPIO_RF_WAKE_PIN, OUTPUT, PID_GPIO, true);//活动低电平
gpio_configurepin(gpio_rf_port,gpio_rf_rdyn_pin,输出,pid_gpio,true);//活动低电平
}

/**
****************************************************************************************
* @brief assert rf_wake信号。
****************************************************************************************
* /
__inline void aser_rf_wake(void)
{
//拉出rf_wake gpio线路低(assert rf_wake line)
SetWord16 (RF_WAKE_RESET_DATA_REG RF_WAKE_MASK);

//轮询以确保RF_ATTN行被断言
while(!rf_wake_is_asserted())
{
SetWord16 (RF_WAKE_RESET_DATA_REG RF_WAKE_MASK);
}
}

/**
****************************************************************************************
取消断言RF_WAKE信号。
****************************************************************************************
* /
__INLINE空白deassert_rf_wake(空白)
{
//拉出rf_wake gpio line高(deassert rf_wake line)
setword16(rf_wake_set_data_reg,rf_wake_mask);

//轮询以确保rf_wake行被困扰
/ /当(rf_wake_is_asserted ())
// {
// setword16(rf_wake_set_data_reg,rf_wake_mask);
//}
}

空白spi_slave_init(空白)
{
// peripherla时钟寄存器clk_per_reg
setbits16(clk_per_reg,spi_div,spi_freq_div_2);//将SPI内部时钟分频器设置为2,
//允许16M/2 = 8M的SPI采样频率
// SPI采样频率至少需要4x> SPI时钟频率
setbits16(clk_per_reg,spi_enable,1);//为spi启用时钟

// SPI控制寄存器SPI_CTRL_REG
setBits16(SPI_CTRL_REG,SPI_ON,0);//关闭SPI模块,如果打开
SetBits16 (SPI_CTRL_REG SPI_WORD SPI_MODE_32BIT);// 32位模式
setBits16(SPI_CTRL_REG,SPI_SMN,SPI_ROLE_SLAVE);//在从动模式下设置SPI
setbits16(spi_ctrl_reg,spi_pol,spi_clk_idle_pol_low);//模式0:spi_clk_idle_pol_low
setbits16(spi_ctrl_reg,spi_pha,spi_pha_mode_0);//和spi_pha_mode_0.
setBits16(SPI_CTRL_REG,SPI_MINT,SPI_MINT_ENABLE);//使SPI可屏蔽中断到CPU
setbits16(spi_ctrl_reg,spi_clk,spi_xtal_div_8);// SPI时钟频率为SPI采样频率/ 8 = 1M
setbits16(spi_ctrl_reg,spi_en_ctrl,1);//为从模式启用SPI en引脚
setbits16(spi_ctrl_reg,spi_do,0);// SPO空闲时强制SPI_DO至0

// SPI控制寄存器1 SPI_CTRL_REG1
SetBits16 (SPI_CTRL_REG1 SPI_FIFO_MODE 0 x00);//启用SPI RX和TX FIFOs

setbits16(spi_ctrl_reg,spi_on,1);//启用SPI模块

/ /设置中断
nvic_setpriority(spi_irqn,20);//为现在TBD设置中断优先级为20,0最高
NVIC_EnableIRQ (SPI_IRQn);

//如果BLE FW准备好与居里交谈
如果(readyForSPITraffic)
{
//取消RF_ATTN和RF_WAKE线路
deassert_rf_rdyn();
deassert_rf_wake();
}
}

void periph_init(空白)
{
//上电外围设备的电源域
setBits16(PMU_CTRL_REG,PERIPH_SLEEP,0);
while (GetWord16(SYS_STAT_REG) & PER_IS_UP));

SetBits16 (CLK_16M_REG XTAL16_BIAS_SH_ENABLE 1);

// rom补丁
patch_func ();

// init pad.
set_pad_functions ();

//(重新)初始化外设
// IE。
/ / uart_init (UART_BAUDRATE_115K2 3);

#if(定义(enable_printf)||定义(test_bus_enabled_uart2))
setBits16(CLK_PER_REG,UART2_ENABLE,1);
UART2_INIT(UART_BAUDRATE_115K2,3);
#万一

//将SPI初始化为从设备
spi_slave_init ();

//启用焊盘
SetBits16(Sys_ctrl_reg,pad_latch_en,1);
}

mt_dialog.
离线
最后一次露面:三个月三个星期前
职员
加入:2015-06-08 11:34
Zheshen,

Zheshen,

我将专注于您提到“在意外重置设备中将驱动线路低电平的点”,当设备重置时,58x遵循的过程由代码所在的位置(OTP或引导)确定外部设备)。当从外部设备引导时,通过设备的外围设备(UART / SPI / I2C)使用PORT0(UART / SPI / I2C)所有其他端口在输入下拉下的状态,这是销的复位状态。在OTP情况下,所有端口都处于输入的下拉状态,一旦设备将OTP镜像到Sysram,它们将保持在该状态,直到FW最终运行并且PeripH_Init()函数执行。因此,如果从58x侧出现意外重置,则会预期行的切换。

谢谢mt_dialog.

zheshen
离线
最后一次露面:1年9个月前
加入:2015-08-11 20:01
我尝试了各种各样的

我尝试了各种对话框重置(NMI/Assertion/Hard),每次RF_WAKE都会在主机控制器上触发一个中断。这就是为什么我使用它作为“对话框重置检测线”。然而,这一次这条线路被触发,而没有对话框重置正在....上进行只是不知道如何和为什么....

mt_dialog.
离线
最后一次露面:三个月三个星期前
职员
加入:2015-06-08 11:34
Zheshen,

Zheshen,

对不起,我有点困惑,在你上一篇文章中你提到了这个问题发生在设备出现意外重置时,你看到线条变低了,现在你看到当没有从设备重置时发生的事件?

您提到在设备上重置重置的处理程序,显然,由于外部原因(例如,电源问题)而言,设备将重置为原因,这就是为什么由于内存不足导致的平台_RESET通过平台_RESET,或者某些东西触发了580本身上的复位引脚(是连接到地面的复位引脚)。

谢谢mt_dialog.

zheshen
离线
最后一次露面:1年9个月前
加入:2015-08-11 20:01
抱歉我没能做到

对不起,如果我在早期的帖子中没有做这一点。我配置了rf_wake以检测意外的对话框重置,这是工作。但是,我的问题是某些时候(大约500个时间上电和断电对话框),在电源对话框后命令无线电开始广告,我看到了一个RF_Wake中断,而对话框处于正常状态串行Printf输出显示的条件。所以基本上我看到了对话重置的“误报”,我希望了解如何发生这种情况。

mt_dialog.
离线
最后一次露面:三个月三个星期前
职员
加入:2015-06-08 11:34
Zheshen,

Zheshen,

所以你可能是那个情况下的581没有重置或命中任何断言,以便导致重置但仍然rf_wake引脚切换并导致侧面的中断?这是唯一一个发生的引脚,我的意思是,如果存在一个真正的重置,其他引脚应该展示相同的行为(你检查了另一个引脚发生在rf_wake的情况下发生什么吗?)。我没有看到销钉的任何明显原因只是为了每500重新切换一次,而端口/引脚10没有任何特殊行为(我的意思是与XTAL或任何类似的串扰),并且没有观察到您呈现的行为通过对话框。您是否可以提供任何测试FW,也许可以分享以检查我们是否可以在独立设备上复制此行为?

谢谢mt_dialog.