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

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

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


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


CH55x (CH551 CH552 CH554)

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

151

Мля, весьма странно, скомпилил на 24МГц  - счас в putty выставил 115200 - в анализаторе 117647 , 57600 -57971, 38400 -38461,300000-307692,500000-500000

152

Да, но на 24Мгц получится облом - работать будет только если vcc- 5v, а это и на  пинах будет 5v .
Почему и перешел на 16МГц -а здесь и на 12 уже ошибка рассчета...

153

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

500000-500000

Вот она точность 24М/16/500000=3.00000 )

154

Перешел на 12 и вот они приколы - 38400 -39215 ,57600-57971, 115200-125000, 300000-400000,500000-800000
Видел подобный вопрос на форуме WCH , но там вопрошающий почему уверен что частота не стабильна.
Мне же видиться тупой просчет с делителями , а скорей облом с из-за делителя.
Ему там советуют перейти на 559 . СЧа попробую найти

155

Да, на 12 только 4800, 9600, 19200 и 57600

156

vt, а это уже крест на 552  в cdc , точней как UART-USB ...

157

Модуль CS1237 CS1238
http://sg.uploads.ru/2bjkF.png

Код:
unit cs1237;

interface
var
    command, register : byte;
    data : longint;
    pinc, pind : boolean absolute forward; volatile;

function poll : boolean;

implementation

function poll;
var
    a : array [0..3] of byte absolute data;
    c, i, r : byte;
begin
    if pind = false then begin
        c := command;
        r := register;
        for i := 1 to 46 do begin
            pinc := true;
            case i of
                1..8   : a[2] := (a[2] shl 1) + byte( pind );
                9..16  : a[1] := (a[1] shl 1) + byte( pind );
                17..24 : a[0] := (a[0] shl 1) + byte( pind );
                27     : if (c <> $56) and (c <> $65) then break;
                30..36 : begin
                             c := c shl 1;
                             pind := boolean( c and $80 );
                         end;
                37     : pind := true;
                38..45 : if command = {write} $65 then begin
                             pind := boolean( r and $80 );
                             r := r shl 1;
                         end else register := (register shl 1) + byte( pind );
                46     : pind := true;
            end;
            pinc := false;
        end;
        if a[2] < $80 then a[3] := 0 else a[3] := $FF;
        result := true;
    end else result := false;
    pinc := false;
end;

begin
    command := $65;
    register := $10;
end.

И пример использования

Код:
uses clock, time, usb, cs1237;
var
    led : boolean absolute p3.2;
    cs1237.pinc : boolean absolute p1.7;
    cs1237.pind : boolean absolute p1.5;
    m : record
        sec : word;
        adc : longint
        end absolute usb.buf[1].t;
begin
    repeat
        time.poll;
        usb.poll;
        if cs1237.poll then m.adc := cs1237.data;

        led := time.cs > 50;
        m.sec := time.s;

        if usb.len[1].r > 0 then begin
            move( usb.buf[1].r, usb.buf[1].t, 64 );
            usb.len[1].r := 0;
        end;
        if usb.len[1].t = 0 then usb.len[1].t := 64;
    until false;
end.

Отредактировано vt (2019-08-12 17:23:41)

158

57600 вполне хватит мне

159

Неожиданное применение CH552 )
http://sd.uploads.ru/5OEZe.jpg
https://micro-pi.ru/maixduino-sbc-risc- … ino-esp32/

А вот и софт нашёлся
CH552 Dual USB to Serial Bridge for Sipeed K210 & ESP32
https://github.com/diodep/ch55x_dualserial

Отредактировано vt (2019-08-13 16:45:44)

160

А это, наоборот, ожиданное )

http://s9.uploads.ru/8uhT6.jpg
http://sh.uploads.ru/Jkrjs.jpg

https://www.aliexpress.com/af/minpro.html
Burning speed:
We use GD25Q80 as the real test data to ensure the fairness of the test, and compare the same full data file on the same computer.
Minpro erase + burn + test Total time 20 seconds
CH341A erasing + burning + effect Total time 53 seconds
Burning speed far exceeds CH341A programmer

161

How To Program CH551G (Cheap uC From LCSC.com)
https://www.youtube.com/watch?v=a3XSIRkeubE
http://s7.uploads.ru/TPNiB.jpg

