Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » vt » CH55x (CH551-CH554)


CH55x (CH551-CH554)

Сообщений 31 страница 60 из 76

31

На следующей неделе получу ch552t и ch554g. Испытаю - отпишусь. Есть пара идей своих проектов, для компиляции использую SDCC

32

WCHISPTool v2.34
Файлы из архива нужно просто скопировать в папку с ранее установленным WCHISPTool v2.31 (ссылка была в предыдущих постах).
Старая версия не настраивала режим работы вывода RST после программирования.
Начал проверять ch552t. Чип не плох - шустрый, потребляет мало энергии. Но есть неприятный момент (сразу не обратил внимание): программирование памяти программ возможно только при подаче на вывод vcc питания 5В.
Кроме того доступно всего 200 циклов перезаписи? Или я неправильно понимаю фразу:

The ROM is an iFlash ™ process that can be programmed about 200 times with a 5V supply for a
finished blank ROM package.

33

Забрал архив, спасибо, так постепенно по зёрнышку и соберём
Про iflash похоже действительно 200 циклов, а я просмотрел, вот засада, разочарование дня
Я ch55x обнаружил на дваче [ https://2ch.hk/ra/res/258237.html ] посмотрел китайский даташит, но на старший ch559, там 100К циклов, а на ch554 потом не проверил

34

Самое неудобное то, что вывод VCC также используется для питания портов. Поэтому, если мы хотим использовать в системе чипы с питанием 3В, то и микроконтроллер нужно питать таким же напряжением (он это допускает), но при этом теряется возможность обновления прошивки. Короче говоря есть схемотехнический гемор (хотя это решается :))

35

Ну вы и пионеры (в хорошем смысле), пока решусь и приобрету, все фишки-бяки выловите...

36

1000 раз перезаписал программу в ch551 - никаких сбоев при записи пока не появилось
Может и не всё так плачевно с кол-вом циклов, хотя один чип не показатель конечно, да и программа была маленькая, не на всю флеш

Добавил ещё две таблицы в перевод даташита [T2CON и T2MOD в параграф 12.2] - forumfiles.ru/files/0018/26/8f/56295.zip
Гуглоперевод конечно ужасен, но всё равно потом или на русский переводить или забыть

Отредактировано vt (2018-01-30 13:55:12)

37

Интересно, хоть что-нибудь из этих фич ch55x хоть как-то поддерживается какими-то компиляторами?

External Bus Auxiliary Setup Register [XBUS_AUX, 0xA2]:
бит 2 [bDPTR_AUTO_INC] - Enabled DPTR increments automatically after MOVX_ @ DPTR instruction completes
бит 0 [DPS] - Dual DPTR Data Pointer Select Bits: This bit is 0 to select DPTR0; this bit is 1 to select DPTR1

Код:
; New Instruction: MOVX @DPTR1,A
; Instruction Code: 0xA5
; Instruction Cycle: 1
; Instruction Operation:
; step-1. write ACC into xdata SRAM @DPTR1 embedded chip
; step-2. increase DPTR1
; ASM example:
    INC XBUS_AUX
    MOV DPTR,#TARGET_ADDR   ;DPTR1
    DEC XBUS_AUX
    MOV DPTR,#SOURCE_ADDR   ;DPTR0
    MOV R7,#xxH
LOOP:
    MOVX A,@DPTR            ;DPTR0
    INC DPTR                ;DPTR0, if need
    DB 0A5H                 ;MOVX @DPTR1,A & INC DPTR1
    DJNZ R7,LOOP

38

Ozelot написал(а):

, для компиляции использую SDCC


Почему не Keil?
И какие всё-таки чипы брать????

39

CH552 наверно
По цене почти не отличается от ch551, но есть всё что в ch554 кроме usb-host
http://sd.uploads.ru/i6NHj.png

40

dosikus написал(а):

Почему не Keil?

Компиляторы для 51-й архитектуры слишком сильно отличаются, но если использовать compiler.h из SDCC, то можно писать компиляторонезависимый код, который будет собираться при помощи Keil, IAR, SDCC и т.д.

