全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1534
推到 Plurk!
推到 Facebook!

SPDAT、SPSTA、SPCON之相關問題

尚未結案
mysmile0918
一般會員


發表:1
回覆:1
積分:0
註冊:2009-10-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-10-22 13:01:40 IP:163.21.xxx.xxx 訂閱


先看程式

[cord] ;***************************************
; 程序开始
;***************************************
ORG 0000H
LJMP Start
ORG 0003H
LJMP INT0
;SPI初始化
Start: MOV SPCON,#SPCON_WORD
LCALL Delay
;初始化ENC28J60
Init: LCALL InitE60
; 设置堆栈指针
SpSet: MOV A,#SP_BASE
MOV SP,A
SETB EA
SETB EX0
SETB IT0
;等待中断
Wait: AJMP Wait
;************************************
; ENC28J60初始化
;************************************
;检测ESTAT.CLKRDY位
InitE60:MOV A,#ESTAT_ADDR
MOV SPDAT,A
LCALL ChkSPIF
LCALL Delay
MOV SPDAT,A
LCALL ChkSPIF
MOV A,SPDAT
ANL A,#01H
JZ InitE60
;设置以太网中断允许寄存器EIE
MOV A,#EIE_ADDR
MOV SPDAT,A
LCALL ChkSPIF
MOV A,#EIE_WORD
MOV SPDAT,A
LCALL ChkSPIF
;设置以太网控制寄存器ECON1
MOV A,#ECON1_ADDR
MOV SPDAT,A
LCALL ChkSPIF
MOV A,#ECON1_WORD
MOV SPDAT,A
LCALL ChkSPIF
;************************************
; 检测SPI传输是否完成
;************************************
ChkSPIF:MOV A,#10000000B
ANL A,SPSTA
Judge: JZ Judge
MOV SPSTA,#0
RET

;這是程式片段,完整請看附件(包含EQU定址等等)
;
==========================
[/cord]
這是要寫在8051上的程式, 用的是基本的組議語言

問題在於,"SPDAT"、"SPSTA"、"SPCON"這三個指令 似乎沒辦法使用

已知資料是8位元、單一位元傳輸,即8位元是1位元、1位元丟給ENC28J60這顆IC



想出來的方案是用另一種串列阜設定

範例如下

==========================

START: MOV TMOD, #20H
ANL PCON, #3FH
MOV TH1, #FDH
SETB TR1
MOV SCON, #01010000B

MOV P2, #FFH
LOOP: MOV A, P2
MOV SBUF, A
JNB RI, $
CLR RI
MOV P0, SBUF
CLR TI
JMP LOOP

===========================

