[an error occurred while processing this directive] [an error occurred while processing this directive]
Ответ: Текст программы, сорри за размер :(
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено DimaT 22 июня 2002 г. 15:46
В ответ на: Ответ: отправлено dvg 22 июня 2002 г. 12:06

;Тестовая программа для записи и чтения данных из Smart Media Card SMVF008 (8MB)
;Процессор Scenix SX52BD фирмы Ubicom (fosc=48 MHz). Код похож на код PIC процессоров.

DEVICE SX52,OSCHS3
RESET Start

;commands for flash
FLReset equ $ff
FLRead1 equ $00
FLRead2 equ $50
FLStatus equ $70
FLReadID equ $90
FLErase equ $60
FLErase1 equ $d0
FLWrite equ $80
FLPagePrg equ $10

;pins for flash
cle_pin equ ra.0 ;CLE
ce_n_pin equ ra.1 ;/CE
ale_pin equ ra.2 ;ALE
re_n_pin equ ra.3 ;/RE
wp_n_pin equ rb.3 ;/WP
we_n_pin equ rb.6 ;/WE
r_b_pin equ rb.7 ;R/B

;Глобальные переменные
Adress equ $0a
Idx equ $0b
fl equ $0c
data equ $0d
counter equ $0e

;
; Variables
;

org 30h
flashvars = $
column ds 1 ;0..255=2^8 columns
rowl ds 1 ;0..1023=2^10 rows
rowh ds 1
command ds 1
fl1 ds 1
flpage ds 1
clusterl ds 1 ;1 cluster=16 sectors (1024 clusters)
clusterh ds 1
sectorl ds 1 ;16sectors*1024clucters=16384 unformatted sectors
sectorh ds 1
cicles ds 1
adrl ds 1
adrh ds 1
errcode ds 1

org 50h
filevars = $
Name ds 8
i ds 1
j ds 1
FIdx ds 1
psel ds 1

org 70h
undodata = $
r1 ds 1 ;reserved fields r1..r4 contain $ff value
r2 ds 1
r3 ds 1
r4 ds 1
dstatus ds 1 ;data status-$ff if correct
bstatus ds 1 ;block status-$ff if correct
badressl1 ds 1 ;block adress
badressh1 ds 1
ecc11 ds 1 ;ecc1,2 fields for line parity
ecc12 ds 1
ecc13 ds 1 ;ecc3 field for column parity
badressl2 ds 1
badressh2 ds 1
ecc21 ds 1
ecc22 ds 1
ecc23 ds 1

org 90h
filedata = $
fdata ds 16

ORG $0 ;Program Memory Page 0
comload jmp @_comload ;загрузка команды в SMC
adrload jmp @_adrload ;загрузка адреса в SMC
ferase jmp @_ferase ;стирание блока
rdata jmp @_rdata ;чтение байта данных из SMC
wrdata jmp @_wrdata ;запись байта данных в SMC
ReadID jmp @_ReadID ;чтение ID карты
ReadSts jmp @_ReadSts ;чтение статуса карты
Flspare jmp @_Flspare ;подготовка дополнительного поля в 16 байт для SMC
cparity jmp @_cparity ;генерация четности по столбцам
lparity jmp @_lparity ;генерация четности по строкам
bparity jmp @_bparity ;четность 1 байта
wrTable jmp @_wrTable ;чтение памяти прогр. CPU
fwrite jmp @_fwrite ;запись тестовой таблицы
clrbanks jmp @_clrbanks ;очистка всех банков ОЗУ CPU
read16 jmp @_read16 ;чтение 16 байт из SMC в ОЗУ CPU
write16 jmp @_write16 ;запись 16 байт из ОЗУ CPU в SMC


Rst jmp @_Rst

;***************************Начальные установки********************************************
Start
mov w,#$1f
mov m,w ;Регистр задачи направления порта
mov !rc,#$00 ;Порт С на вывод (для работы с SMC)
mov !ra,#$00 ;порт A на вывод
mov !rb,#%10110111


clr ra
nop
clr rb
nop
clr rc
nop

setb re_n_pin
nop
setb we_n_pin
nop
clrb ale_pin
nop
clrb cle_pin
nop
setb wp_n_pin
nop
setb ce_n_pin
clr fl

main
call @clrbanks ;очистим все банки контроллера

mov fsr,#$30
mov column,#$00 ;SMC адрес1
mov rowl,#$20 ;SMC адрес2 (2 блок)
mov rowh,#$00 ;SMC адрес3

call @read16 ;читать 16 байт из SMC

mov fsr,#$30
mov column,#$00
mov rowl,#$30 ;3 блок
mov rowh,#$00
call @ferase ;сотрем перед записью блок
call @write16 ;а теперь запишем считанные 16 байт*32раза=512 байт

mov fsr,#$30
mov column,#$00
mov rowl,#$40 ;4 блок
mov rowh,#$00
call @ferase
call @fwrite ;запишем тестовую инфо хранящуюся в ПП МК

final clr !wdt
jmp final

;****************************************************************************
;подпрограмма записи 512 байт данных+16 служебных байт в SMC
;data in: column,rowl,rowh-адрес строки, страницы и блока
;****************************************************************************

_fwrite
clrb ce_n_pin

mov w,#$1f
mov m,w
mov !rc,#$00

call @Rst ;сброс SMC
mov fsr,#$30
mov command,#FlWrite
call @comload

clrb fl1.0 ;загрузка 3 байт адреса
call @adrload

clrb fl.6 ;запись 1 половины страницы 256 байт
mov fsr,#$50
mov FIdx,#TestInfo
mov psel,#$05
clr j
call @wrTable

setb fl.6 ;запись 2 половины страницы 256 байт
mov fsr,#$50
mov FIdx,#TestInfo
mov psel,#$05
clr j
call @wrTable

clrb fl.6

call @FlSpare ;подготовка служебной инфо
mov fsr,#$70
wrsp
mov data,indf
clr indf
call @wrdata
inc fsr
mov w,fsr
and w,#$0f
test w
jnz wrsp
clz


mov fsr,#$30
mov command,#FLPagePrg ;page program
call @comload
setb ce_n_pin

retp

;****************************************************************************
;подпрограмма чтения 16 байт из SMC
;data in: column,rowl,rowh-адрес строки, страницы и блока
;****************************************************************************
org $100
_read16
clrb ce_n_pin

mov w,#$1f
mov m,w
mov !rc,#$00 ;rc out

call @Rst
mov fsr,#$30
clr command
call @ComLoad
clrb fl1.0 ;load 3 bytes of adress
call @AdrLoad

clr counter

mov w,#$1f
mov m,w
mov !rc,#$ff ;rc in

mov fsr,#$90 ;запись в банк 16 считанных байт
r16
call @rdata
mov indf,data
inc fsr
mov w,fsr
and w,#$0f
jnz r16
clz

mov w,#$1f
mov m,w
mov !rc,#$00 ;rc out
setb ce_n_pin


retp

;****************************************************************************
;подпрограмма записи 16 байт в SMC
;data in: column,rowl,rowh-адрес строки, страницы и блока
;****************************************************************************

_write16
clrb ce_n_pin

mov w,#$1f
mov m,w
mov !rc,#$00

call @Rst
mov fsr,#$30
mov Command,#FLWrite
call @ComLoad

clrb fl1.0 ;load 3 bytes of adress
call @AdrLoad

clr counter
clrb fl.6
mov fsr,#$90 ;bank filedata
w16
mov data,indf
call @wrdata
mov Adress,fsr
call @cparity
call @lparity
mov fsr,Adress
inc fsr
inc counter
mov w,fsr
and w,#$0f
jnz w16
clz
mov fsr,#$90 ;bank filedata
test counter
jnz w16
clz
xor fl,#$40
jb fl.6,w16

call @FlSpare
mov fsr,#$70
wrsp1 mov data,indf
call @wrdata
clr indf
inc fsr
mov w,fsr
and w,#$0f
test w
jnz wrsp1
clz

mov fsr,#$30
mov command,#FLPagePrg ;page program
call @comload

setb ce_n_pin
retp


;****************************************************************************
;подпрограмма очистки блока по указанному адресу
;params in: column,rowl, rowh
;****************************************************************************

_ferase
clrb ce_n_pin

mov w,#$1f
mov m,w
mov !rc,#$00

call @Rst

mov fsr,#$30
mov command,#FLErase ;prepare for erase
call @comload
setb fl1.0 ;load 2 byte of adress
call @adrload
clrb fl1.0
mov command,#FLErase1
call @comload

setb ce_n_pin
retp
;******************************************************
;subroutine--load command to flash
;******************************************************

_comload
mov fsr,#$30
mov data,command
setb cle_pin
call @wrdata
clrb cle_pin
nop
nop
com_busy jnb r_b_pin,com_busy
retp

;******************************************************
;load adress to flash
;param in-column,rowl,rowh,fl.1: '0'-load 3 bytes '1'-load 2 bytes
;******************************************************

_adrload
mov fsr,#$30
snb fl1.0
inc fsr

setb ale_pin
ald
mov data,indf
call @wrdata
inc fsr
mov w,fsr
and w,#$0f
xor w,#$03
jnz ald
clz
clrb ale_pin
nop
nop
nop
adr_busy jnb r_b_pin,adr_busy
retp

;******************************************************
;write data to flash
;******************************************************

_wrdata

mov rc,data
busy_wr jnb r_b_pin,busy_wr
clrb we_n_pin
nop
nop
nop
nop
nop
nop
setb we_n_pin
nop
retp
;******************************************************
;read data from flash
;******************************************************
_rdata

busy_rd jnb r_b_pin,busy_rd
clrb re_n_pin
nop
nop
nop
nop
nop
mov data,rc
nop
setb re_n_pin

retp
;*******************************************************
;SUBROUTINE FOR READING DATA FROM PROGRAM MEMORY
;*******************************************************

_wrTable
mov fsr,#$50

read_again
mov m,psel
mov w,FIdx
IREAD
mov data,w
call @wrdata
mov counter,FIdx
mov Idx,data
call @cparity
mov data,Idx
call @lparity
mov fsr,#$50
inc FIdx
djnz j,read_again
clz
retp
;****************************************************************************
;подпрограмма подготовки служебной информации для каждой страницы SMC
;16 байт (511...527)
;param in-rowl,rowh
;param out-служебная информация в банке undodata
;****************************************************************************
org $200
_FlSpare
mov fsr,#$30
mov Adress,rowh
mov fsr,#$70
mov badressl1,Adress
and badressl1,#$3f
mov fsr,#$30
mov Adress,rowl

mov fsr,#$70
mov badressh1,Adress
mov r4,data ;save data in data field
mov r1,#$03 ;counter
clc
Uloop1
rr badressl1
rr badressh1
clc
djnz r1,Uloop1
clrb badressh1.0
and badressl1,#$07
or badressl1,#$10
mov data,badressl1
clr r2
call @bparity
snb fl.7
setb r2.0
mov data,badressh1
call @bparity
mov w,#$01
snb fl.7
xor r2,w
or badressh1,r2

mov badressl2,badressl1
mov badressh2,badressh1
mov data,r4 ;retrieve data

mov fsr,#$70
ell2
mov indf,#$ff ;установить в $ff первые 6 байт
inc fsr
mov w,fsr
and w,#$0f
xor w,#$06
jnz ell2
clz

not ecc11
not ecc12
not ecc13
not ecc21
not ecc22
not ecc23
retp
;*****************************************************************************
;подпрограмма генерации кода Хэмминга по столбцам
;param in:
;data-байт данных для генерации кода
;fl.6='0'-запись в 1-ую половину страницы SMC
;fl.6='1'-запись во 2-ую половину страницы SMC
;counter-указатель строки в SMC
;param out: байт кода в поле ecc13(ecc23)
;****************************************************************************

_cparity
mov fsr,#$70
mov w,#ecc13 ;default ecc13 field
snb fl.6
mov w,#ecc23
mov fsr,w
xor ind,data
mov bstatus,ind
cjne counter,#$ff,cfinal
clr r4 ;r4 is counter
clr r1 ;r1 contain results of parity check
Pcheck mov r3,#$01 ;r3 index for hamming code data
mov r2,#$01 ;r2 contain 1 selected bit of data
and r2,bstatus

genecc clrb fl.5
mov w,r3
and w,r4
jz el1
clc
rl r2
clc
setb fl.5
el1 xor r1,r2
clc
sb fl.5
rl r2
clc
rl r2
clc
rl r3
clc
jnb r3.3,genecc
rr bstatus
inc r4
cjne r4,#$08,Pcheck
mov w,#ecc13 ;default ecc13 field
snb fl.6
mov w,#ecc23
mov fsr,w
mov ind,r1
clc
rl ind
rl ind
clc
and ind,#$fc
cfinal
retp
;****************************************************************************
;подпрограмма генерации кода Хэмминга по строкам
;param in:
;data-байт данных для генерации кода
;fl.6='0'-запись в 1-ую половину страницы SMC
;fl.6='1'-запись во 2-ую половину страницы SMC
;counter-указатель строки в SMC
;param out: байт кода в поле ecc12(ecc22) и ecc13(ecc23)
;****************************************************************************

_lparity
call @bparity ;check
mov fsr,#$70
mov r4,counter ;counter shows line in array data
clrb fl.4 ;flag-shows current nibble
agn clr r2
snb fl.7 ;fl.7 parity flag
setb r2.0
clr r1 ;r1 contains results of parity check
mov r3,#$01 ;r3 index for hamming code data
geneccl clrb fl.5 ;flag-sets if current bit of counter not zero
mov w,r3
and w,r4
jz ell1
clc
rl r2
setb fl.5

ell1 xor r1,r2
clc
sb fl.5
rl r2
clc
rl r2
clc
rl r3
clc
cjb r3,#$10,geneccl
swap r4
xor fl,#$10 ;not fl.4 bit
mov w,#dstatus
sb fl.4
mov w,#bstatus
mov fsr,w
mov ind,r1
snb fl.7
setb r2.0
jb fl.4,agn

mov w,#ecc11
snb fl.6
mov w,#ecc21
mov fsr,w

mov w,dstatus
xor ind,w
inc fsr
mov w,bstatus
xor ind,w

retp
;****************************************************************************
;подпрограмма генерации бита четности
;param in:
;data-байт данных для проверки четности
;param out:
;fl.7=флаг четности: '1'-если байт имеет нечетное кол-во единиц
;*****************************************************************************

_bparity
mov fsr,#$70
clrb fl.7
mov r1,#$08 ;r1-counter
clr w
clc
bcheck
snb data.0
xor w,#$80
rr data
djnz r1,bcheck

rr data
or fl,w
retp
;*****************************************************************************
;subroutine for clear all banks
;*****************************************************************************

_clrbanks
mov fsr,#$10
cab clr !wdt
clr indf
inc fsr
jnz cab
clz
retp


;***********************************************************************************
;подпрограмма чтения ID кода
;
;*********************************************************************************** mov fsr,#$90
_ReadID
clrb ce_n_pin
call @Rst
mov fsr,#$30
mov command,#$90
call @comload

clr data
setb ale_pin
call @wrdata
clrb ale_pin

mov w,#$1f
mov m,w
mov !rc,#$ff ;rc in

l1 call @rdata
xor data,#$ff
jz l1
clz

mov w,#$1f
mov m,w
mov !rc,#$00 ;rc out
setb ce_n_pin
retp
;***********************************************************************************
;подпрограмма чтения регистра статуса SMC
;*********************************************************************************** mov fsr,#$90
_ReadSts
clrb ce_n_pin
clrb fl.3
mov fsr,#$30
mov command,#FlStatus
call @comload
mov w,#$1f
mov m,w
mov !rc,#$ff ;rc in

call @rdata
xor data,#$c0
snz
setb fl.3

clz
mov w,#$1f
mov m,w
mov !rc,#$00 ;rc out
setb ce_n_pin

retp

;***********************************************************************************
;Сброс SMC
;***********************************************************************************

_Rst

mov fsr,#$30
mov command,#FlReset ;сброс SMC
call @comload
rst_busy jnb r_b_pin,rst_busy

retp


;***********************Names of files*********************************

org $500
TestInfo
dw $dd,$f2,$ee,$20,$f1,$ee,$ee,$e1,$f9,$e5,$ed,$e8,$e5,$20,$e1,$fb
dw $eb,$ee,$20,$f1,$ee,$e7,$e4,$e0,$ed,$ee,$20,$e4,$eb,$ff,$20,$f2
dw $e5,$f1,$f2,$e8,$f0,$ee,$e2,$e0,$ed,$e8,$ff,$20,$ef,$f0,$ee,$e3
dw $f0,$e0,$ec,$ec,$fb,$20,$f0,$e0,$e1,$ee,$f2,$fb,$20,$f1,$20,$46
dw $6c,$61,$73,$68,$20,$4d,$65,$6d,$6f,$72,$79,$20,$43,$61,$72,$64
dw $20,$20,$d2,$f3,$f0,$f7,$e8,$ed,$f1,$ea,$e8,$ec,$20,$c4,$ec,$e8
dw $f2,$f0,$e8,$e5,$ec,$2e,$20,$d4,$e8,$f0,$ec,$e0,$20,$22,$c2,$e5
dw $f0,$e1,$e0,$22,$2e,$20,$20,$31,$31,$3a,$30,$30,$2e,$20,$38,$2e
dw $35,$2e,$32,$30,$30,$32,$20,$e3,$23,$23,$23,$23,$23,$23,$23,$23
dw $54,$48,$49,$53,$20,$4d,$45,$53,$53,$41,$47,$45,$20,$57,$41,$53
dw $20,$43,$52,$45,$41,$54,$45,$44,$20,$42,$59,$20,$54,$55,$52,$43
dw $48,$49,$4e,$53,$4b,$49,$59,$20,$44,$4d,$49,$54,$52,$49,$59,$20
dw $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20
dw $20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20
dw $2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a
dw $2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a,$2a


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru