打印
[技术问答]

N76E003读取间隙电压的精确计算值时,为什么还要条件选取

[复制链接]
1930|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xxh0201|  楼主 | 2019-4-25 17:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
N76E003读取间隙电压的精确计算值时,为什么还要条件选取,读两个rom的值?

例程如下:

void READ_BANDGAP()
{
                UINT8 BandgapHigh,BandgapLow,BandgapMark;
                double Bandgap_Value,Bandgap_Voltage_Temp;
       
    set_IAPEN;
    IAPCN = READ_UID;
    IAPAL = 0x0d;
    IAPAH = 0x00;
    set_IAPGO;
                BandgapLow = IAPFD;
                BandgapMark = BandgapLow&0xF0;
                       
                if (BandgapMark==0x80)
                {
                                BandgapLow = BandgapLow&0x0F;
                                IAPAL = 0x0C;
                                IAPAH = 0x00;
                                set_IAPGO;
                                BandgapHigh = IAPFD;
                                Bandgap_Value = (BandgapHigh<<4)+BandgapLow;
                                Bandgap_Voltage_Temp = Bandgap_Value*3/4;
                                Bandgap_Voltage = Bandgap_Voltage_Temp - 33;                        //the actually banggap voltage value is similar this value.
                }
                if (BandgapMark==0x00)
                {
                                BandgapLow = BandgapLow&0x0F;
                                IAPAL = 0x0C;
                                IAPAH = 0x00;
                                set_IAPGO;
                                BandgapHigh = IAPFD;
                                Bandgap_Value = (BandgapHigh<<4)+BandgapLow;
                                Bandgap_Voltage= Bandgap_Value*3/4;
                }
                if (BandgapMark==0x90)
                {
                                IAPAL = 0x0E;
                                IAPAH = 0x00;
                                set_IAPGO;
                                BandgapHigh = IAPFD;
                                IAPAL = 0x0F;
                                IAPAH = 0x00;
                                set_IAPGO;
                                BandgapLow = IAPFD;
                                BandgapLow = BandgapLow&0x0F;
                                Bandgap_Value = (BandgapHigh<<4)+BandgapLow;
                                Bandgap_Voltage= Bandgap_Value*3/4;
                }
                clr_IAPEN;
//                        printf ("\n BG High = %bX",BandgapHigh);
//                        printf ("\n BG Low = %bX",BandgapLow);
//                        printf ("\n BG ROMMAP = %e",Bandgap_Voltage);
}

使用特权

评论回复
沙发
BigLeo8| | 2019-4-25 18:00 | 只看该作者

使用特权

评论回复
板凳
643757107| | 2019-4-25 20:25 | 只看该作者
手册有没有提到这个读取的寄存器功能。

使用特权

评论回复
地板
稳稳の幸福| | 2019-4-25 21:49 | 只看该作者
BandgapLow = IAPFD;
                BandgapMark = BandgapLow&0xF0;
关注这个地方,IAPFD的作用。

使用特权

评论回复
5
稳稳の幸福| | 2019-4-25 21:58 | 只看该作者
通过设置IAPEN(CHPCON.0受TA保护)使能IAP,并且设置IAPUEN寄存器的相应位,使能需要升级的FLASH区域(CONFIG、LDROM、APROM),用户将16位操作地址写入IAPAH和IAPAL,数据写入IAPFD,命令写入IAPCN。

使用特权

评论回复
6
稳稳の幸福| | 2019-4-25 21:58 | 只看该作者
AP 内存数据
该字节包含将要读或写进内存空间的数据。编程模式下,用户需要在触发IAP之前写数据到IAPFD里,读/校验模式下,在IAP完成后从IAPFD读出数据。

使用特权

评论回复
7
稳稳の幸福| | 2019-4-25 21:59 | 只看该作者

使用特权

评论回复
8
dongnanxibei| | 2019-4-25 23:42 | 只看该作者
常温下,所有N76E003的Band-gap电压值会校准在1.17V ~ 1.27 V内。如果想要知道每颗N76E003的
Band-gap实际电压值,可以通过读取UID地址后的2个bytes值来确认。UID 后的2个bytes储存Band-gap
的实际值,总共12个有效bit。第一个byte是高8位,第二个byte的低4位为12 bit的低4位。

使用特权

