Forum: Mikrocontroller und Digitale Elektronik WCH CH548/9 Controller


von Thomas Z. (usbman)


Angehängte Dateien:

Lesenswert?

Da der alte Thread zum CH552 inzwischen etwas unübersichtlich ist und 
der CH549 sich doch signifikant von den alten Chips unterscheidet, mache 
ich einfach mal einen neuen Thread auf.
Den Ch549 gibt es in verschiedenen Gehäusen u A. auch in SO16. Die 
Belegung der Ports weicht etwas vom CH552 ab. Da muss man also aufpassen 
(USB + VCC + SPI ist gleich). Achtung: RxT und TxT des Uart0  sind 
gegenüber dem CH552 vertauscht.

Eigenschaften CH549:
- schneller X51 core mit 48MHz
- 60K Flash
- 1k EEprom
- 4 Uarts
- PWM
- SPI
- USB (Host + Device)
- 12 Bit A/D

Ich konnte den Chip mit meiner Dual Uart Link Platine (für CH552) 
problemlos in Betrieb nehmen. Der USB Core ist identisch, wenn man also 
das passende Header File verwendet ist USB Software kompatibel zu 
552/554.

Die Portprogrammierung ist ähnlich wie beim CH559 und nicht Software 
kompatibel zum CH552. Wenn man also push/pull oder input only will muss 
man diese Teile umschreiben. Das normale x51 Verhalten der Ports ist 
voreingestellt da muss man also nichts ändern.

Der größte Unterschied ist das Flash Interface. Das Flash muss 
blockweise gelöscht werden (64 Byte Blöcke). Schreiben kann man 
Singlebyte, Multibyte oder Blockweise. Im Gegensatz zu üblichen Flashs 
sind gelöschte Bits 0.

Der Aufruf des Bootloaders per Call 0xF400 funktioniert übrigens nicht 
mehr, da die Bootloader Sektoren im Normalbetrieb ausgeblendet sind.
Ganz interessant ist auch dass es den Chip im SO8 gibt dann allerdings 
nur mit 32k Flash als CH548.

Ich hab mir das Datenblatt von Google Translate übersetzen lassen, 
allerdings ist das Ergebnis nicht besonders gut, da der Übersetzer bei 
den Tabellen wirre Dinge macht.

: Bearbeitet durch User
von Lothar (Gast)


Lesenswert?

Wo kaufen?

von Thomas Z. (usbman)


Lesenswert?

Lothar schrieb:
> Wo kaufen?

ich erwarte dass diese in Zukunft bei LCSC verfügbar sind. Die haben 
momentan allerdings nur QFN28 Variante (mit 0 Bestand)
Meine Chips kommen von einem Chin. Shop der so gut wie alles von WCH 
vertreibt.

https://shop33742270.world.taobao.com/category-1478869262.htm?spm=a312a.7700824.w5002-2561943305.3.58b047e4NthdBu&search=y&catName=%C7%DF%BA%E3WCH%A3%A8%D7%A8%C2%F4%A3%A9

dort kostet der chip weniger als 4 RMB also etwa 50 euro cent. 
Lieferzeit war bei mir 2Wochen (eco shipping)

: Bearbeitet durch User
von Michael B. (laberkopp)


Lesenswert?

Thomas Z. schrieb:
> Der Aufruf des Bootloaders per Call 0xF400 funktioniert übrigens nicht
> mehr,

Was heisst das für's programmieren ?

Kann man

a) einen frisch gekauftem CH549 an USB anstecken und über den 
(Windows)Treiber mit einem geeigneten UPloader-Programm dann 
programmieren ?

b) einen frisch gekauften CH549 erst mal anderweitig programmieren, dann 
redet er aber mit USB und kann vom PC per Uploader-Programm 
überprogrammiert (geupdated) werden, so wie bei den STM BluePill ?

c) braucht man immer extra-Chips wie ATmega8U oder CH340 bei ATmega 
Arduinos ukm per USB programmieren zu können ?

von Thomas Z. (usbman)


Lesenswert?

Michael B. schrieb:
> Was heisst das für's programmieren ?

Die normalen Aufrufe des Loaders per PwrOn HW Contition funktionieren 
wie gehabt, nur der Aufruf aus der Anwender FW geht nicht mehr.

