發(fā)現(xiàn)CH555的倆BUG

1. 問(wèn)題:根據(jù)WCH其它型號(hào)芯片的經(jīng)驗(yàn),CHIP_ID應(yīng)該返回CH5XX的后兩位,這里應(yīng)該為55。

????實(shí)測(cè):讀取CHIP_ID寄存器,得到的是56。


2. 問(wèn)題:CH555芯片資料顯示,ROM_STATUS寄存器在Flash操作成功后應(yīng)該返回0xC0。

????實(shí)測(cè):以4 字節(jié)為單位讀取ReadOnly 只讀信息區(qū)域,操作成功后ROM_STATUS返回的是0x00。

//?測(cè)試代碼

ROM_ADDR_L?=?0x10;????????//?讀芯片唯一ID碼
ROM_ADDR_H?=?0x00;
ROM_CTRL?=?0x8D;
if?(ROM_STATUS)???????????//?檢查操作結(jié)果(這里讀取成功會(huì)返回0x00)
{
????return?ROM_STATUS;????//?返回錯(cuò)誤代碼
}

image.png


3. 問(wèn)題:CH555芯片資料顯示,ROM_STATUS寄存器在Flash操作成功后應(yīng)該返回0xC0。

????實(shí)測(cè):?jiǎn)巫止?jié)寫flash-ROM,操作成功后ROM_STATUS返回的是0x40。

????注意:?jiǎn)巫止?jié)寫flash-ROM,操作成功后ROM_ADDR會(huì)自動(dòng)+1,這點(diǎn)芯片資料沒提到。

//?測(cè)試代碼

//?測(cè)試用數(shù)據(jù)
UINT8X?TestData[4]?=?{1,2,3,4};
UINT8D?i?=?0;
UINT8D?Length?=?4;
//?關(guān)閉Flash寫保護(hù)
SAFE_MOD?=?0x55;
SAFE_MOD?=?0xAA;
GLOBAL_CFG?|=?bCODE_WE?|?bDATA_WE;
//?設(shè)置CodeFlash操作地址
ROM_ADDR_L?=?0x00;????//?寫入地址低位
ROM_ADDR_H?=?0xF0;????//?寫入地址高位
//?寫入CodeFlash數(shù)據(jù)
for?(i?=?0;?i?!=?Length;?++i)
{
????ROM_BUF_MOD?=?0x80;????????????//?選擇單字節(jié)編程模式
????ROM_DAT_BUF?=?TestData[i];?????//?將數(shù)據(jù)寫入緩沖寄存器
????ROM_CTRL?=?ROM_CMD_PROG;???????//?執(zhí)行Flash寫入操作(注:操作成功后ROM_ADDR會(huì)自動(dòng)+1)
????if?(ROM_STATUS?!=?0x40)????????//?檢查操作結(jié)果(注:芯片資料有誤,這里操作成功會(huì)返回0x40)
????{
????????return?ROM_STATUS;?????????//?返回錯(cuò)誤代碼
????}
????//++ROM_ADDR;??????????????????//?寫入成功后地址+1
}
//?啟用Flash寫保護(hù)
SAFE_MOD?=?0x55;
SAFE_MOD?=?0xAA;
GLOBAL_CFG?&=?~(bCODE_WE?|?bDATA_WE);


if the id is 0x56 it might be in fact a CH556 or is derived from the CH556. Probably these chips share the same silicon. We have seen that for CH551,CH552,CH553 and CH554. They all use the same silicon, and it seems the CH553 never got into production.?

if (ROM_STATUS !=0x40) just seems a bug

if (ROM_STATUS & 0x40) break; //break the loop to set protection


Flash operation seems the same as for CH556/7 and CH548/9 you should check those evt examples.

Single byte flashing needs to set bROM_BUF_BYTE in reg?ROM_BUF_MODE?


chip_id對(duì)應(yīng)的是芯片型號(hào),注意看一下手上芯片是ch555還是ch556.至于問(wèn)題2和問(wèn)題3,操作flash時(shí),尤其是涉及到進(jìn)入安全模式的操作時(shí),注意看一下編譯器的優(yōu)化等級(jí),不能是最高優(yōu)化等級(jí)9,否則會(huì)優(yōu)化掉safemod的操作。


@Melodyy 請(qǐng)注意看題目, 這些內(nèi)容都是實(shí)測(cè)驗(yàn)證出來(lái)的.

  1. 已經(jīng)測(cè)試了手頭多個(gè)CH555,都是返回56.

  2. Flash操作返回代碼的問(wèn)題,我前面已經(jīng)說(shuō)了,是"操作成功"了的,不存在優(yōu)化等級(jí)的問(wèn)題.


你好,關(guān)于問(wèn)題1,CH555的手冊(cè)上明確表示CHIP_ID復(fù)位值為56H,這個(gè)跟之前的使用習(xí)慣不太一樣,容易造成誤解,需要注意一下。

image.png

至于問(wèn)題2跟問(wèn)題3,對(duì)FLASH的讀寫返回的ROM_STATUS狀態(tài)值主要關(guān)心該寄存器的第一位、第六位即可。


@wangyy 感謝解惑!

同時(shí)為了芯片手冊(cè)的嚴(yán)謹(jǐn)性,請(qǐng)把寄存器保留位的值標(biāo)注為x,表示電平不確定。

如果確實(shí)能夠保證保留位的電平值,才能標(biāo)注為1或者0


另:我再次查閱了一遍555,556,557的芯片資料,發(fā)現(xiàn)CH555和CH556的CHIP_ID都是56H,那么如何從軟件層面上區(qū)分這兩個(gè)芯片呢?


在8位單片機(jī)中,CHIP_ID的數(shù)值就8位,MCU型號(hào)多了自然會(huì)重。所以ID的作用是在同一系列芯片中使用ID來(lái)做區(qū)分。但是CH555和CH556雖然型號(hào)數(shù)字接近,但是USB相差很大,是完全不同的系列,也就不會(huì)混用。那么就沒有必要在軟件層面上去區(qū)分兩個(gè)芯片。



只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频