DA14581开始发布时发生意外的GPIO变化

⚠️
你好。。谢谢你来到论坛。令人兴奋的消息!我们现在正在迁移到新的论坛平台,该平台将提供更好的功能,并包含在主对话网站中。所有员额和帐户都已迁移。我们现在只接受新论坛的流量-请在//www.wsdof.com/support. 我们将在未来几天内修复bug/优化搜索和标记。
10个帖子/ 0个新帖子
最后一篇文章
哲深
离线
最后看到:一年九个月前
加入:2015-08-11 20:01
DA14581开始发布时发生意外的GPIO变化

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

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

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

如有任何见解,将不胜感激。

设备:
MHv_Dialog
离线
最后看到:4个月2周前
工作人员
加入:2013-12-06 15:10
你好

你好

使用扩展睡眠时,您将看到以下行为:在每次唤醒时,GPIO在user_periph_setup.c(periph_init()函数)中重新初始化。此函数将重新锁定所有输出锁存,并完全按照您的描述操作,并将所有GPIO设置为同一文件的set_pad_functions()中定义的状态。

/MHv

哲深
离线
最后看到:一年九个月前
加入:2015-08-11 20:01
断断续续的不需要的

间歇性不必要的中断并不是从睡眠中唤醒的系统造成的。相反,他们是在第一次打开收音机做广告之后。我将启动\u SLEEP\u DELAY\u默认值更改为3秒,这样广告总是在睡眠仍处于禁用状态时启动,但我仍然看到不必要的中断。

此外,当BLE连接和延长睡眠启用时,我从未见过这种情况发生。

MT_dialog
离线
最后看到:4个月3周前
工作人员
加入:2015-06-08 34
嗨,哲深,

嗨,哲深,

你能告诉我们你用的是哪个引脚,发生了什么问题吗?你确定那些引脚没有被581的任何外设使用,所以他们可以接管特定引脚的控制,可能是SPI接口的引脚?您是否也可以让我们知道您用于开发您的应用程序的起始示例?也许这也和电源有关,所以你能在事故发生时检查电源并监控电源状态吗?你确定在外部设备上发生的中断是由于GPIO的切换(你用分析器监视引脚了吗?)事实上,你已经注意到设备切换的引脚,你有作为输出的无线电活动活动,可能是由于事实,你已经启用诊断引脚,你在项目上有这种功能吗?

由于MT_dialog

哲深
离线
最后看到:一年九个月前
加入:2015-08-11 20:01
MT_dialog:

MT_dialog:

请参阅下面的代码。RF_WAKE和RF_RDYN都配置为端口1的GPIO线(DA14581输出和主机输入),并且在应用程序启动后预计处于高空闲状态。在意外的DA14581复位时,RF_唤醒线将在短时间内处于低电平,这将触发主机控制器上的中断,作为响应,该中断将关闭DA14581电源并打开DA14581电源。射频同步器用于SPI同步信号。在此之前,DA14581与主机之间的握手涉及SPI数据传输(主机作为SPI主机)和RF_RDYN信令,未发现任何问题。

spi_slave_init在设置_pad_函数和通电uart2后在periph_init中调用。函数deassert_rf_wake()将rf_wake设置为高在periph_init中调用,因此在系统初始化和从睡眠中唤醒时调用。函数assert_rf_wake()将rf_wake设置为低,但在固件代码中的任何地方都没有调用。

所有SPI信号都是从端口0配置的GPIO线。该项目基于SDK 5.0,未使用任何特定示例。由于DA14581正在通电并每隔几秒钟通电,我无法捕获导致问题的RF_WAKE或RFrdyn上的确切脉冲,并且该问题可能在数小时内不会出现。我确实有执行跟踪主机端的e显示RF_WAKE和RF_RDYN同时出现中断。

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

#定义GPIO\U UART2\U端口GPIO\U端口\U 0

#定义GPIO_UART2_TX_PIN GPIO_PIN_0
#定义GPIO_UART2_RX_引脚GPIO_引脚1

#定义GPIO_SPI_PORT GPIO_PORT_0

