Итого, вместо 9 обращений по USB я ж могу слать только данные (2 обращения), а остальными ногами дергать в самом контроллере, в зависимости от того - первый это байт или второй:
Code: Select all
bc1 = 1 ; bdir = 1 ; res = 1 ; Reset
bc1 = 1 ; bdir = 1 ; res = 0 ; Reset
bc1 = 1 ; bdir = 1 ; res = 1 ; Reset
bc1 = 0 ; bdir = 0 ; res = 1 ;YM inactive ;1 IO USB
Data = 12 ; данные ; 2 IO USB
bc1 = 1 ; bdir = 1 ; res = 1 ; писать адрес ;3 IO USB
Data = 12 ; данные ;4 IO USB
bc1 = 0 ; bdir = 0 ; res = 1 ; YM inactive ;5 IO USB
Data = 0 ; данные ;6 IO USB
bc1 = 0 ; bdir = 1 ; res = 1 ; писать данные ;7 IO USB
Data = 0 ; данные ; 8 IO USB
bc1 = 0 ; bdir = 0 ; res = 1 ; YM inactive ; 9 IO USB
bc1 = 0 ; bdir = 0 ; res = 1
Data = 11
bc1 = 1 ; bdir = 1 ; res = 1
Data = 11
bc1 = 0 ; bdir = 0 ; res = 1
Data = 0
bc1 = 0 ; bdir = 1 ; res = 1
Data = 0
bc1 = 0 ; bdir = 0 ; res = 1
То есть в обертке inpout.dll я должен контроллеру выдавать только данные (порт 0x378), причем пропускать каждый второй байт. В самом контроллере я должен использовать флаг, показывающий - первый байт пришел или второй. Если первый - то сам контроллер должен выставить bc1 = 1, bdir = 1. Если второй, то bc1 = 0, bdir1 = 1. И так по-кругу.
Вчера уже поздно вечером попробовал - что-то не взлетает. Какие-то шумы и хрипы. Не очень хорошо в даташите показаны тайминги цикла записи и цикла записи адреса. Пытался сделать так как и было раньше:
установил bc1=0, bdir=0 (YM inactive)
выдал байт данных на ноги D0-D7
если первый байт то bc1=1, bdir=1
иначе bc1=0, bdir = 1
подождал около ~1500 нс
установил bc1=0, bdir=0 (YM inactive)
Не работает.
То есть процедура вывода байта в ПИКе такая:
Code: Select all
DIO_WriteByte:
bcf PORTA,3 ; bc1 = 0
bcf PORTA,4 ; bdir = 0
movlw 0x10 ; delay 0.00005 sec (24MHz)
movwf TMP
wait2:
decfsz TMP
goto wait2
;Put value in RB3-RB7
movlw B'00000111'
andwf PORTB,W
movwf TMP
movlw B'11111000'
andwf RXDATA_BUFFER+4,W ;wIndex Lo
iorwf TMP,W
movwf PORTB
;Put the last bits values in RA0-RA2
movlw B'11111000'
andwf PORTA,W
movwf TMP
movlw B'00000111'
andwf RXDATA_BUFFER+4,W ;wIndex Lo
iorwf TMP,W
movwf PORTA
btfsc ODDEVEN,0 ; this is first byte in queque?
goto second_byte ; no, goto second byte
; yes - thi is firs byte
bsf ODDEVEN,0 ; set zero bit in ODDEVEN flag
bsf PORTA,3 ;bc1 = 1
bsf PORTA,4 ;bdir = 1
goto ctrl_done ; controll done
second_byte:
bcf ODDEVEN,0 ; clear zero bit in ODDEVEN flag
bcf PORTA,3 ; bc1 = 0
bsf PORTA,4 ; bdir = 1
ctrl_done:
movlw 0x10 ; delay 0.00005 sec (24MHz)
movwf TMP
wait:
decfsz TMP
goto wait
bcf PORTA,3 ; bc1 = 0
bcf PORTA,4 ; bdir = 0
return
В обертке inpout32.dll такое:
Code: Select all
switch (port)
{
case 0x378:
if (skip_data == 0)
writeByte(Value);
skip_data = ~skip_data;
break;