41

USB vendor specific class [ bulk in1, out1, in2, out2 ] для CH55[1-4] на турбо паскале [ Turbo51 ]
Исполняется впервые )

Код:
unit usb;
{$xdata}

interface
uses ch554;
var 
    ep : array [1..2] of record
        r, t : array [0..63] of byte end xdata; volatile;
    len : array [1..2] of record
        r, t : byte end; volatile;
procedure init;
procedure poll;
procedure reset; usingany;
procedure trans; usingany;

implementation
const
    config : array [1..23] of word = (
        $209, 46, $101, $C000, $900, 4, $400, $FF, 0,
        $507, $281, $40, $700, $105, $4002, 0,
        $507, $282, $40, $700, $205, $4002, 0
        );
    device : array [1..9] of word = (
        $112, $110, 0, $4000, $6666, $5500, 1, 0, $100
        );
var
    address : byte;
    ep0 : array [0..31] of word xdata; volatile;
    stage : ( setup, data, status );

procedure init;
begin
    ie_usb := false;
    usb_ctrl := 0;
    uep_mod := {3- 2-rt 1-rt 4-} $0CC0;
    uep0_dma := word( addr( ep0 ) );
    uep1_dma := word( addr( ep[1] ) );
    uep2_dma := word( addr( ep[2] ) );
    reset;
    udev_ctrl := {pd_dis} $80;
    usb_ctrl := {dev_pu_en int_busy dma_en} $29;
    udev_ctrl := {pd_dis port_en} $81;
    usb_int_en := {trans reset} 3;
    ie_usb := true;
end;

procedure poll;
begin
    if ((uep1_ctrl and $C) <> 0) and (len[1].r = 0) then
        {r-ack} uep1_ctrl := uep1_ctrl and (not $C);
    if ((uep1_ctrl and 3) <> 0) and (len[1].t <> 0) then begin
        uep1_t_len := ((len[1].t - 1) and $3F) + 1;
        {t-ack} uep1_ctrl := uep1_ctrl and (not 3);
    end;
    if ((uep2_ctrl and $C) <> 0) and (len[2].r = 0) then
        {r-ack} uep2_ctrl := uep2_ctrl and (not $C);
    if ((uep2_ctrl and 3) <> 0) and (len[2].t <> 0) then begin
        uep2_t_len := ((len[2].t - 1) and $3F) + 1;
        {t-ack} uep2_ctrl := uep2_ctrl and (not 3);
    end;
end;

procedure reset;
begin
    address := 0;
    len[1].r := 0;
    len[1].t := 0;
    len[2].r := 0;
    len[2].t := 0;
    stage := setup;
    uep0_ctrl := {r-nak t-nak} $A;
    uep1_ctrl := {r-auto t-auto r-nak t-nak} $3A;
    uep2_ctrl := {r-auto t-auto r-nak t-nak} $3A;
    usb_dev_ad := 0;
end;

procedure trans;
var
    ep0len : byte;