#定义GPIO_SPI_CS_引脚GPIO_引脚4
#定义GPIO_SPI_CLK_PIN GPIO_PIN_5
#定义GPIO_SPI_DI_PIN GPIO_PIN_6
#定义GPIO_SPI_DO_引脚GPIO_引脚7

#定义GPIO_射频_端口GPIO_端口_1

#定义GPIO_射频_唤醒_引脚GPIO_引脚_0
#定义GPIO_RF_RDYN_引脚GPIO_引脚1

void set\u pad\u函数(void)//设置gpio端口函数模式

//UART引脚配置
GPIO_配置引脚(GPIO_UART2_端口,GPIO_UART2_发送引脚,输出,PID_UART2_发送,错误);
GPIO_配置引脚(GPIO_UART2_端口、GPIO_UART2_RX_引脚、输入_下拉、PID_UART2_RX、假);

//未使用的引脚配置
GPIO_配置引脚(GPIO_未使用的端口、GPIO_未使用的OTP_引脚、输入_下拉、PID_GPIO、false);
GPIO_配置引脚(GPIO_未使用的端口、GPIO_未使用的3引脚、输入_下拉列表、PID_GPIO、false);

//SPI引脚配置
GPIO_配置引脚(GPIO_SPI_端口、GPIO_SPI_时钟引脚、输入、PID_SPI_时钟、假);
GPIO_配置引脚(GPIO_SPI_端口,GPIO_SPI_CS_引脚,输入,PID_SPI_EN,真);//低电平有效
GPIO_配置引脚(GPIO_SPI_端口、GPIO_SPI_DO_引脚、输入_下拉、PID_GPIO、false);//最初设置为下拉,在断言CS时将设置为输出。
GPIO_配置引脚(GPIO_SPI_端口、GPIO_SPI_DI_引脚、输入、PID_SPI_DI、假);

//RF_尾流和RF_RDYN引脚配置
GPIO_配置引脚(GPIO_射频_端口,GPIO_射频_唤醒_引脚,输出,PID_GPIO,真);//低电平有效
GPIO_ConfigurePin(GPIO_RF_PORT, GPIO_RF_RDYN_PIN, OUTPUT, PID_GPIO, true);/ /活性低

/**
****************************************************************************************
* @brief断言RF_WAKE信号。
****************************************************************************************
*/
__INLINE空白assert_rf_wake(空白)

//将RF_WAKE的GPIO线调低(assert RF_WAKE line)
SetWord16(射频唤醒复位数据注册,射频唤醒屏蔽);

//轮询以确保RF_ATTN线路被断言
而(!rf_wake_是_断言的())

SetWord16(射频唤醒复位数据注册,射频唤醒屏蔽);

/**
****************************************************************************************
*@短暂取消断言RF_唤醒信号。
****************************************************************************************
*/
__内联void deassert_rf_尾流(void)

// RF_WAKE GPIO线高(deassert RF_WAKE line)
SetWord16(RF_WAKE_SET_DATA_REG,RF_WAKE_MASK);

//轮询以确保RF_唤醒线已解除断言
//while(rf_wake_是_断言的())
/ / {
//SetWord16(RF_WAKE_SET_DATA_REG,RF_WAKE_MASK);
/ /}

void spi_slave_init(void)

//外围时钟寄存器
SetBits16 (CLK_PER_REG SPI_DIV SPI_FREQ_DIV_2);//设置SPI内部时钟分配器为2,
//这允许16M/2=8M SPI采样频率
// SPI采样频率至少需要4X > SPI时钟频率
设置16(CLK_PER_REG,SPI_ENABLE,1);//为SPI启用时钟

// SPI控制寄存器SPI_CTRL_REG . aspx
SetBits16 (SPI_CTRL_REG SPI_ON 0);//关闭SPI模块,如果打开
SetBits16(SPI\U CTRL\U REG、SPI\U字、SPI\U模式\U 32位);//设置为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
设置16(SPI控制、SPI控制、SPI控制启用);//对CPU启用SPI可屏蔽中断
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控制REG1,SPI FIFO模式,0x00);//启用SPI接收和发送FIFO

设置16(SPI_CTRL_REG,SPI_ON,1);//启用SPI模块

