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

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

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


Вы здесь » Микроконтроллеры » Архив » CH55x (CH551 CH552 CH554)


CH55x (CH551 CH552 CH554)

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

31

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

32

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

33

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

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

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

34

Интересно, хоть что-нибудь из этих фич 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

35

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

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

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

36

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

37

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

Почему не Keil?

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

38

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

Код:
unit usb;
{$xdata}

interface
uses ch554;
var 
    buf : 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;
procedure _usb; interrupt int_usb; using 1;

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;
    buf0 : 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( buf0 ) );
    uep1_dma := word( addr( buf[1] ) );
    uep2_dma := word( addr( buf[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 begin
        {r-ack} uep1_ctrl := uep1_ctrl and (not $C);
    end;
    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 begin
        {r-ack} uep2_ctrl := uep2_ctrl and (not $C);
    end;
    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
    len0 : 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
            len0 := byte( buf0[3] );
            stage := setup;
            case buf0[0] of
                {get descriptor} $680 : case buf0[1] of
                    {device} $100 : begin
                        move( device, buf0, sizeof( device ) );
                        stage := data;
                    end;
                    {configuration} $200 : begin
                        move( config, buf0, sizeof( config ) );
                        stage := data;
                    end;
                end;
                {get status} $80 : begin
                    buf0[0] := 1;
                    stage := data;
                end;
                {set address} $500 : begin
                    address := buf0[1];
                    stage := status;
                end;
                {clear future} $102,
                {set configuration} $900 : stage := status;
            end;
            case stage of
                data : begin
                    if len0 > 63 then len0 := 63;
                    uep0_t_len := len0;
                    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;

procedure _usb;
begin
    if uif_trans then trans;
    if uif_reset then reset;
    usb_int_fg := $FF;
end;

end.

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

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

program test;
uses usb;

procedure _timer0; interrupt timer0;
begin
    p3.2 := not p3.2;
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.buf[1].r, usb.buf[1].t, 64 );
            usb.len[1].r := 0;
            usb.len[1].t := 64;
        end;
    until false;
end.

Отредактировано vt (2019-02-25 09:47:08)

39

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

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

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

40

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

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

41

Ну паскаль же ты знаешь )
Ну и, имхо, не стоит насиловать эти мк софтовым шимом, у них есть родной элементарно простой двухканальный pwm и это их предназначение и предел
Если надо больше каналов, то просто использовать больше чипов
Если надо больше жёстко синхронизованных каналов, то использовать другой чип
Хотя, всё что укладывается в таймерное прерывание скажем где-то 24 КГц [1000 тактов при 24 МГц тактовой], конечно, можно делать легко, 8-битный софтовый шим при этом будет примерно 90 Гц [24000/256], хоть на все ноги

42

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

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

43

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

44

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.

45

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

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

46

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

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

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

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

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

47

ага...

48

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

49

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

50

аааа

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

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

51

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

52

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

53

Ещё по поводу 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]

54

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

55

О времени выполнения команд в 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

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

56

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

57

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

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

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

58

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

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

Для x51 обычно не надо адреса выравнивать, зависимость от чётности - экзотика
Вот сравни например с STC15

59

Инфа о CH55x на ElectroDragon
wiki - http://www.electrodragon.com/w/WCH
git - https://github.com/Edragon/WCH

60

О  это  вроде я ещё не  скачивал, спасибо.

какая-то странная wiki- страница,включен запрет  на клики мышкой и выделение текста, пришлось поставить дополнение   блокирующее  блокировку  :) Давно собирался..

что за бред пишут про эти процы 
+ TypeC Master/Slave Detect
какой нах type-C
это типа могут  перекидывать сигнал ?
так   в этом разъёме  выводы симметричны ничё там перекидывать не надо..
ничё не понимаю.

Хостинг  кривой   этот, сайт может в любое время исчезнуть навсегда.
Ещё на  форуме нет  отправки  сообщения по CTRL+ENTER
Что меня напрягает, надо  брать мышку в руки

Отредактировано selevo (2018-04-21 17:09:28)


Вы здесь » Микроконтроллеры » Архив » CH55x (CH551 CH552 CH554)