Самое неудобное то, что вывод VCC также используется для питания портов. Поэтому, если мы хотим использовать в системе чипы с питанием 3В, то и микроконтроллер нужно питать таким же напряжением (он это допускает), но при этом теряется возможность обновления прошивки. Короче говоря есть схемотехнический гемор (хотя это решается )
CH55x (CH551 CH552 CH554)
Сообщений 31 страница 60 из 162
Поделиться322018-01-25 21:39:22
Ну вы и пионеры (в хорошем смысле), пока решусь и приобрету, все фишки-бяки выловите...
Поделиться332018-01-30 10:21:50
1000 раз перезаписал программу в ch551 - никаких сбоев при записи пока не появилось
Может и не всё так плачевно с кол-вом циклов, хотя один чип не показатель конечно, да и программа была маленькая, не на всю флеш
Добавил ещё две таблицы в перевод даташита [T2CON и T2MOD в параграф 12.2] - forumfiles.ru/files/0018/26/8f/56295.zip
Гуглоперевод конечно ужасен, но всё равно потом или на русский переводить или забыть
Отредактировано vt (2018-01-30 13:55:12)
Поделиться342018-02-02 10:56:56
Интересно, хоть что-нибудь из этих фич 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
Поделиться352018-02-04 13:14:31
, для компиляции использую SDCC
Почему не Keil?
И какие всё-таки чипы брать????
Поделиться362018-02-04 13:53:41
CH552 наверно
По цене почти не отличается от ch551, но есть всё что в ch554 кроме usb-host
Поделиться372018-02-05 10:29:05
Почему не Keil?
Компиляторы для 51-й архитектуры слишком сильно отличаются, но если использовать compiler.h из SDCC, то можно писать компиляторонезависимый код, который будет собираться при помощи Keil, IAR, SDCC и т.д.
Поделиться382018-02-20 09:51:55
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)
Поделиться392018-03-15 14:42:08
Пока я собирался, уже сделали реверс протокола программирования и кроссплатформенную тулзу
https://github.com/rgwan/librech551
Протокол оказался очень простой, а тулза легко портируется даже на tcc [ https://bellard.org/tcc/ ]
Но снял всё-таки логи wchisptool, всё так же делает эта librech551
Отредактировано vt (2018-03-31 11:49:35)
Поделиться402018-03-31 08:18:51
это очень интересно теперь хочется пример для моста USB -rs232
и ШИМ программный как реализовать выводов на 6 можно с глубиной 8 бит
Отредактировано selevo (2018-03-31 08:57:20)
Поделиться412018-03-31 10:25:49
Ну паскаль же ты знаешь )
Ну и, имхо, не стоит насиловать эти мк софтовым шимом, у них есть родной элементарно простой двухканальный pwm и это их предназначение и предел
Если надо больше каналов, то просто использовать больше чипов
Если надо больше жёстко синхронизованных каналов, то использовать другой чип
Хотя, всё что укладывается в таймерное прерывание скажем где-то 24 КГц [1000 тактов при 24 МГц тактовой], конечно, можно делать легко, 8-битный софтовый шим при этом будет примерно 90 Гц [24000/256], хоть на все ноги
Поделиться422018-03-31 23:41:40
selevo, увидел твой топик про CH55x на easyelectronics
Тогда должен немедленно сообщить пренеприятнейшее известие - в CH551 нет АЦП
Я как-то упустил это когда писал про разницу между моделями [да у меня и чипов тогда ещё не было], сейчас добавил
Отредактировано vt (2018-04-01 09:42:47)
Поделиться432018-04-01 15:40:44
ооо блин вот это разачарование конечно...
ладно
а USB-то там есть ?
Поделиться442018-04-01 18:26:46
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.
Поделиться452018-04-01 19:04:51
Спасибо
Ещё вопрос там USB приёмопередатчик полностью самостоятельный или какой-то реакции требует от проца ?
То есть процессор от USB не отвалится если я его полностью зациклю на своих нуждах или нормально будет работать ?
Отредактировано selevo (2018-04-01 19:05:56)
Поделиться462018-04-01 19:47:04
Ещё вопрос там USB приёмопередатчик полностью самостоятельный или какой-то реакции требует от проца ?
То есть процессор от USB не отвалится если я его полностью зациклю на своих нуждах или нормально будет работать ?
Требует реакции
Когда хост передал пакет, а мк принял, но ещё не обработал, то мк должен немедленно выставить [в обработчике прерывания] запрет хосту передавать следующий пакет [выставить состояние NAK], иначе хост завалит мк пакетами
И наоборот, когда хост запрашивает пакет, у мк выставлено разрешение забирать данные [состояние ACK], хост забирает пакет, то мк должен немедленно снять разрешение [выставить состояние NAK], иначе хост следующим запросом снова заберёт те же данные и т.д.
Сам по себе usb в мк не отвалится при длительном бездействии, это хост может отключить usb со свой стороны, но если потом снова включит, то всё должно снова заработать
ch55 могут распознавать когда хост отключается и тоже что-то у себя отключать, но это надо делать специально, автоматически мк это не делает
Ну и на крайний случай какого-то фатального сбоя ch55 умеют имитировать будто их оторвали от usb и снова подключили [управлять подтягивающим резистором на usb шине d+, он у них внутри], при этом всё ресетится и у хоста, и у мк и начинается с чистого листа
Поделиться472018-04-02 11:39:00
ага...
Поделиться482018-04-07 09:53:07
а что в ch554.pas
есть код реализующий USB -RS 232 ?
Поделиться492018-04-07 13:29:42
Имхо, usb-serial - архаичный и ущербный метод, а стильно, модно, молодёжно - https://ru.wikipedia.org/wiki/WinUSB
Под него и пример выше
Поделиться502018-04-07 18:57:13
аааа
Ещё не понял, как дела с отладкой в этих чипах ?
Отредактировано selevo (2018-04-07 19:10:38)
Поделиться512018-04-07 20:39:03
Ещё не понял, как дела с отладкой в этих чипах ?
Никак, её нет
Теоретически в мануале упоминается некий 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
Поделиться522018-04-08 09:55:03
ясно
ну это наверно только по запросу тем кто от 1000 берёт
Железка не обязательная, значения регистров можно и самой программой просматривать.
Поделиться532018-04-08 12:59:03
Ещё по поводу 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]
Поделиться542018-04-09 17:40:31
Ещё одна кроссплатформенная тулза для прошивки [на питоне и под MIT лицензией]
https://github.com/juliuswwj/wchprog
Поделиться552018-04-14 18:41:31
О времени выполнения команд в 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
В командах переходов кол-во тактов зависит от чётности адреса назначения, если нечётный, то тактов больше
Для команд условных переходов первое число - кол-во тактов когда перехода нет, а диапазон чисел - когда есть
Поделиться562018-04-18 23:54:20
Вот странно: sdcc же вроде как для 8051 должен код оптимизировать (это ж не "свежие" STM8). Но адреса не выравнивает, получается...
Поделиться572018-04-19 08:35:15
Вот странно: sdcc же вроде как для 8051 должен код оптимизировать (это ж не "свежие" STM8). Но адреса не выравнивает, получается...
Ничего не понял, подробнее объясните
Поделиться582018-04-19 10:52:13
Вот странно: sdcc же вроде как для 8051 должен код оптимизировать (это ж не "свежие" STM8). Но адреса не выравнивает, получается...
Для x51 обычно не надо адреса выравнивать, зависимость от чётности - экзотика
Вот сравни например с STC15
Поделиться592018-04-20 17:18:39
Инфа о CH55x на ElectroDragon
wiki - http://www.electrodragon.com/w/WCH
git - https://github.com/Edragon/WCH
Поделиться602018-04-21 17:06:08
О это вроде я ещё не скачивал, спасибо.
какая-то странная wiki- страница,включен запрет на клики мышкой и выделение текста, пришлось поставить дополнение блокирующее блокировку Давно собирался..
что за бред пишут про эти процы
+ TypeC Master/Slave Detect
какой нах type-C
это типа могут перекидывать сигнал ?
так в этом разъёме выводы симметричны ничё там перекидывать не надо..
ничё не понимаю.
Хостинг кривой этот, сайт может в любое время исчезнуть навсегда.
Ещё на форуме нет отправки сообщения по CTRL+ENTER
Что меня напрягает, надо брать мышку в руки
Отредактировано selevo (2018-04-21 17:09:28)