This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] BQ25155EVM:触发 ADC 未就绪的中断。

Guru**** 2526720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/907004/bq25155evm-triggering-interrupt-not-adc-ready

器件型号:BQ25155EVM

您好、TI 支持。

一段时间以来、我一直尝试使其正常工作、但不知怎么说、当 ADC 转换准备就绪时、我没有收到任何中断。

因此、我将在电池工作模式期间手动触发 ADC 转换(ADCCTRL0.ADC_CONV_START = 1)。 此外、我还设置了 VBAT 的 MASK2 (MASK2.ADC_READY_MASK = 1)和 ADC_READ_EN (ADC_READ_EN.EN_VBAT_READ = 1)。 然后、如果我没有错过数据表中的某个内容、则应在 ADC 转换准备就绪时触发中断引脚。 但由于某种原因、它不会。 然后、如果我在 ADC 转换开始1秒后手动读取 FLAG2寄存器、我会看到 FLAG2.ADC_READY_FLAG 位被置位。 此外、通常还可以读取 VBAT 值、它也是正确的值(如预期的那样)...

我通常可以写入和读取寄存器、我确信 I2C 通信正常工作。 我可以读取所有默认寄存器值、我可以设置 LDO 电压等 我确信中断在其他情况下可以正常工作、比如说是连接了 VIN、还是按下了 MR 等

以下是一些基本寄存器设置、我认为这些设置应该足以满足我的需求...

基本代码示例(不包括代码的某些方以提高可读性):


/*
目标是在电池激活模式下(仅连接电池)手动启动 ADC 转换、并
在 ADC 转换完成后接收中断(上升沿)。

所需的寄存器说明:
•FLAG2- ADC 标志->标志 ADC_READY_FLAG 指示 ADC 转换的状态(读取时清除)。
•MASK2-中断屏蔽2.->触发中断线的事件屏蔽。 ADC 就绪的 ADC_READY_MASK。
•ADCCTRL0- ADC Control 0->手动启动 ADC 转换。 将 ADC_CONV_START 位设置为"1"。
•ADC_READ_EN-通道启用->启用特定的 ADC 转换。 在本例中为 EN_VBAT_READ。
*

#define BQ2515X_ADC_READ_EN 0x58
#define BQ2515X_MASK2 0x09
#define BQ2515X_ADCCTRL0 0x40
#define BQ2515X_FLAG2 0x05

结构 FLAG2{
   bool TS_open_FLAG :1;
   uint8_t 保留:3;
   bool comp3_alarm_flag :1;
   bool comp2_alarm_flag :1;
   bool COMP1_ALARM_FLAG :1;
   bool adc_ready_flag :1;
}FLAG2;

结构 MASK2{
   bool TS_open_mask :1;
   uint8_t 保留:3;
   bool comp3_alarm_mask :1;
   bool comp2_alarm_mask :1;
   bool COMP1_ALARM_MASK :1;
   bool adc_ready_mask:1;
}MASK2;

结构 ICCTRL0{
   bool sw_reset :1;
   bool hw_reset :1;
   bool global_INT_MASK :1;
   bool 保留:1;
   uint8_t AUTOWAKE :2;
   bool reserved_1:1;
   bool EN_ship_mode:1;
}ICCTRL0;

结构 ADC_READ_EN{
   bool 保留:1;
   bool EN_ADCIN_READ:1;
   bool EN_TS_Read:1;
   bool EN_VBAT_READ:1;
   bool EN_VIN_READ:1;
   bool EN_ICHG_READ:1;
   bool EN_PMID_READ:1;
   bool EN_IIN_READ:1;
}ADC_READ_EN;

//初始化 BQ25155。 void bq25155_init()//所有寄存器都设置为默认值。 ADC_READ_EN.EN_VBAT_READ = 1;//启用 VBAT ADC 转换。 bq25155_WRITE_REG (BQ2515X_ADC_READ_EN、&ADC_READ_EN);//写入 ADC_READ_EN 寄存器。 MASK2.ADC_READY_MASK = 1;//启用 ADC 就绪中断触发屏蔽。 bq25155_WRITE_reg (BQ2515X_MASK2、&MASK2);//写入 MASK2寄存器。 //每2秒调用一次。 void start_adc_conv (){ ADCCTRL0.adc_conV_start = 1;//设置此位以启动 ADC 转换。 bq25155_WRITE_reg (BQ2515X_ADCCTRL0、&ADCCTRL0); } //在上升沿和/或下降沿调用 ISR。 void bq25515_ON_INT_CHANGE (){ //读取 FLAG2寄存器并清除其值,以便下次触发中断。 bq25155_READ_reg (BQ2515X_FLAG2、&FLAG2);//读取 FLAG2寄存器。 printf ("F2:0x%.2X\n"、FLAG2); if (FLAG2.ADC_READY_FLAG){ // ADC 转换已完成。 //读取 ADC VBAT MSB 和 LSB 寄存器->读取正确的值(电池电压) 。} }

请您帮助我弄清楚数据表中缺少什么以及我做了什么错误...

并展望解决问题的前景。

 

此致、Ales Zupanc。

固件开发人员、Polabs d.o.o.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    哦天哪,对不起标题中的拼写错误!

    它应该是"不在 ADC 就绪时触发中断"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    如果将 ADC 就绪屏蔽设置为1、则不会获得中断。 将 ADC 就绪屏蔽设置为0、您将获得中断。