begin
    case usb_int_st and $3F of
        {out1} 1 : if uif_tog_ok then begin
            {r-nak} uep1_ctrl := uep1_ctrl or 8;
            len[1].r := usb_rx_len;
        end;
        {in1} $21 : begin
            {t-nak} uep1_ctrl := uep1_ctrl or 2;
            len[1].t := 0;
        end;
        {out2} 2 : if uif_tog_ok then begin
            {r-nak} uep2_ctrl := uep2_ctrl or 8;
            len[2].r := usb_rx_len;
        end;
        {in2} $22 : begin
            {t-nak} uep2_ctrl := uep2_ctrl or 2;
            len[2].t := 0;
        end;
        {setup} $30 : begin
            ep0len := byte( ep0[3] );
            stage := setup;
            case ep0[0] of
                {get descriptor} $680 : case ep0[1] of
                    {device} $100 : begin
                        move( device, ep0, sizeof( device ) );
                        stage := data;
                    end;
                    {configuration} $200 : begin
                        move( config, ep0, sizeof( config ) );
                        stage := data;
                    end;
                end;
                {get status} $80 : begin
                    ep0[0] := 1;
                    stage := data;
                end;
                {set address} $500 : begin
                    address := ep0[1];
                    stage := status;
                end;
                {clear future} $102,
                {set configuration} $900 : stage := status;
            end;
            case stage of
                data : begin
                    if ep0len > 63 then ep0len := 63;
                    uep0_t_len := ep0len;
                    uep0_ctrl := {r-data1 t-data1 r-nak t-ack} $C8;
                end;
                status : begin
                    uep0_t_len := 0;
                    uep0_ctrl := {r-data1 t-data1 r-nak t-ack} $C8;
                end;
                else uep0_ctrl := {r-stall t-stall} $F;
            end;
        end;
        {out0} 0 : case stage of
            status : begin
                uep0_ctrl := {r-nak t-nak} $A;
                stage := setup;
            end;
            else uep0_ctrl := {r-stall t-stall} $F;
        end;
        {in0} $20 : case stage of
            data : begin
                uep0_ctrl := {r-data1 t-data1 r-ack t-nak} $C2;
                stage := status;
            end;
            status : begin
                usb_dev_ad := address;
                uep0_ctrl := {r-nak t-nak} $A;
                stage := setup;
            end;
            else uep0_ctrl := {r-stall t-stall} $F;
        end;
    end;
end;

end.


И тестик [671 байт в бинарнике]

Код:
{$m 0, 10240, 0, 512, 0}
{$idata}

program test;
uses ch554, usb;

procedure _timer0; interrupt timer0;
var
    led : boolean absolute p1.1;
begin
    led := not led;
end;

procedure _usb; interrupt int_usb; using 1;
begin
    if uif_trans then usb.trans;
    if uif_reset then usb.reset;
    usb_int_fg := $FF;
end;

begin
    usb.init;
    tmod := 1;
    tr0 := true;
    et0 := true;
    ea := true;
    repeat
        usb.poll;
        if (usb.len[1].r > 0) and (usb.len[1].t = 0) then begin
            move( usb.ep[1].r, usb.ep[1].t, 64 );
            usb.len[1].r := 0;
            usb.len[1].t := 64;
        end;
    until false;
end.

Отредактировано vt (2018-03-29 13:28:18)

42

Пока я собирался, уже сделали реверс протокола программирования и кроссплатформенную тулзу
https://github.com/rgwan/librech551

Протокол оказался очень простой, а тулза легко портируется даже на tcc [ https://bellard.org/tcc/ ]
Но снял всё-таки логи wchisptool, всё так же делает эта librech551

Отредактировано vt (2018-03-31 11:49:35)

43

это очень интересно  теперь хочется пример для моста USB -rs232
и ШИМ программный  как реализовать выводов на 6  можно с глубиной 8 бит

Отредактировано selevo (2018-03-31 08:57:20)

44

Ну паскаль же ты знаешь )
Модуль SFR ch554.pas лежит на яндекс-диске https://yadi.sk/d/naqKh4e03EDEJU/CH554
Или подождём когда [и если] подтянутся разработчики, я только "геолог" - нашёл, рассказал и ушёл дальше
Ну и, имхо, не стоит насиловать эти мк софтовым шимом, у них есть родной элементарно простой двухканальный pwm и это их предназначение и предел
Если надо больше каналов, то просто использовать больше чипов
Если надо больше жёстко синхронизованных каналов, то использовать другой чип
Хотя, всё что укладывается в таймерное прерывание скажем где-то 24 КГц [1000 тактов при 24 МГц тактовой], конечно, можно делать легко, 8-битный софтовый шим при этом будет примерно 90 Гц [24000/256], хоть на все ноги

45

selevo, увидел твой топик про CH55x на easyelectronics
Тогда должен немедленно сообщить пренеприятнейшее известие - в CH551 нет АЦП
Я как-то упустил это когда писал про разницу между моделями [да у меня и чипов тогда ещё не было], сейчас добавил