评论回复
9
dongnanxibei| | 2019-4-25 23:43 | 只看该作者
仔细看手册啊,是为了读取UID后的2个字节。

使用特权

评论回复
10
dongnanxibei| | 2019-4-25 23:52 | 只看该作者
手册中没这么复杂
void READ_BANDGAP()
{
UINT8 BandgapHigh,BandgapLow;
Set_IAPEN; // Enable IAPEN
IAPAL = 0x0C;
IAPAH = 0x00;
IAPCN = 0x04;
set_IAPGO; // Trig set IAPGO
BandgapHigh = IAPFD;
IAPAL = 0x0d;
IAPAH = 0x00;
IAPCN = 0x04;
set_IAPGO; // Trig set IAPGO
BandgapLow = IAPFD;
BandgapLow = BandgapLow&0x0F;
Clr_IAPEN; // Disable IAPEN
Bandgap_Value = (BandgapHigh<<4)+BandgapLow;
Bandgap_Voltage = 3072/(0x1000/Bandgap_Value);

使用特权

评论回复
11
features| | 2019-4-26 19:23 | 只看该作者
一起学习了

使用特权

评论回复
12
xxh0201|  楼主 | 2019-4-27 17:16 | 只看该作者
几位坛友,你们好。

我不是问怎么读那两个数出来,

而是想问:厂家给的库例程里,为什么要作条件判断,就是一楼贴出来的程序里红色的地方。

不同的“BandgapMark“,作了不同的转移的。

特别是最后一个条件里,是从下两件地址里读数据出来的了。

使用特权

评论回复
13
allen1311885| | 2019-5-16 17:49 | 只看该作者
我也遇到了这个问题
手册里并没有 BandgapMark 这个标记的描述说明
据我猜测应该是 N76E003 部分批次芯片
在出厂录入Bandgap测量值时存在数值异常
然后通过 UID 中加入 BandgapMark 进行区分处理

使用特权

评论回复
14
tianxj01| | 2019-5-16 18:07 | 只看该作者
allen1311885 发表于 2019-5-16 17:49
我也遇到了这个问题
手册里并没有 BandgapMark 这个标记的描述说明
据我猜测应该是 N76E003 部分批次芯片

别去折腾这个了,我用官方的最新DEMO程序测试过,反推电源VCC,波动到2%以上,没有任何实用意义。
测试条件:芯片锂电池供电,什么都不干,只做这个,而且,该Band-gap电压测试过程,只能测试5次,扔2次,测试超过该数据比如测试8次扔2次/6结果完全不一样,越测试次数多,数据越小。
反过来,用TL431,直接做一个2.5V基准,用N76E003来测量该基准反推VCC,由于可以任意多次测量平均,精度可以到1‰+。
说明该Band-gap没任何实际意义。

使用特权

评论回复
15
rawo| | 2019-5-16 22:30 | 只看该作者
tianxj01 发表于 2019-5-16 18:07
别去折腾这个了,我用官方的最新DEMO程序测试过,反推电源VCC,波动到2%以上,没有任何实用意义。
测试条 ...

是的,之前通过电源VCC反推Band-gap实际值和用demo读取的Band-gap数值相差很大,Band-gap实际值约1.21V,demo读取的Band-gap值才1.18V,怀疑出厂校验的Bang-gap值是不准。

使用特权

评论回复
16
小明的同学| | 2019-5-17 00:16 | 只看该作者
原来如此,这般。

使用特权

评论回复
17
tianxj01| | 2019-5-17 08:08 | 只看该作者
rawo 发表于 2019-5-16 22:30
是的,之前通过电源VCC反推Band-gap实际值和用demo读取的Band-gap数值相差很大,Band-gap实际值约1.21V, ...

出厂检验,应该有方法,比如芯片供电是严格的3.3V校准电压,直读就可以了。
让人非常疑惑的是,Band-gap不能连续多次反复读,如果这样的话,数值就会越读越小。
怀疑芯片设计为了功耗什么考虑,用了某些方法,使得Band-gap只能被使用几次,多次的话,就掉数值。而且就因为这样的原因,导致Band-gap在实际使用中,波动达2%左右。
对于发生数据抖动,最常见的方法是多次平均,一旦这个方法失效,这Band-gap也就没卵用了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

17

帖子

1

粉丝