//设置中断
NVIC设置优先级(SPI IRQn,20);//将中断优先级设置为20,现在待定,0为最高
NVIC_EnableIRQ(SPI_IRQn);

//如果BLE FW准备好与居里交谈
if(已准备好用于PITRAFFIC)

//拆卸右前附件和右后尾线
deassert_rf_rdyn();
deassert_rf_wake ();

空白periph_init(空白)

//启动外设的电源域
SetBits16 (PMU_CTRL_REG PERIPH_SLEEP 0);
而(!(GetWord16(SYS_STAT_REG)&PER_是向上的));

设置16(CLK_16M_REG,XTAL16_BIAS_SH_ENABLE,1);

/ /罗补丁
patch_func();

//初始焊盘
设置_pad_函数();

//(重新)初始化外围设备
//即。
//uart_init(uart_波特率_115K2,3);

#if(已定义(启用打印)已定义(测试总线已启用UART2))
SetBits16 (CLK_PER_REG UART2_ENABLE 1);
uart2_init(UART_波特率_115K2,3);
# endif

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

//启用pads
SetBits16(系统控制寄存器、焊盘锁存器、1);

MT_dialog
离线
最后看到:4个月3周前
工作人员
加入:2015-06-08 34
嗨,哲深,

嗨,哲深,

我将重点讨论您提到的“在意外重置时,设备将使线路变低”这一点,当设备重置时,58x遵循的过程取决于代码所在的位置(OTP或从外部设备引导)。从外部设备引导时,端口0通过设备的外围设备(UART/SPI/I2C)使用。所有其他端口都处于输入下拉状态,即引脚的复位状态。在OTP情况下,所有端口都处于输入下拉状态,一旦设备将OTP镜像到系统内存,它们将保持该状态,直到fw最终运行并执行periph_init()函数。因此,如果58x侧出现意外重置,则线路的切换是意料之中的。

由于MT_dialog

哲深
离线
最后看到:一年九个月前
加入:2015-08-11 20:01
我尝试了各种各样的方法

我尝试了各种对话框重置(NMI/Assertion/Hard),每次RF_唤醒都会触发主机控制器上的中断。这就是为什么我将其用作“对话框重置检测线”。然而,这一次这条线在没有对话框重置的情况下被触发……只是不知道如何以及为什么。。。。

MT_dialog
离线
最后看到:4个月3周前
工作人员
加入:2015-06-08 34
嗨,哲深,

嗨,哲深,

对不起,我有点困惑,在你之前的帖子中你提到当设备得到意外复位时就会发生问题,你看到线变低了,现在你看到当设备没有复位时就会发生事故?

您提到的处理程序强制设备复位,显然设备由于外部原因(例如电源问题)而复位,这就是为什么您看到线路变低,或者可能由于内存不足而通过平台复位,或者有什么东西触发580本身的复位引脚(复位引脚是否接地?)。

由于MT_dialog

哲深
离线
最后看到:一年九个月前
加入:2015-08-11 20:01
对不起,如果我没做这个

很抱歉我在之前的帖子中没有说清楚。我配置了RF_WAKE来检测意外的对话框重置,这是有效的。然而,我的问题是,一些时间(约500次的启动和关闭对话框),启动对话框后,吩咐收音机广告开始,我看到RF_WAKE中断,当对话框在正常状态如图所示从串行printf输出。所以基本上我看到了对话框重置的“假阳性”,我正在寻找这是如何发生的。

MT_dialog
离线
最后看到:4个月3周前
工作人员
加入:2015-06-08 34
嗨,哲深,

嗨,哲深,

所以你是肯定的,在这种情况下,581没有重置或击中任何断言,以导致重置,但仍然RF_WAKE引脚切换,并导致中断在你的一边?这是发生的唯一引脚,我的意思是,如果有一个真正的重置,其他引脚应该演示相同的行为(你检查了发生在RF_WAKE时,其他引脚发生了什么?)我看不出有任何明显的理由让pin每500次切换一次,端口/pin 10没有任何特殊的行为(我的意思是与XTAL或任何类似的交叉),你所呈现的行为不会被Dialog观察到。你能提供任何测试fw,也许你可以分享,以检查我们是否可以复制这种行为在一个独立的设备?

由于MT_dialog