Отредактировано vt (2018-04-01 09:42:47)

46

ооо блин  вот  это  разачарование конечно...
ладно
а USB-то там есть ?

47

USB есть, пример выше работает на сh551
Вот гуглоперевод описания ch551 [ http://www.wch.cn/product/CH551.html ]

CH551 supports up to 24MHz system clock frequency, built-in touch key capacitance detection, 3 groups of timers and 2 signal capture and PWM, asynchronous serial port, SPI, USB device controller and full-speed transceiver and other functional modules.

The CH551 is a simplified version of the CH552. The program memory ROM is 10K, the on-chip xRAM is 512 bytes, the asynchronous serial interface only provides the UART0, and the package format is only SOP16, and the ADC analog-to-digital conversion module and the USB type-C module are removed, in addition to the above differences. The other parts are the same as those of the CH552. You can refer directly to the CH552 manual and data.

48

Спасибо
Ещё вопрос    там USB приёмопередатчик полностью самостоятельный или   какой-то реакции требует от проца ?
То есть процессор от USB не отвалится если я его полностью  зациклю на своих нуждах или нормально будет работать ?

Отредактировано selevo (2018-04-01 19:05:56)

49

selevo написал(а):

Ещё вопрос    там USB приёмопередатчик полностью самостоятельный или   какой-то реакции требует от проца ?
То есть процессор от USB не отвалится если я его полностью  зациклю на своих нуждах или нормально будет работать ?

Требует реакции
Когда хост передал пакет, а мк принял, но ещё не обработал, то мк должен немедленно выставить [в обработчике прерывания] запрет хосту передавать следующий пакет [выставить состояние NAK], иначе хост завалит мк пакетами
И наоборот, когда хост запрашивает пакет, у мк выставлено разрешение забирать данные [состояние ACK], хост забирает пакет, то мк должен немедленно снять разрешение [выставить состояние NAK], иначе хост следующим запросом снова заберёт те же данные и т.д.

Сам по себе usb в мк не отвалится при длительном бездействии, это хост может отключить usb со свой стороны, но если потом снова включит, то всё должно снова заработать
ch55 могут распознавать когда хост отключается и тоже что-то у себя отключать, но это надо делать специально, автоматически мк это не делает

Ну и на крайний случай какого-то фатального сбоя ch55 умеют имитировать будто их оторвали от usb и снова подключили [управлять подтягивающим резистором на usb шине d+, он у них внутри], при этом всё ресетится и у хоста, и у мк и начинается с чистого листа

50

ага...

51

а  что в  ch554.pas
есть   код реализующий  USB -RS 232 ?

52

Имхо, usb-serial - архаичный и ущербный метод, а стильно, модно, молодёжно - https://ru.wikipedia.org/wiki/WinUSB
Под него и пример выше

53

аааа

Ещё не понял, как дела с отладкой в этих чипах ?

Отредактировано selevo (2018-04-07 19:10:38)

54

selevo написал(а):

Ещё не понял, как дела с отладкой в этих чипах ?

Никак, её нет
Теоретически в мануале упоминается некий synchronous serial interface, но практически адаптеров похоже не существует в продаже

6.6 Board Programming and ISP Download

When the configuration information Code_Protect = 1, the code in the flash-ROM and the data in Data Flash of the CH554 chip can be read and written by the external programmer through the synchronous serial interface.
When the configuration information Code_Protect = 0, the code in the flash-ROM And Data Flash Data is protected, can not be read out, but can be erased, erase and then re-unlock the code protection.
When the CH554 chip is preset BootLoader boot program, CH554 can support USB or asynchronous serial port and other ISP download methods to load the application; but in the absence of a boot program, CH554 can only be written by an external programmer boot loader Or application.
In order to support board programming, you must temporarily use the 5V supply voltage, and the circuit needs to reserve four connection pins between the CH554 and the programmer, the minimum necessary connection pin is three: P1.4, P1.6, P1.7.

Table 6.6.1 Connection Pin with Programmer
Pin  GPIO  Description
RST  RST   Reset control pin in programming state, high level allows programming
SCS  P1.4  Chip Select Input Pin (Required) in Programming State, Default High, Active Low
SCK  P1.7  Clock input pin in programming state (required)
MISO P1.6  Data output pin in programming state (required)

Note: The 5V supply voltage must be used temporarily either in board programming or via serial or USB download

55

ясно
ну это наверно только  по запросу тем кто   от 1000 берёт
Железка  не обязательная,  значения регистров можно и самой программой просматривать.

56

Ещё по поводу winusb со стороны хоста [компа]
Всё то же самое, что я писал и выкладывал в топике USB full-speed device интерфейс в STM32F1 (L1, F3) , потому что пример выше usb device на ch55 один в один повторяет usb device на stm32 по интерфейсу
Вот ещё раз повторю тут

Код:
#include <stdio.h>
#include "libusb.h"

#define VID 0x6666
#define PID 0x5500
#define IEP 0x81
#define OEP 1

libusb_device_handle * devh;
char ibuf[64], obuf[64];
int inum, iret, onum, oret;

int main () {
    libusb_init (NULL);
    devh = libusb_open_device_with_vid_pid (NULL, VID, PID);
    libusb_claim_interface (devh, 0);

    for (int n=0; n<26; n++) {
        obuf[0] = obuf[1] = obuf[2] = 'a'+n;
        oret = libusb_bulk_transfer (devh, OEP, obuf, 64, &onum, 100);
        iret = libusb_bulk_transfer (devh, IEP, ibuf, 64, &inum, 100);
        printf ("%d|%s|%d %d|%s|%d\n", onum, obuf, oret, inum, ibuf, iret);
    }

    libusb_release_interface (devh, 0);
    libusb_close (devh);
    libusb_exit (NULL);
    return 0;
}

Вот то же самое на сайте Jan Axelson - http://www.janaxelson.com/beagleboard.htm [см раздел WinUSB with libusb]
Ну и всё это можно не только на си, но и на других языках - https://github.com/libusb/libusb/wiki [см раздел Language Bindings]

57

Ещё одна кроссплатформенная тулза для прошивки [на питоне и под MIT лицензией]
https://github.com/juliuswwj/wchprog

58

О времени выполнения команд в ch55x [этой инфы нет в мануале]

Для большинства команд кол-во тактов соотв. кол-ву байт в команде [сколько байт, столько и тактов]
За исключением следующих

Код:
acall   addr11              4-5
ajmp    addr11              4-5
div     ab                  4
jmp     @a+dptr             3-5
lcall   addr16              5-6
ljmp    addr16              5-6
movc    a, @a+dptr          5-7
movc    a, @a+pc            5-7
ret                         4-5
reti                        4-5
sjmp    rel                 4-5

cjne    @ri, #data, rel     3 | 5-6
cjne    a, #data, rel       3 | 5-6
cjne    a, direct, rel      3 | 5-7
cjne    rn, #data, rel      3 | 5-6
djnz    direct, rel         3 | 5-7
djnz    rn, rel             2 | 4-6
jb      bit, rel            3 | 5-7
jbc     bit, rel            3 | 5-7
jc      rel                 2 | 4-5
jnb     bit, rel            3 | 5-7
jnc     rel                 2 | 4-5
jnz     rel                 2 | 4-5
jz      rel                 2 | 4-5

В командах переходов кол-во тактов зависит от чётности адреса назначения, если нечётный, то тактов больше
Для команд условных переходов первое число - кол-во тактов когда перехода нет, а диапазон чисел - когда есть

59

Вот странно: sdcc же вроде как для 8051 должен код оптимизировать (это ж не "свежие" STM8). Но адреса не выравнивает, получается...

60

Eddy_Em написал(а):

Вот странно: sdcc же вроде как для 8051 должен код оптимизировать (это ж не "свежие" STM8). Но адреса не выравнивает, получается...

Ничего не понял, подробнее объясните


Вы здесь » Микроконтроллеры » vt » CH55x (CH551-CH554)