三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

[其他芯片] 由按键检测和LED驱动异常到对CH452A芯片的复位功能的思考

[其他芯片] 由按键检测和LED驱动异常到对CH452A芯片的复位功能的思考

最近项目上使用了CH452A芯片,板子上用了两颗CH452A,一颗用于驱动LED阵列,一颗用于检测KEY阵列,CPU板上的MCU分别通过4线接口与按键板上的CH452A进行通信,另外,将CH452A的复位引脚RST1连接到了MCU的GPIO口,起初的目的是为了通过MCU对CH452A进行硬件上的手动复位,其中芯片的复位引脚RST1即第28pin如下所示:

605756982a7086f44d.png(148.06 KB, 下载次数: 0)

下载附件

2026-2-4 09:55 上传

硬件上的框图大概如下图所示:

因为MCU资源有限,所以两颗CH452A的复位脚共用MCU的同一个GPIO口进行控制操作。

然后我这边自测期间出现过两次程序一直正常运行着,但同时出现了按键无法检测和LED无法驱动的异常现象,本来说等再复现的时候喊硬件同事来看下情况。

然后搭建了一套给应用测试,结果很快就出现上面的现象,所以开始了排查之路。

因为之前看过CH452A的用户手册,里面的关于复位操作和设计注意事项什么的,也有说明:

而我们的设计其实就在CH452A和单片机分属两块PCB的情况,因此连接线长度已经尽量短,目测10多厘米长吧,看上去也蛮粗的了。不过目前的硬件RST1引脚和GND直接只是串接了一颗电阻,没有接一个对地的滤波电容。

然后目前软件上MCU和CH452A的通信速度,用逻辑分析仪测试了一下DLCK的波形,大概是440KHZ左右,应该不算高吧:

从使用示波器测试出的DCLK波形来看,也还可以。

硬件同事开始给应用测试使用的连接CPU板和按键板的连接线直接使用了很长的线,目的是方便硬件的各种测试。然后硬件开始排查问题,一不小心的操作,换了实际需要使用的10多厘米长的线,然后测试看了一下,基本上都正常了。

其实我之前就猜测估计是复位引脚信号RST1突然变异常导致的,不然的话,不可能每次出现,两颗CH452A芯片都不行,百分之99就是这个复位信号的锅。

数据手册上对RST1引脚的描述是这样的:

也就是给RST1发送高电平信号,既可以复位CH452A芯片。因此,之前在软件上的初始化芯片的设计也是按下面代码写的:

复制

  1. #define CH452_RESET_SET() gpio_bits_write(KEY_CH452_RST1_GPIO, KEY_CH452_RST1_PIN, TRUE)
  2. #define CH452_RESET_CLR() gpio_bits_write(KEY_CH452_RST1_GPIO, KEY_CH452_RST1_PIN, FALSE)
  3. //pin reset
  4. CH452_RESET_SET();
  5. CH452_Delay(CHIP_RESET_DELAY);
  6. CH452_RESET_CLR();

芯片每次上电都能正常运行,说明这种引脚复位芯片的操作是成功的。

但是应用测试那边还是同时出现了按键无法检测和LED无法驱动的异常现象,我就直接让硬件把复位连接线去掉,直接把复位脚短接到按键板上的GND上面,反正软件上可以通过复位命令对芯片进行复位操作:

通过命令复位的代码如下:

复制

  1. void CH452_Delay(uint32_t count)
  2. {
  3. #if 0
  4. uint32_t i;
  5. for(i = 0; i < count; i++)
  6. {
  7. __asm("nop");
  8. }
  9. #else
  10. __IO uint32_t delay_time = count * (system_core_clock / 24000000);
  11. do
  12. {
  13. __NOP();
  14. }
  15. while(delay_time --);
  16. #endif
  17. }

复制

  1. void CH452_Write(uint8_t chip_index, uint16_t cmd)
  2. {
  3. uint8_t i;
  4. CH452_LOAD_CLR(chip_index); //命令开始,LOAD=0
  5. for(i=0; i<12; i++) //送入12位数据,低位在前
  6. {
  7. // 输出位数据
  8. if (cmd & 1)
  9. {
  10. CH452_DIN_SET(chip_index);
  11. }
  12. else
  13. {
  14. CH452_DIN_CLR(chip_index);
  15. }
  16. CH452_DCLK_CLR(chip_index);
  17. CH452_Delay(DLCK_FREQ_DELAY);
  18. cmd>>=1;
  19. CH452_DCLK_SET(chip_index); //上升沿有效
  20. CH452_Delay(DLCK_FREQ_DELAY);
  21. }
  22. CH452_LOAD_SET(chip_index); //加载数据,LOAD上升沿
  23. //命令数据加载周期不小于6US,to test
  24. CH452_Delay(CMD_LOAD_DELAY);
  25. //ENABLE_KEY_INTERRUPT();
  26. }

复制

  1. //command reset
  2. CH452_Write(chip_index, CH452_RESET);
  3. CH452_Delay(CHIP_RESET_DELAY);

硬件修改了,即直接分别把两颗芯片的复位脚短接到按键板上的GND上面,然后直接上电测试,发现按键检测正常,LED驱动也正常,奇怪了,这样子软件还没有操作对芯片的上电复位操作,芯片上电后也可以直接正常工作?我用自己的调试环境验证了一下,即把上电复位操作的代码全部屏蔽掉再测试,确实啊,芯片上电后也可以直接正常工作。

我又去看了用户手册关于复位的说明,关于芯片内部复位有下面的说明:

难道其意思是不管板子上电的时候有没有通过RST1引脚对芯片进行复位,或者有没有通过MCU发送命令对芯片进行复位,芯片都可以进入正常的工作状态?按目前实测结果来看,应该是这样子了。

硬件修改以后,目前测试倒是还没有出现异常。

主要是MCU无法知道按键检测是否正常, LED驱动是否正常,不然的话,还可以在芯片出现异常的时候,MCU通过RST1引脚给芯片复位一下,并且重新初始化一下芯片配置。

看来使用CH452A芯片,做好抗干扰设计太重要了;目前的抗干扰稳定性主要就要靠硬件了,不知道到时硬件干扰测试和EFT测试会是什么情况?能不能一次性成功?偷偷捏把汗~~

不过这里有一点,CH452A芯片还有一个比功能,在其他芯片上还真是没见过,算我第一次见,即可以通过RST引脚或者RST#引脚输出复位信号给MCU,让MCU产生复位:

根据MCU是低电平复位还是高电平复位,将RST或者RST#连接到MCU的复位引脚信号就可以了,类似手册里面的参考设计图:

其实就是在CH452A芯片产生复位的时候,该芯片会通过RST或者RST#引脚输出电平信号:

后续如果测试还是出现异常,那说不定真要考虑这种设计了,再不行就是换方案了。

以上便是我由按键检测和LED驱动异常到对CH452A芯片的复位功能的解读和思考~~


---------------------
作者:dffzh
链接:https://bbs.21ic.com/icview-3505616-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

← 返回列表