调试GX2431你可能会遇到的那些事儿

GX2431芯片是单总线通信的方式,如果具有单总线调试的经验,将会非常顺利,如果是首次调试单总线芯片,那么你可能会在写程序的过程中遇到奇奇怪怪的问题,这些问题可能使你迷失方向,或者失去耐心,如果你恰好正在调试GX2431芯片,又正好遇到了些问题,那么不妨看看下面有没有遇到对应的问题以及解决方案;

在写问题和解决方案前,请允许我叙述一下单总线通信的逻辑。如调试其他芯片一样,在编写底层通信逻辑的时候,首先要了解和芯片通信的方式,GX2431芯片是单总线的通信方式,那么先了解一下什么是单总线通信,硬件推荐电路图如下图:

结合手册中描述得出:单总线通信方式是寄生供电的方式,外部需要一个上拉电阻,这是由芯片IO接口是开漏方式决定的特性,即开漏方式的接口外部都需要外接一个上拉电阻,这样芯片才能输出高电平。PMOS的作用是提示芯片在进行写数据的时候最好是由主机切换成推挽的方式(非必须项)。总结:GX2431芯片外部接1个1K的上拉电阻即可,硬件电路简单。

  1. 复位与应答时序

    2.读写1位时序

结合上面的单总线协议的读写方法,现在会对单总线有一个比较清晰的认识,原来是就像我们平时试用的串口通信一样的异步通信逻辑,即通信时序代表含义以及通信速度(波特率)不一样,同时也间接说明了单总线通信的方式对时序要求高。

1)写好了程序,我怎么验证我写的时序是否是正常的?

通常,为了验证程序写的是否正常,需要借助一个固定或者已知的数据来反向验证程序的正常与否。恰好,GX2431芯片拥有64bits的固定唯一序列码,可以通过主机发送复位得到应答后,主机发送33h(读取ROM命令),连续读取8个字节。可以通过主机软件的debug模式查看读取的数据,或者串口打印的方式查看读取的数据。可以对比数据是否是下图描述的样子,如果不是,那么就代表程序的时序还需要修改。芯片的ROM中的CRC8是计算程序如下:

unsigned char crc8 = 0;								// 循环冗余校验结果

void Cal_Crc(unsigned char num, u8* dat) {
	unsigned char i     = 0;
	unsigned char j     = 0;
 
  crc8  = 0;
	for ( i = 0; i < num; i++) {
		crc8 = crc8 ^ dat[i];
		for (j = 0; j < 8; j++) {
			if (crc8 & 1) {crc8  = crc8 >> 1;	crc8 ^= 0x8c;}
			else		   crc8  = crc8 >> 1;
		}
	}
}

2)写好了程序,但是我发现读取芯片的ROM是全FFH或者00H或者每次读取的ROM都是改变的,都是按照手册给定的时序调的代码,是哪里出问题了?

通常,遇到FFH这种特殊的错误且稳定的一致,就要考虑硬件方面的因素了,FFH一般是开路的原因导致,即芯片没有焊接好造成的主机IO与芯片的IO没有连接在一起,再加上上拉电阻的外部电路构造,并且主机对芯片的应答信号没有给予返回值判断,这才造成主机读取的数据一直是高电平,即FFH。

00H就比较特殊了,通常是由于不清楚芯片的通信IO与GND是哪两个,随便一插,恰好插接反了会导致读取的数据稳定是00H,这是因为主机的IO接在芯片的GND上,将总线电平拉低,导致主机读取数值为00H,这时候可以按照手册描述的确认好芯片的pin正确分布。已确认芯片的pin分布是正常的,这时就要考虑芯片焊接的因素,是否将芯片的GND与IO不小心焊接短路,此种情况就会将总线电平拉低,从而导致主机读取数据恒定为00H。此种情况的判断可以使用万用便的蜂鸣器档位,测量GND与DQ引脚是否短路状态。芯片应答信号是高电平与低电平组合,如果程序仅仅只判断低电平,这种情况的检测芯片是否有应答信号就会出现误判,即主机没办法判断是短路造成的低电平还是芯片应答给出的低电平。解决方案是主机在检测应答信号的时候添加判断TRH时长即可排除。

最后一种情况是从程序上看时序冗余量也在单总线约束内,但是读取出来的数据就是不对或者每次读取的数据都不一样。这是就要考虑两个因素中断和库函数调用占用时长。对于中断的情况,即主机在运行读写数据的过程中有优先级别更高的事件请求,打断当前针对GX2431芯片的读写操作,去执行其他的事件,单总线又是对时序要求较高,即高低时长代表的含义不一样,从而可能会随机的干扰到数据,继而干扰到芯片对命令的识别,或者对数据的输出,针对主机确实有中断的实际需求,可以在读或者写单独1bit的程序种稍作改动,即每次读或者写位的时候进行关中断和开中断的请求,即进行最小单位或者最小时长的划分,满足应用系统的需求。对于库函数调用占用时长的问题是非常隐蔽的,这个问题的判断需要借助示波器的分析才能判断以及解决,问题的发生原因有两个方面,一个方面是时序读取的时候靠近时序释放节点,即造作太靠近时序末端,另一个方面是部分单片机在执行库函数读写一位会占用较长时间,一般型号单片机执行库函数的读1bit占用时长按在3-10us计算,针对此种情况的解决方案是读写位操作时序尽可能在规范时序的中间节点,或者依据实际应用靠前或者靠后进行调整。

3)写好了程序,读取数据时候查验是正常的,但是写数据为什么会有失败的情况?

就单独写数据而言,判断数据是否正常写入的依据一般是发送复制命令后经过至少10ms的等待时间后读取的状态返回值,或者读取EEPROM和目标数据进行对比的结果。所以GX2431芯片在写EEPROM的时候就有一个关键时间至少10ms的等待期,这个时间虽然是有一定的冗余,但是在实际的应用中,最好还是能保证不少于10ms的等待时间。另外一种情况就是上拉电阻的选取过大,GX2431在进行EEPROM的编程的时候会有最大1mA的功耗,一般是0.6mA,如果电阻电阻选取过大,将会导致编程的过程中瞬时功耗不满足导致数据编程失败。

此种情况下就可以考虑前文提到的写数据的时候,主机开启推挽模式,或者降低上拉电阻的阻值,以满足芯片的编程动态功耗需求。

以上基本是每个在初次接触单总线芯片都可能会遇到的问题,在遇到问题,首先是要保持冷静,有条件的可以借助外部工具,比如示波器、逻辑分析仪,往往更能精准的找到原因,达到事半功倍的效果。

重点⬇⬇⬇⬇⬇

注:GX2431芯片完全对标DS2431,在国内外均有大量应用,热烈欢迎感兴趣的客户试用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值