当DA14581启动广告意外GPIO变化

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

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

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

所述DA14581配置有扩展休眠模式。当它连接BLE或断电从来没有发现这个问题。

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

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

你好,

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

/ mhv.

Zheshen.
离线
最后一次露面:1年9个月前
加入:2015年8月11日20:01
间歇无用

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

另外我从来没有见过这种情况发生,同时BLE已连接并启用扩展睡觉。

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

Zheshen,

可否请您让我们知道您正在使用的针和出现的问题?你确定这些引脚不使用581的任何外围设备,使他们能够接管该特定接脚的控制,SPI接口也许是针?你能不能也请让我们知道开始的例子,你已经为了开发应用程序中使用?也或许这是相关的电源,这样你就可以请检查电源和监控的事件时有发生的功率的状态?你确定中断发生在外部设备上是因为GPIO的的触发的(你有监控用分析仪针?)。那你已经注意到了设备切换引脚,你有刚刚无线电活动活动之前的输出,可能是由于您已启用诊断引脚,你有这种functionallity对项目的事实呢?

谢谢mt_dialog.

Zheshen.
离线
最后一次露面:1年9个月前
加入:2015年8月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信号都是从端口0配置GPIO线0.此项目基于SDK 5.0,并且没有使用特定示例。我无法捕获RF_WAKE或RF_RDY上的确切脉冲,导致该问题的问题,因为DA14581每隔几秒钟电源和电源,而且这个问题可能不会占几个小时。我确实在主机侧上有执行跟踪,在rf_wake和rf_rdyn上同时提出了rf_wake和rf_rdyn。

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

#define gpio_uart2_port gpio_port_0.

#定义GPIO_UART2_TX_PIN GPIO_PIN_0
#define gpio_uart2_rx_pin gpio_pin_1.

#定义GPIO_SPI_PORT GPIO_PORT_0

#define gpio_spi_cs_pin gpio_pin_4.
#定义GPIO_SPI_CLK_PIN GPIO_PIN_5
#定义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.
#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,输入,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,输入,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,OUTPUT,PID_GPIO,真正的);//活性低
}

/ **
****************************************************************************************
* @brief断言RF_WAKE信号。
****************************************************************************************
* /
__inline空隙assert_rf_wake(无效)
{
//拉RF_WAKE GPIO线低(断言RF_WAKE线)
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);
}
}

/ **
****************************************************************************************
* @brief de-sensert rf_wake信号。
****************************************************************************************
* /
__inline void deassert_rf_wake(void)
{
//拉RF_WAKE GPIO线高(撤消RF_WAKE线)
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空闲时强制SPI_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);//为现在TBD设置中断优先级为20,0最高
nvic_enableirq(spi_irqn);

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

空隙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();

// 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.
离线
最后一次露面:4个月1周前
职员
加入: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年8月11日20:01
我尝试了各种各样的

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

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

Zheshen,

对不起,我有点糊涂了,在以前的帖子你提到当设备获得了意外复位你看到线变低,现在你看,当没有从设备复位发生事故时出现的问题,?

处理程序你提到强制设备上的复位,显然设备重置由于外部原因(例如电源问题),这就是为什么你看到的线变低或者也许它会经过一个platform_reset由于内存不足,什么触发对580自身的复位引脚(接地线都连接复位引脚?)。

谢谢mt_dialog.

Zheshen.
离线
最后一次露面:1年9个月前
加入:2015年8月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.