Ну и от себя добавлю к этому в таком же стиле

Беру два файла Turbo51 [и больше ничего, компилятор сам знает периферию 8051]
turbo51.exe - 274432 байт
turbo51.l51 - 113168 байт

Делаю третий - test.pas

Код:
begin
    p3.2 := false
end.

Делаю четвёртый командой turbo51 test.pas
test.bin - 7 байт

Это всё - светодиод горит )

Отредактировано vt (2019-08-15 11:09:48)

162

Минималистичный программатор для новых ch552

Код:
#include <stdio.h>
#include "libusb.h"
libusb_device_handle *devh;
char buf[64];
char chip[]     = "\xA1\x12\x00\x52\x11MCU ISP & WCH.CN";
char final[]    = {0xA2, 1, 0, 0};
char key[43]    = {0xA3, 40, 0};
char erase[]    = {0xA4, 1, 0, 8};
char write[64]  = {0xA5, 61, 0, 0, 0, 0, 0, 0};
char verify[64] = {0xA6, 61, 0, 0, 0, 0, 0, 0};
char info[]     = {0xA7, 2, 0, 0x1F, 0};
char xxx[]      = {0xA8, 14, 0, 7, 0, 0xFF, 0xFF, 0xFF, 0xFF, 3, 0, 0, 0, 0xFF, 0x52, 0, 0};

int usb ( unsigned char *data, int olen, int ilen ) {
    int inum, iret, onum, oret;
    if (!devh) {
        libusb_init( NULL );
        devh = libusb_open_device_with_vid_pid( NULL, 0x4348, 0x55E0 );
        libusb_claim_interface( devh, 0 );
    }
    if (olen) {
        oret = libusb_bulk_transfer( devh,    2, data, olen, &onum,  100 );
        iret = libusb_bulk_transfer( devh, 0x82, buf,  ilen, &inum, 1000 );
//      for (int i = 0; i < inum; i++) printf( "%02X ", buf[i] & 0xFF );
    }
    if (!olen || oret || iret) {
        libusb_release_interface( devh, 0 );
        libusb_close( devh );
        libusb_exit( NULL );
        exit( oret | iret );
    } else return inum;
}

int main ( int argc, char **argv ) {
    int a = 0, i, n, s;
    FILE *f;
    if ((f = fopen( argv[1], "rb" )) == NULL) exit( -1 );
//  printf( "chip %d\n",  usb( chip,  sizeof(chip)-1, 6 ));
//  printf( "info %d\n",  usb( info,  sizeof(info),  30 ));
    printf( "xxx %d\n",   usb( xxx,   sizeof(xxx),    6 ));
    printf( "info %d\n",  usb( info,  sizeof(info),  30 ));
    s = buf[22] + buf[23] + buf[24] + buf[25];
    for (i = 3; i < 43; i++) key[i] = s & 0xFF;
    printf( "key %d\n",   usb( key,   sizeof(key),    6 ));
    printf( "erase %d\n", usb( erase, sizeof(erase),  6 ));
    do {
        if (!(n = fread( buf, 1, 56, f ))) break;
        for (i = 0; i < n; i++) if (i % 8 == 7) buf[i] ^= 0x52;
        write[1] = (n + 5) & 0xFF;
        write[3] = a & 0xFF;
        write[4] = (a >> 8) & 0xFF;
        memcpy( write + 8, buf, n );
        printf( "write %d %d %d\n", a, n, usb( write, n + 8, 6 ));
        a += n;
    } while (n == 56);
/*
    a = 0;
    rewind( f );
    do {
        if (!(n = fread( buf, 1, 56, f ))) break;
        for (i = 0; i < n; i++) if (i % 8 == 7) buf[i] ^= 0x52;
        verify[1] = (n + 5) & 0xFF;
        verify[3] = a & 0xFF;
        verify[4] = (a >> 8) & 0xFF;
        memcpy( verify + 8, buf, n );
        printf( "verify %d %d %d\n", a, n, usb( verify, n + 8, 6 ));
        a += n;
    } while (n == 56);
*/
    printf( "final %d\n", usb( final, sizeof(final),  6 ));
    usb( buf, 0, 0 );
}

Отредактировано vt (2019-08-27 19:17:56)


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