Es gibt 2 Wege den Loader zu starten:
- 1. Der Chip ist leer(neu) dann startet der Loader automatisch
- 2. P1.5 low oder D+ über 10k gegen 3.3V beim POR

welcher der beiden Pins ausgewertet wird kann man in ISP Software 
festlegen, der default ist D+. Flashen kann man dann über USB oder 
Serial0.
Die Flash Software ist das WChIspTool. Die bringt die notwendigen 
Treiber für USB schon mit.

Wie du auf meiner Platine sehen kannst ist nur der Chip notwendig + 
Jumper

: Bearbeitet durch User
von Thomas Z. (usbman)


Lesenswert?

Ich hab mal ein paar Tests zur Flashprogrammierung gemacht. Dazu hab ich 
die Routinen aus dem CH549evt.zip angeschaut und auch etwas modifiziert.
Das hat prinzipiell ganz gut funktioniert, auch wenn ich bemerkt habe 
dass die Flashroutine bei bestimmten Fehlern mit gesperrtem globalem 
Interrupt Bit zurückkommt. Das lässt sich aber einfach fixen.

Hier das Original:
1
UINT8 FlashProgPage( UINT16 Addr, PUINT8X Buf,UINT8 len )
2
{
3
    bit e_all;
4
    UINT8 status;
5
    UINT8 FlashType;
6
    UINT8 page_offset;
7
    e_all = EA;
8
    EA = 0;           
9
    if((Addr>=DATA_FLASH_ADDR) && (Addr<BOOT_LOAD_ADDR))/* DataFlash区域 */
10
    {
11
        FlashType = bDATA_WE;
12
    }
13
    else
14
    {
15
        FlashType = bCODE_WE;
16
    }
17
    SAFE_MOD = 0x55;
18
    SAFE_MOD = 0xAA;
19
    GLOBAL_CFG |= FlashType;
20
    page_offset = Addr & MASK_ROM_ADDR;
21
    if ( len > (ROM_PAGE_SIZE - page_offset) )
22
    {
23
        return( 0xFC );
24
    }
25
    if ( ( (UINT8)Buf & MASK_ROM_ADDR ) != page_offset )
26
    {
27
        return( 0xFB ); 
28
    }
29
    ROM_ADDR = Addr;
30
    ROM_BUF_MOD = page_offset + len - 1;
31
    DPL = (UINT8)Buf;
32
    DPH = (UINT8)( (UINT16)Buf >> 8 );
33
    if ( ROM_STATUS & bROM_ADDR_OK )
34
    {
35
        ROM_CTRL = ROM_CMD_PROG ;   
36
        if(ROM_STATUS & bROM_CMD_ERR)
37
        {
38
            status = 0x02;
39
        }
40
        else
41
        {
42
            status = 0x00;
43
        }
44
    }
45
    else
46
    {
47
        status = 0x01; 
48
    }
49
    SAFE_MOD = 0x55; 
50
    SAFE_MOD = 0xAA;
51
    GLOBAL_CFG &= ~FlashType;
52
    EA = e_all;            
53
    return status;
54
}
Die chinesischen Kommentare musste ich leider löschen. Die 
Forumssoftware erlaubt das nicht.
Zu Anfang habe ich nicht verstanden warum die DPL und DPH manuell 
gesetzt haben. Das muss aber lt Datasheet gemacht werden und 
funktioniert auch. Ich würde DPL und DPH vermutlich etwas später setzen.
Etwa so:
1
    ... 
2
    if ( len > (ROM_PAGE_SIZE - page_offset) )
3
    {
4
        EA = e_all;        // restore irq status 
5
        return( 0xFC );  
6
    } 
7
    if ( ( (UINT8)Buf & MASK_ROM_ADDR ) != page_offset )
8
    {
9
        EA = e_all;       //restore irq status
10
        return( 0xFB );  
11
    }
12
    ...
13
    //DPL = (UINT8)Buf;
14
    //DPH = (UINT8)( (UINT16)Buf >> 8 );
15
    if ( ROM_STATUS & bROM_ADDR_OK ) 
16
    {
17
        DPL = &Buf &0xFF;
18
        DPH = &Buf >> 8 ;
19
        ROM_CTRL = ROM_CMD_PROG ;   
20
...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.