发现CH555的俩BUG

1. 问题:根据WCH其它型号芯片的经验,CHIP_ID应该返回CH5XX的后两位,这里应该为55。

    实测:读取CHIP_ID寄存器,得到的是56。


2. 问题:CH555芯片资料显示,ROM_STATUS寄存器在Flash操作成功后应该返回0xC0。

    实测:以4 字节为单位读取ReadOnly 只读信息区域,操作成功后ROM_STATUS返回的是0x00。

// 测试代码

ROM_ADDR_L = 0x10;        // 读芯片唯一ID码
ROM_ADDR_H = 0x00;
ROM_CTRL = 0x8D;
if (ROM_STATUS)           // 检查操作结果(这里读取成功会返回0x00)
{
    return ROM_STATUS;    // 返回错误代码
}

image.png


3. 问题:CH555芯片资料显示,ROM_STATUS寄存器在Flash操作成功后应该返回0xC0。

    实测:单字节写flash-ROM,操作成功后ROM_STATUS返回的是0x40。

    注意:单字节写flash-ROM,操作成功后ROM_ADDR会自动+1,这点芯片资料没提到。

// 测试代码

// 测试用数据
UINT8X TestData[4] = {1,2,3,4};
UINT8D i = 0;
UINT8D Length = 4;
// 关闭Flash写保护
SAFE_MOD = 0x55;
SAFE_MOD = 0xAA;
GLOBAL_CFG |= bCODE_WE | bDATA_WE;
// 设置CodeFlash操作地址
ROM_ADDR_L = 0x00;    // 写入地址低位
ROM_ADDR_H = 0xF0;    // 写入地址高位
// 写入CodeFlash数据
for (i = 0; i != Length; ++i)
{
    ROM_BUF_MOD = 0x80;            // 选择单字节编程模式
    ROM_DAT_BUF = TestData[i];     // 将数据写入缓冲寄存器
    ROM_CTRL = ROM_CMD_PROG;       // 执行Flash写入操作(注:操作成功后ROM_ADDR会自动+1)
    if (ROM_STATUS != 0x40)        // 检查操作结果(注:芯片资料有误,这里操作成功会返回0x40)
    {
        return ROM_STATUS;         // 返回错误代码
    }
    //++ROM_ADDR;                  // 写入成功后地址+1
}
// 启用Flash写保护
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对应的是芯片型号,注意看一下手上芯片是ch555还是ch556.至于问题2和问题3,操作flash时,尤其是涉及到进入安全模式的操作时,注意看一下编译器的优化等级,不能是最高优化等级9,否则会优化掉safemod的操作。


@Melodyy 请注意看题目, 这些内容都是实测验证出来的.

  1. 已经测试了手头多个CH555,都是返回56.

  2. Flash操作返回代码的问题,我前面已经说了,是"操作成功"了的,不存在优化等级的问题.


你好,关于问题1,CH555的手册上明确表示CHIP_ID复位值为56H,这个跟之前的使用习惯不太一样,容易造成误解,需要注意一下。

image.png

至于问题2跟问题3,对FLASH的读写返回的ROM_STATUS状态值主要关心该寄存器的第一位、第六位即可。


@wangyy 感谢解惑!

同时为了芯片手册的严谨性,请把寄存器保留位的值标注为x,表示电平不确定。

如果确实能够保证保留位的电平值,才能标注为1或者0


另:我再次查阅了一遍555,556,557的芯片资料,发现CH555和CH556的CHIP_ID都是56H,那么如何从软件层面上区分这两个芯片呢?


在8位单片机中,CHIP_ID的数值就8位,MCU型号多了自然会重。所以ID的作用是在同一系列芯片中使用ID来做区分。但是CH555和CH556虽然型号数字接近,但是USB相差很大,是完全不同的系列,也就不会混用。那么就没有必要在软件层面上去区分两个芯片。



只有登录才能回复,可以选择微信账号登录