Hi Anatoliy !
Совсем недавно 19 Sep 04 08:05, Anatoliy Degterenko писал к George Shepelev:
AD> К этому всему + подpобно pазобpаться в пpотоколе загpузки + написать AD> пpогу для контpоллеpа А если что то не получится то вместо того чтоб AD> отлаживать pаботу платы - надолго застpяну в конфигуpатоpах. Потом AD> начальство навешает ... Вот и выходит шо накладно. Или у вас готовый AD> пpимеp пpоги есть? Можно напосмотpеть? (под ПИКи пpоги читать умею)
Прошу прощения у тех, кому этого не нужно. Привожу тексты исходников для заливки. Я работал с EPF8452, 10K10, 1K30. Они отличаются друг от дружки только длиной массива данных.
Программа 1. Позволяет заливать 1K30 через байтбластер с IBM PC. (на Турбо-С)
=== Cut === #include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <bios.h>
char lptdata = 0x00; int lpt378=0x378,lpt379=0x379,lpt37a=0x37a;
/*-----------------23.05.00 22:12------------------- включение программатора
--------------------------------------------------*/ void progr_on() { outportb(lpt37a,0x02); return ; }
/*-----------------23.05.00 22:12------------------- выключение программатора
--------------------------------------------------*/ void progr_off() { outportb(lpt37a,0x01); return ; }
void bsf_nCONFIG() { lptdata= lptdata | 0x02; outportb( lpt378,lptdata); return ; }
void bcf_nCONFIG() { lptdata= lptdata & 0xfd; outportb( lpt378,lptdata); return ; }
void bcf_DATA0() { lptdata= lptdata & 0xBF; outportb( lpt378,lptdata); return ; }
void bsf_DATA0() { lptdata= lptdata | 0x40; outportb( lpt378,lptdata); return ; }
void bcf_DCLK() { lptdata= lptdata & 0xFE; outportb( lpt378,lptdata); return ; }
void bsf_DCLK() { lptdata= lptdata | 0x01; outportb( lpt378,lptdata); return ; }
int CONFIG_DONE() { int tmp1; tmp1= inportb( lpt379); tmp1= tmp1 & 0x80; return tmp1; }
int nSTATUS() { int tmp1; tmp1= inportb( lpt379); tmp1= tmp1 & 0x10; return tmp1; }
void wait2us() { int k; for (k=0;k<5;k++) inportb (lpt379); return; }
void setbit (char outbit) { if ( outbit == 0 ) bcf_DATA0(); else bsf_DATA0(); return ; }
clk1() { wait2us(); bsf_DCLK(); wait2us(); bcf_DCLK(); return ; }
/*-----------------23.05.00 22:29------------------- вдвижка байта
--------------------------------------------------*/ void outbyte(char tmp2) { setbit (tmp2 & 0x01); clk1(); setbit ((tmp2>>1) & 0x01); clk1(); setbit ((tmp2>>2) & 0x01); clk1(); setbit ((tmp2>>3) & 0x01); clk1(); setbit ((tmp2>>4) & 0x01); clk1(); setbit ((tmp2>>5) & 0x01); clk1(); setbit ((tmp2>>6) & 0x01); clk1(); setbit ((tmp2>>7) & 0x01); clk1(); return ; }
void main () { #include "c:\pic\altera\tmp1.ttf"
int i;
/*-----------------23.05.00 22:38------------------- begin --------------------------------------------------*/ l1:; /* outport(lpt378,0x80); outport(lpt378,0); goto l1;
*/
progr_on(); bcf_nCONFIG(); wait2us(); wait2us(); bsf_nCONFIG(); wait2us();
for ( i=0;i<59215;i++ ) { outbyte (massiv[i]); }
for (i=0;i<10;i++) clk1();
progr_off(); return ;
} == Cut ===
Программа2. Для заливки из 24LC512 через PIC16F628. (на ассемблере)
=== Cut === LIST P=16F628,E=0,F=INHX8M ;ТИП ПРОЦЕССОРА И ТИП ОШИБОК ОБРАБ.АССЕМБЛ.
ERRORLEVEL -302 ; : Register in operand not in bank 0. ERRORLEVEL -306 ; : Crossing page boundary -- ensure page bits are set.
Fosc EQU .20000000 ;ЧАСТОТА КВАРЦА
INCLUDE "c:\pic\include\16f628.inc" ;определение регистров PIC16F877
; ;*************** РЕГИСТРЫ ПОЛЬЗОВАТЕЛЯ ********************************
;РАСПИHОВКА ПИКА
;РАСПИHОВКА ПИКА
#DEFINE nCONFIG PA1 #DEFINE nSTATUS PB6 #DEFINE CONF_DONE PB0 #DEFINE DCLK PB7 #DEFINE DATA0 PA0 #DEFINE SDA1 PA4 #DEFINE SCL1 PA3 #DEFINE LED PB4
I2CADRL EQU 0x20 I2CADRH EQU 0x21 I2CDAT EQU 0x22 I2CBUF EQU 0x23 FLAGS1 EQU 0x24 #DEFINE I2CERR FLAGS1,0
TMP1L EQU 0x25 TMP1H EQU 0x26
; ; INCLUDE "c:\pic\include\macdefs.inc" ;определение макросов
; ;=====================================================================
ORG 000h GOTO BEGIN
ORG 0x004 RETFIE
; BEGIN
;********* стартовая инициализация служебных регистров и портов **********
INCLUDE "c:\pic\include\reset628.inc" ; ;ВЫКЛЮЧАЕМ ВСЕ. ПЕРЕВОДИМ ПОРТЫ HА ВВОД
;конфигурирование PLM PPAGE 1 BCF LED PPAGE 0 BCF LED
CALL CONFIG_PLM
BSF LED
GOTO $
;*********************************************************** ; Hачало цикла конфигурирования ;*********************************************************** CONFIG_PLM BSF nCONFIG BCF DCLK PPAGE 1 BCF nCONFIG BSF nSTATUS BSF CONF_DONE BCF DCLK BCF DATA0 BSF SDA1 BCF SCL1 PPAGE 0 CLRWDT CALL DEL100ms
BSF nCONFIG CALL DELAY5 CALL DELAY5 BCF nCONFIG ;START CONFIG CALL DELAY4 BSF nCONFIG CALL DELAY4
CLRF I2CADRL CLRF I2CADRH
CALL BSTART ; Generate START bit MOVLW B'10100000' CALL TX_BYTE ;CONTROL BYTE MOVF I2CADRH,0 CALL TX_BYTE ;ADRESS, HIGH BYTE MOVF I2CADRL,0 CALL TX_BYTE ;ADRESS, LOW BYTE CALL BSTART ; START READ MOVLW B'10100001' CALL TX_BYTE ;CONTROL BYTE
LOOP1 CALL RX_BYTE_NAC ; READ in data and NO acknowledge
;Имеем прочитанный байт в I2CBUF MOVF I2CBUF,0 MOVWF I2CDAT CALL SHIFT_ALTERA ;вдвигаем байт в Альтеру
INCF I2CADRL,1 ;ADR++ BTFSC Z INCF I2CADRH,1 CSE I2CADRL,low(.59215+.11+.1) GOTO LOOP1 CSE I2CADRH,high(.59215+.11+.1) GOTO LOOP1
;ПЕРЕБРАЛИ ВСЕ CALL RX_BYTE ; READ in data and acknowledge CALL BSTOP ; Generate STOP bit
PPAGE 1 BSF nCONFIG BSF nSTATUS BSF CONF_DONE BSF DCLK BSF DATA0 PPAGE 0 BSF LED
RETURN
TAKT1 MACRO REG,BIT BTFSS REG,BIT BCF DATA0 BTFSC REG,BIT BSF DATA0 NOP BSF DCLK NOP BCF DCLK ENDM
BCF_TRIS_SDA1 MACRO PPAGE 1 BCF SDA1 PPAGE 0 ENDM
BSF_TRIS_SDA1 MACRO PPAGE 1 BSF SDA1 PPAGE 0 ENDM
; ;----------------------------------------------------------------------------- ; Serial data send from PIC to serial EEPROM, bit-by-bit subroutine ;----------------------------------------------------------------------------- ; Input : None ; Output : To (DI) of serial EEPROM device ;----------------------------------------------------------------------------- ; I2C_BITOUT MACRO LOCAL BIT0,CLK1 BCF_TRIS_SDA1 BTFSS C GOTO BIT0 BSF SDA1 ; Output bit 1 GOTO CLK1 BIT0 BCF SDA1 ; Output bit 0 CLK1 CALL DELAY2 BSF SCL1 CALL DELAY2 BCF SCL1 ; Return SCL1 to low ENDM ;END SUB
; ;----------------------------------------------------------------------------- ; Serial data receive from serial EEPROM to PIC, bit-by-bit subroutine ;----------------------------------------------------------------------------- ; Input : EEPROM file ; Output : From (STATUS,C) of serial EEPROM device to PIC ;----------------------------------------------------------------------------- ; I2C_BITIN MACRO BSF_TRIS_SDA1 BSF SDA1 ; Set SDA1 for input BCF C CALL DELAY2 BSF SCL1 ; Clock high CALL DELAY2 BTFSC SDA1 ; Read SDA1 pin BSF C ; DI = 1 BCF SCL1 ; Return SCL1 to low ENDM ; ;END SUB
; ; ;----------------------------------------------------------------------------- ; TRANSMIT DATA subroutine ;----------------------------------------------------------------------------- ; Input : W ; Output : Data X'mitted to EEPROM device ;----------------------------------------------------------------------------- ; TX_BYTE MOVWF I2CBUF RLF I2CBUF,1 I2C_BITOUT ; Serial data out D7 RLF I2CBUF,1 I2C_BITOUT ; Serial data out D6 RLF I2CBUF,1 I2C_BITOUT ; Serial data out D5 RLF I2CBUF,1 I2C_BITOUT ; Serial data out D4 RLF I2CBUF,1 I2C_BITOUT ; Serial data out D3 RLF I2CBUF,1 I2C_BITOUT ; Serial data out D2 RLF I2CBUF,1 I2C_BITOUT ; Serial data out D1 RLF I2CBUF,1 I2C_BITOUT ; Serial data out D0 I2C_BITIN ; Read acknowledge bit BTFSC C ; Check for acknowledgement BSF I2CERR ; No acknowledge from device RETLW 0
;
DELAY5 DELAY .5 RETURN
DELAY4 DELAY .4 RETURN
DELAY2 DELAY .2 RETURN
; ;----------------------------------------------------------------------------- ; RECEIVE DATA subroutine ;----------------------------------------------------------------------------- ; Input : None ; Output : I2CBUF = Receive 8-bit data ;----------------------------------------------------------------------------- ; RX_BYTE I2C_BITIN RLF I2CBUF,1 ; Shift d7 to buffer I2C_BITIN RLF I2CBUF,1 ; Shift d6 to buffer I2C_BITIN RLF I2CBUF,1 ; Shift d5 to buffer I2C_BITIN RLF I2CBUF,1 ; Shift d4 to buffer I2C_BITIN RLF I2CBUF,1 ; Shift d3 to buffer I2C_BITIN RLF I2CBUF,1 ; Shift d2 to buffer I2C_BITIN RLF I2CBUF,1 ; Shift d1 to buffer I2C_BITIN RLF I2CBUF,1 ; Shift d0 to buffer
BSF C ; Set acknowledge bit = 1 I2C_BITOUT ; to STOP further input RETLW 0
RX_BYTE_NAC I2C_BITIN RLF I2CBUF,1 ; Shift d7 to buffer I2C_BITIN RLF I2CBUF,1 ; Shift d6 to buffer I2C_BITIN RLF I2CBUF,1 ; Shift d5 to buffer I2C_BITIN RLF I2CBUF,1 ; Shift d4 to buffer I2C_BITIN RLF I2CBUF,1 ; Shift d3 to buffer I2C_BITIN RLF I2CBUF,1 ; Shift d2 to buffer I2C_BITIN RLF I2CBUF,1 ; Shift d1 to buffer I2C_BITIN RLF I2CBUF,1 ; Shift d0 to buffer
BCF C ; Set acknowledge bit = 0 I2C_BITOUT ; to STOP further input RETLW 0 ; ;END SUB
DEL100ms CLRF TMP1L CLRF TMP1H D100_LOOP nop nop nop DECFSZ TMP1L,1 GOTO D100_LOOP DECFSZ TMP1H,1 GOTO D100_LOOP RETURN
; ******** подпрограммы для работы по шине I2C ****************
;----------------------------------------------------------------------------- ; START bus communication routine ;----------------------------------------------------------------------------- ; input : none ; output : initialize bus communication ;----------------------------------------------------------------------------- ; ;Generate START bit (SCL1 is high while SDA1 goes from high to low transition) ;and check status of the serial clock. BSTART BCF_TRIS_SDA1 bsf SDA1 ;make sure SDA1 is high BSF SCL1 ; Set clock high CALL DELAY5 BCF SDA1 ; SDA1 goes low during SCL1 high CALL DELAY4 BCF SCL1 ; Start clock train RETLW 0 ; ;----------------------------------------------------------------------------- ; STOP bus communication routine ;----------------------------------------------------------------------------- ; Input : None ; Output : Bus communication, STOP condition ;----------------------------------------------------------------------------- ; ;Generate STOP bit (SDA1 goes from low to high during SCL1 high state) ;and check bus conditions. ; BSTOP BCF_TRIS_SDA1 BCF SDA1 ; Return SDA1 to low BSF SCL1 ; Set SCL1 high CALL DELAY4 BSF SDA1 ; SDA1 goes from low to high during SCL1 high RETLW 0 ; ;END SUB
SHIFT_ALTERA ;вдвигаем байт в Альтеру ;IN: I2CDAT
TAKT1 I2CDAT,0 TAKT1 I2CDAT,1 TAKT1 I2CDAT,2 TAKT1 I2CDAT,3 TAKT1 I2CDAT,4 TAKT1 I2CDAT,5 TAKT1 I2CDAT,6 TAKT1 I2CDAT,7 RETURN
END === Cut ===
Если что-то все-таки не ясно- спрашивай.
Есть и на C исходники (эти асмовские трехлетней давности).
WBRgrds Ruslan