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

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
10个帖子/ 0新
最后发表
Zheshen.
离线
最后一次露面:1年9个月前
加入:2015-08-11 20:01
当DA14581开始广告时,意外的GPIO更改

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

我发现,大约每500次中就有1次,当DA14581刚启动并与主控制器进行握手,然后开始发布,这两条GPIO线同时触发了主控制器上的意外中断。DA14581子卡由外部电源供电。我确保没有固件代码会改变GPIO线的状态。

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

任何洞察力都会非常感谢。

设备:
mhv_dialog
离线
最后一次露面:4个月2天前
工作人员
加入:2013-12-06 15:10
你好,

你好,

当使用扩展睡眠时,您将看到以下行为:在每个唤醒时,GPIOS在User_PeriPH_Setup.cn(PeripH_Init()函数中重新初始化)。此功能将重新锁存所有输出锁存器,并完全按照您描述并将所有GPIO设置为同一文件中定义的状态。

/ mhv.

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

间歇性的不必要的中断并不是来自系统从睡眠中醒来。相反,在收音机第一次被用来做广告之后,他们就对了。我将STARTUP_SLEEP_DELAY_DEFAULT改为3秒,这样当睡眠仍然被禁用时广告总是开始,但我仍然看到不必要的中断。

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

mt_dialog.
离线
最后一次露面:4个月1周前
工作人员
加入: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输出和Host输入),并期望在应用程序启动后处于空闲高电平。在意外的DA14581复位时,RF_WAKE线将在短时间内处于低电平,这将触发主机控制器上的中断,作为响应,将DA14581下电并上电。RF_RDYN用于SPI同步信号。在此之前,DA14581与主机握手涉及SPI数据传输(主机作为SPI主机)和RF_RDYN信令,未发现问题。

在set_pad_functions和powerup uart2之后,在peripher_init中调用Spi_slave_init。函数deassert_rf_wake()设置RF_WAKE的高值,在peripher_init中调用,因此在系统初始化和从睡眠中唤醒时调用。函数assert_rf_wake()将RF_WAKE设置为低值,但不会在固件代码的任何地方调用。

所有SPI信号都是从端口0配置GPIO线0.此项目基于SDK 5.0,并且没有使用特定示例。我无法捕获RF_WAKE或RF_RDY上的确切脉冲,导致该问题的问题,因为DA14581每隔几秒钟电源和电源,而且这个问题可能不会占几个小时。我确实在主机侧上有执行跟踪,在rf_wake和rf_rdyn上同时提出了rf_wake和rf_rdyn。

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

#定义GPIO_UART2_PORT GPIO_PORT_0

#define gpio_uart2_tx_pin gpio_pin_0.
#define gpio_uart2_rx_pin gpio_pin_1.

#define gpio_spi_port gpio_port_0.

#定义GPIO_SPI_CS_PIN GPIO_PIN_4
#define gpio_spi_clk_pin gpio_pin_5
#define gpio_spi_di_pin gpio_pin_6.
#define gpio_spi_do_pin gpio_pin_7.

#define gpio_rf_port gpio_port_1.

#define gpio_rf_wake_pin gpio_pin_0.
#定义GPIO_RF_RDYN_PIN GPIO_PIN_1

Void set_pad_functions(Void) //设置gpio端口函数模式
{
// UART引脚配置
gpio_configurein (GPIO_UART2_PORT, GPIO_UART2_TX_PIN, OUTPUT, 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_configurein (GPIO_SPI_PORT, GPIO_SPI_CLK_PIN, INPUT, PID_SPI_CLK, false);
gpio_configurepin(gpio_spi_port,gpio_spi_cs_pin,输入,pid_spi_en,true);//活动低电平
GPIO_ConfigurePin(GPIO_SPI_PORT, GPIO_SPI_DO_PIN, INPUT_PULLDOWN, PID_GPIO, false);//初始设置为PULLDOWN,当断言CS时将设置为OUTPUT。
gpio_configurepin(gpio_spi_port,gpio_spi_di_pin,输入,pid_spi_di,false);

// rf_wake和rf_rdyn引脚配置
gpio_configurepin(gpio_rf_port,gpio_rf_wake_pin,输出,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线被断言
而(! rf_wake_is_asserted ())
{
setword16(rf_wake_reset_data_reg,rf_wake_mask);
}
}

/ **
****************************************************************************************
* @brief de-sensert rf_wake信号。
****************************************************************************************
*/
__inline void deassert_rf_wake(void)
{
//拉出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);
//}
}

void spi_slave_init(void)
{
// 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空闲时强制sp_do为0

// SPI控制寄存器1 SPI_CTRL_REG1
setbits16(spi_ctrl_reg1,spi_fifo_mode,0x00);//使能SPI RX和TX FIFO

SetBits16 (SPI_CTRL_REG SPI_ON 1);//启用SPI模块

//设置中断
NVIC_SetPriority (SPI_IRQn 20);//设置中断优先级为20,0是最高的
nvic_enableirq(spi_irqn);

//如果BLE FW准备好与居里交谈
如果(Readyforspitraffic)
{
// deassert rf_attn和rf_wake行
deassert_rf_rdyn ();
deassert_rf_wake();
}
}

void periph_init(空白)
{
//上电外围设备的电源域
setBits16(PMU_CTRL_REG,PERIPH_SLEEP,0);
而(!(getword16(sys_stat_reg)&per_is_up));

setBits16(CLK_16M_REG,XTAL16_BIAS_SH_ENABLE,1);

// rom补丁
patch_func();

/ /初始化垫
set_pad_functions();

/ /(重新)外围设备进行初始化
/ /。
// uart_init(Uart_baudrate_115k2,3);

#if (define (ENABLE_PRINTF) || define (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.
离线
最后一次露面:4个月1周前
工作人员
加入:2015-06-08 11:34
嗨zheshen,

嗨zheshen,

我将重点关注您提到的“在意外复位设备将驱动行低”的点,当设备复位时,58x遵循的过程是由代码所在的位置决定的(无论是OTP还是从外部设备启动)。当从外部设备启动时,PORT0正在通过设备的外设(UART/SPI/I2C)使用,所有其他端口都处于INPUT PULL DOWN状态,这是引脚的复位状态。在OTP的情况下,所有端口都处于INPUT PULLDOWN状态,一旦设备将OTP镜像到sysram,它们将保持该状态,直到fw最终运行,并执行外围init()函数。因此,如果从58x侧有一个意外的重置,线路的切换是相当预期的。

谢谢mt_dialog.

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

我尝试了各种对话框重置(NMI /断言/硬),每次RF_WAKE会触发主机控制器上的中断。这就是为什么我用它作为“对话重置检测行”。但是,这次这条行被触发而在没有对话框重置时发生了....只是无法弄清楚如何以及为什么....

mt_dialog.
离线
最后一次露面:4个月1周前
工作人员
加入: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.
离线
最后一次露面:4个月1周前
工作人员
加入:2015-06-08 11:34
嗨zheshen,

嗨zheshen,

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

谢谢mt_dialog.