用在8051自己跟自己傳輸資料(P2為指撥開關輸入,P0 LED顯示狀況

但想不出怎麼應用

可否請各路高手提示、示範,小弟不才,在此深重感謝

若有表達不清楚的地方煩請指出,謝謝

附加檔案:4adfe7343cb7a_1.txt
編輯記錄
mysmile0918 重新編輯於 2009-10-22 13:04:11, 註解 無‧
mysmile0918 重新編輯於 2009-10-22 14:47:02, 註解 無‧
mymj
版主


發表:132
回覆:486
積分:608
註冊:2002-10-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-10-22 19:59:34 IP:203.67.xxx.xxx 訂閱
問題在於,"SPDAT"、"SPSTA"、"SPCON"這三個指令
MOV SPDAT,A
MOV SPDAT,A
這都是存取記憶體
所以"SPDAT"、"SPSTA"、"SPCON"你要先定義才能使用

mymj


===================引 用 mysmile0918 文 章===================


先看程式

[cord] ;***************************************
; 程序开始
;***************************************
ORG 0000H
LJMP Start
ORG 0003H
LJMP INT0
;SPI初始化
Start: MOV SPCON,#SPCON_WORD
LCALL Delay
;初始化ENC28J60
Init: LCALL InitE60
; 设置堆栈指针
SpSet: MOV A,#SP_BASE
MOV SP,A
SETB EA
SETB EX0
SETB IT0
;等待中断
Wait: AJMP Wait
;************************************
; ENC28J60初始化
;************************************
;检测ESTAT.CLKRDY位
InitE60:MOV A,#ESTAT_ADDR
MOV SPDAT,A
LCALL ChkSPIF
LCALL Delay
MOV SPDAT,A
LCALL ChkSPIF
MOV A,SPDAT
ANL A,#01H
JZ InitE60
;设置以太网中断允许寄存器EIE
MOV A,#EIE_ADDR
MOV SPDAT,A
LCALL ChkSPIF
MOV A,#EIE_WORD
MOV SPDAT,A
LCALL ChkSPIF
;设置以太网控制寄存器ECON1
MOV A,#ECON1_ADDR
MOV SPDAT,A
LCALL ChkSPIF
MOV A,#ECON1_WORD
MOV SPDAT,A
LCALL ChkSPIF
;************************************
; 检测SPI传输是否完成
;************************************
ChkSPIF:MOV A,#10000000B
ANL A,SPSTA
Judge: JZ Judge
MOV SPSTA,#0
RET

;這是程式片段,完整請看附件(包含EQU定址等等)
;
==========================
[/cord]
這是要寫在8051上的程式, 用的是基本的組議語言

問題在於,"SPDAT"、"SPSTA"、"SPCON"這三個指令 似乎沒辦法使用

已知資料是8位元、單一位元傳輸,即8位元是1位元、1位元丟給ENC28J60這顆IC



想出來的方案是用另一種串列阜設定

範例如下

==========================

START: MOV TMOD, #20H
ANL PCON, #3FH
MOV TH1, #FDH
SETB TR1
MOV SCON, #01010000B

MOV P2, #FFH
LOOP: MOV A, P2
MOV SBUF, A
JNB RI, $
CLR RI
MOV P0, SBUF
CLR TI
JMP LOOP

===========================

用在8051自己跟自己傳輸資料(P2為指撥開關輸入,P0 LED顯示狀況

但想不出怎麼應用

可否請各路高手提示、示範,小弟不才,在此深重感謝

若有表達不清楚的地方煩請指出,謝謝

mysmile0918
一般會員


發表:1
回覆:1
積分:0
註冊:2009-10-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-10-26 14:18:22 IP:163.21.xxx.xxx 訂閱
SPDAT的定義大致上有個方向了,謝謝

那還有幾個問題



在SPCON上的設定

----------------------------------------------------------------------------------------------------
SPCON_WORD EQU 01010110B;同步時鍾FCLK PERIPH/8,使能串口,使能SS,主模式,空閑狀??低電平,上升沿移入數據
----------------------------------------------------------------------------------------------------

實在看不明白這些名詞

這樣的設定是否能請給小弟詳細說明?

以下是小弟的假想

;-----------------------------

以書籍上的內容

在SCON串列阜控制暫存器裡

01010110相對的"假想"設定如下

====b7===b6===b5===b4====b3===b2====b1===b0===
===SM0==SM1==SM2==REN==TB8==RB8===TI==RI====
====0====1=====0====1=====0====1=====1===0====

以SM0與SM1為01來說

模式為8位元UART,可變的包率

問題就在後面的010110

書籍上的設定似乎給的說明太過簡略

在範例中的TB8、RB8、TI幾乎都是以0設定

所以猜測SPCON的數據另有他意

另外


[code c#]

ChkSPIF:

MOV A, #10000000B
ANL A, SPSTA

Judge:

JZ Judge
MOV SPSTA, #0
RET


[/code]

僅給SPSTA一個 SPSAT EQU XXH 是否可行

上網查了很多資料,也思考了很久

若思考方向錯誤,懇請給予指點

IC都買了,電路也接了,實在很想玩出結果阿~~~



小弟不才,求個知識,謝謝

感恩!
編輯記錄
mysmile0918 重新編輯於 2009-10-26 14:21:40, 註解 無‧
mysmile0918 重新編輯於 2009-10-26 14:22:22, 註解 無‧
mysmile0918 重新編輯於 2009-10-26 14:23:53, 註解 無‧
系統時間:2024-05-07 5:22:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!