本帖最后由 51黑黑黑 于 2016-3-4 00:46 編輯
PL2101芯片中文資料
直序擴頻,半雙工異步調制解調器 二相相移鍵控,120KHz載頻,帶寬15KHz,傳輸速率500 bps 接收靈敏度:50mVRMS(500bps) 15位偽碼長度,可編程同步捕獲門限 上電復位、電壓監測電路及看門狗定時器; 內建高靈敏度放大器及四象限乘法器 I2C串行通信接口; 可編程實時鐘(秒/分/時/日/月/星期/年)(掉電后電池維護) 32Bytes SRAM(掉電后電池電池維護) 單 5V供電,I/O口帶 4000V ESD 保護; 發射功率0.5w,單級傳輸距離≥1000m; 抗干擾能力:抗20倍功率的噪聲,抗衰減:-80dB; 工業級溫度標準: -40oC ~85oC 數字/模擬混合0.5μm的CMOS集成電路工藝,SOP28表貼封裝; PL2101管角定義圖
 
概述 PL2101 是專為電力線通訊網絡設計的半雙工異步調制解調器。它僅由單一的5V 電源供電,以及一個外部的接口電路與電力線耦合。PL2101除具備基本的通訊控制功能外,還內置了五種常用的功能電路:實時鐘電路,32Bytes SRAM,電壓監測,看門狗定時器及復位電路,它們通過標準的I2C接口與外部的微處理器相聯,其中實時鐘與32 Bytes SRAM在主電源掉電的情況下可由3V備用電池供電繼續保持工作。PL2101 是特別針對中國電力網惡劣的環境所研制開發的低壓電力線載波通信芯片。由于采用了直接序列擴頻、數字信號處理、直接數字頻率合成等新技術,并采用大規模數字/模擬混合0.5μmCMOS 工藝制作,所以在抗干擾及抗衰落性能以及國內外同類產品性能價格比等方面有著出眾的表現。
管腳描述
1
| VFB
| 內部限幅放大器反相輸入端(外接0.1uF電容至GNDA)
| 2
| FLTi
| 混頻信號輸出。內部混頻器輸出的信號由此管腳輸出進入外部陶瓷濾波器
| 3
| Ref2
| 內部基準電壓源自舉端(外接10M電阻至VDDA)
| 4
| Ref1
| 內部電壓比較器調整端
| 5
| Dout
| 內部限幅放大器輸出監測端
| 6
| WDI
| 看門狗計數器清零輸入端。當WDI持續436mS以上無高低電平變化,將導致看門狗計數器溢出復位
| 7
| SCL
| I2C串行總線時鐘輸入端
| 8
| SDA
| I2C串行總線數據輸入/輸出端。
| 9
| ?/R
| 半雙工收發控制輸入端。(高電平收/低電平發)
| 10
| RXD_TXD
| 半雙工數據收發輸入/輸出端
| 11
| HEAD
| 數據同步端
| 12
| RESET
| 上電復位及看門狗計數器溢出復位輸出端(高電平有效,持續時間218mS)。當電源電壓低于4.3V時,RESET腳持續輸出高電平
| 13/14
| XT2o/XT2i
| 時鐘晶體振蕩器輸入/輸出端。XT2o、XT2i分別為片內反相放大器的輸入端和輸出端,外接晶體可以組成晶體振蕩器。PL2101主振蕩器所需時鐘頻率為32.768KHz。電路連接如圖所示,為使振蕩器工作更加可靠,電容C1 一般用3pF,C2的取值可在3-6pF之間選擇。
| 15
| VBAT
| 備用電源輸入端(可接3V-3.6V鋰電池)
| 16
| VDDD
| 數字部分電源, 5.0V
| 17
| PSK_OUT
| 數字信號發送輸出端。(驅動能力大于16mA)
| 18
| GNDD
| 數字地
|
19/20
| XT1o/XT1i
| 9.6MHz主晶體振蕩器輸入/輸出端。XT1o、XT1i分別為片內反相放大器的輸入端和輸出端,外接晶體可以組成晶體振蕩器。PL2101主振蕩器所需時鐘頻率為 9.6MHz。電路連接如圖所示,為使振蕩器工作更加可靠,電容C1 一般用30pF,C2的取值可在30-68pF之間選擇。若使用外部時鐘,可直接從XT1i輸入9.6MHz的時鐘信號。
| 21
| CLK600
| 600KHz本振輸出端。該管腳輸出600KHz方波信號,作為外接模擬混頻器MC3357/MC3361的一本振信號,它與SIGin輸入的120KHz信號混頻出480KHz的中頻信號以便陶瓷濾波器進行帶通濾波(當用戶使用內部模擬混頻器時,該引腳懸空)
| 22
| GNDA
| 模擬地
| 23
| SIGin
| 模擬信號輸入,50mV– 800mV(120KHz)
| 24
| VDDA
| 模擬部分電源, 4.8 – 5.0V
| 25
| VFA
| 外接0.1uF電容至GNDA
| 26
| PFo
| 電源掉電指示輸出端。PL2101除提供內部電源電壓監測/復位電路外還額外提供一個模擬電壓比較器,它的一個輸入端接片內的2.5V電壓基準源, 另一個輸入端即CMP,它的輸出端即PFo
| 27
| CMP
| 電源掉電監測外部比較輸入端
| 28
| FLTo
| 濾波信號輸入。當混頻信號經過帶通濾波后由此管腳進入內部限幅放大器
| I2C接口時序:
1.管腳說明
① SDA串行地址/數據輸入/輸出端 這是一個雙向傳輸端,用于傳輸地址和數據進入PL2101,以及從 PL2101 發送數據至外部 MCU 或其它控制器件。對于一般的數據傳輸,僅在SCL為低期間SDA才可以變化。在SCL為高期間變化,留給指示 START(開始)和 STOP(停止)條件。
② SCL串行時鐘端
此為時鐘輸入端,用于同步進入 PL2101 和從 Pl2101 發出的數據。
2.I2C時序描述
PL2101 支持雙向兩線總線和數據傳輸協議。當器件處于傳送數據到總線狀態時,我們稱之為發送器,當器件處于接受數據狀態時則稱為接受器?偩必須由一個主器件控制,主器件可以是MCU 或其它設備,它產生串行時鐘(SCL),控制總線存取,并且產生開始位(START)和停止位(END),而 PL2101 作為從器件工作。主器件和從器件都能工作于發送器或者接受器的狀態,但何種方式有效由主器件決定。為明確起見,除非另作說明以后所指的從器件均代表PL2101。
① 總線數據傳輸開始/停止 l 總線不忙(A) —數據和時鐘線保持高 l 開始傳送數據(B) —當時鐘(SCL)為高,SDA線由高到底的變化將產生起始位(Start Bit),所有的命令必須在產生起始位以后進行。
l 停止數據傳送 —當時鐘(SCL)為高,SDA線由低到高的變化將產生停止位(End Bit),所有的命令必須在產生停止位以前結束。 ① 數據有效 l 在起始位后,時鐘信號的高電平周期期間,當數據線是穩定時,數據線的狀態表示數據線有效。 l 數據線上的數據改變必須發生在時鐘信號為低電平周期期間,每位數據需一個時鐘。 l 每次數據的傳輸必須在起始位后開始,在停止位前結束。在開始和停止條件之間數據字節的傳輸數目由主器件決定。 ② 輸出應答

l 在每一個字節被接收后,接受器件必須產生一個確認位(ACK)當接受器準備接收下一字節,或否定位(NACK)當接受器準備結束接收狀態。 l 主器件必須產生一個與此確認位相應的額外時鐘脈沖。 l 通過在相對應于確認位時鐘脈沖的高電平期間拉SDA線為穩定的低電平,可產生確認位(或置SDA線為穩定的高電平,產生否定位)。 l 若不在從器件輸出的最后一個字節中產生確認位,主器件必須發一個數據結束信號給從器件(即產生否定位)。在這種情況下,從器件會保持數據線為高電平,使得主器件能產生停止位以便結束本次總線數據傳輸。 ④ 從器件代碼
l 產生起始位以后,總線主器件必須對 PL2101 發送七位器件代碼(1011000)組成的從器件地址,以便選中PL2101 并使得總線上的其它從器件處于非選中狀態并讓出總線控制權。 l 從器件地址的第八位 R/W 位的狀態決定主器件對 PL2101 進行何種操作(讀或寫)。 PL2101 一直監視總線上與它相應的從器件地址,如果從器件地址相符并且器件不忙,則PL2101產生一個確認位。
操作 | | | |
1 0 1 1 0 0 0
1 0 1 1 0 0 0 |
1
0
|
⑤ 地址字節
l 地址字節是由主器件發出的八位地址碼,用來尋址PL2101 內部的存儲寄存器。 l PL2101 內部寄存器地址空間的分配如下
地址字節內容 | | 00000000—00011111(00H-1FH) | | | | | | | | | | | | | | | | | | | | PL2101 內部寄存器地址空間從 00H-FFH 共計 256 個字節,除上表所列的以外其余均為無效地址,對無效地址寫入的數據將會被丟棄,從無效地址讀出的數據沒有實際意義。為保持程序代碼的兼容性,我們建議不要使用無效地址(因為它可能會被PL210X系列的其它版本芯片使用),以便軟件可以被不加修改的直接移植到PL210X 系列的其它系統中。
⑥ 寫保護
l PL2101 上電復位后,寫操作是被禁止的( 4FH 字節的 bit7 被自動清零),整個地址空間內除寫保護字節可讀/寫尋址外,其余地址只能做讀尋址。 l 若要打開寫保護,需使寫入寫保護地址字節的數據最高位為1。 3.寫操作 寫單字節數據 l 在主器件發出起始位以后,主器件發送七位器件代碼,以及一位低電平的讀寫位到總線上,這指示PL2101 將被尋址,一個地址字節將跟在第九個時鐘周期由PL2101 產生的確認位之后。由主器件發送的地址字節會被寫入到 PL2101 的地址指針寄存器。 l 主器件接收來自 PL2101 的另一個確認信號以后,將數據字節發送到總線上,PL2101 接收它并將其寫入到被地址指針尋址的寄存器中。 l PL2101 再次發出確認信號,然后主器件產生停止位結束本次操作。 l 任何時候,如果從器件在應該發出確認信號時沒有給出確認應答,則表示PL2101 沒有正確接收到起始位并進入命令準備狀態,這需要主器件重新發送操作命令。 4.讀操作
① 讀當前地址內容 l PL2101 內部的地址指針寄存器保持被存取的最后一個數據字節的地址,并在片內自動加1。如果以前存。ㄗx或寫操作均可)的地址為n,下一個讀操作從 n 1 地址中讀出數據。但對于地址指針寄存器的加1操作相對與讀/寫時序是不同的,當主器件做連續讀操作時是先讀后加,連續寫操作時是先加后寫(第一個被寫入的數據字節在寫周期前沒有地址加操作)。 l 當 PL2101 接收到R/W位為1的情況下,PL2101 發送一個確認位并隨后送出8位數據字節,然后主器件不確認傳遞(產生 NACK),再發送停止位結束本次操作。 讀隨機地址內容
l 這種方式可以讓主器件讀取PL2101 片內任意地址的寄存器內容,要完成這種方式的讀操作需要首先設置片內地址指針寄存器,這可通過將地址字節作為寫操作的一部分送給PL2101來完成。 l 發送了地址字節后,主器件在確認位后面立即產生一個起始位,用這種方式結束寫操作并開始另一個讀操作。 l 主器件再次發出器件代碼,并使 R/W 位為“1”,PL2101 將發出確認位并隨后發送由上次地址寫操作設置的地址指針尋址的8位數據字節,然后主器件不確認傳遞(產生NACK),再產生一個停止位結束本次操作。 ③ 讀順序地址的內容

l 讀順序地址內容的方式與讀隨意地址內容的方式以相同的方式啟動,PL2101發送完第一個數據字節以后,主器件發出一個確認位(ACK),這樣 PL2101 將會發送下一個順序地址的8位數據字節,直至主器件發出NACK 或停止位。 l 為提供這種讀方式,PL2101 包含的地址指針寄存器在每次操作完成以后自動加1。 l 利用這一特性,可以在一次操作期間連續順序地讀出整個存儲器的內容。但不在有效地址空間內的數據字節會被FFH 取代。 片內寄存器地址/功能描述:
SRAM:
(00H-1FH)共計 32 個字節,在主電源掉電后可由備用電池繼續供電,保持數據不丟失。 實時鐘:
秒 (40H) 二進制(BIN) 表示,0-59 表示零秒至五十九秒。 分 (41H) 二進制(BIN) 表示,0-59 表示零分至五十九分。 時 (42H) 二進制(BIN) 表示,0-23 表示零點至二十三點。 日 (43H) 二進制(BIN) 表示,1-31 表示一號至三十一號。 月 (44H) 二進制(BIN) 表示,1-12 表示一月至十二月。 星期 (45H) 二進制(BIN) 表示,1-6 表示周一至周六,0 表示星期日。 年 (46H) 二進制(BIN) 表示,0-99 表示 2000 年至 2099 年。 特殊寄存器:
捕獲門限 (48H)擴頻偽碼同步捕獲門限,上電復位缺省值為30H。 寫 保 護 (4FH) 寫保護字節的最高位為“0”使能寫保護,禁止對整個地址空間(除寫保護字節本身)的寫操作,寫保護字節的最高位為“1” 取消寫保護。其它位保留供功能擴展使用。寫保護字節上電復位缺省值為30H。 對PL2000A/PL2101芯片的寫操作步驟 a 置R/〒為“0”、發射態;
b 在HEAD對應引腳產生中斷時,將發送數據的比特移位到RXD_TXD管腳;
c 等待下一次HEAD中斷,返回b;
d 直到發送數據發送結束;
e 置R/〒為“1”、恢復接收態;
對PL2000A/PL2101芯片的讀操作步驟:
a置R/〒為“1”、接收態;
b 在HEAD對應引腳產生中斷時,將RXD_TXD管腳比特數據移位到C并保存;
c 等待下一次HEAD中斷,返回b;
d 直到按規約接收一次完整幀;
e 進行數據處理。
同步接收數據過程:
* R_T為“1”、接收態,HEAD發生下降沿產生中斷后,將RXD_TXD狀態讀入緩沖字節; * 在16Bit的滑動窗口中搜索同步幀,當搜索到0x09、0xAF同步幀頭后,表示已經進入同步狀態; * 隨后數據為通訊數據體,接收數據每8Bit 依次還原為一個有效字節數據,由規約進 解釋,直至接收完成。
下面介紹PL2000A/PL2101電力載波芯片接收、發射測試例程 電路圖
電力載波電路圖如下:

主程序循環檢測1AH單元是否=”F”,并等待中斷接收載波數據,收到數據后,把RXD_TXD_BYTE=1AH載波收發標志置成”F”,主程序再向主機(pc)發送數據.此例程需要2臺機器配合使用,這一臺做為載波接收機,另一臺作為載波發射機,向它發送數據,它收到后通過串口發送給微機,
R_T BIT P1.7; R/〒為“0”、發射態;為“1”、接收態; RXD_TXD BIT P1.6
HEAD BIT 0b2h;INT0
ROM_SDABIT 0B5H;;;
ROM_SCLBIT 0B6H;;;
RXD_TXD_BYTEEQU 1AH ;載波收發標志 TR_RC_BUF_1 EQU 30H BIT_SEND_CNT EQU 1CH TMP_SEND_BYTE EQU 1DH BYTE_SEND_CNT EQU 1EH HEAD_WORD_L EQU 1FH;同步字低位字節 HEAD_WORD_H EQU 14H READ_BUF EQU 15H T_NOR_BIT BIT 17H ;發送普通數據標志 T_END_BIT BIT 18H
ORG 0000H
AJMP MAIN
ORG 0003H
LJMP TRANCIEVE;中斷接收載波數據
ORG 001BH
RETI
ORG 0023H
LJMPS ;接收數據轉S
ORG 0030h
MAIN: MOVSP,#60H ;設堆棧指針
MOV IE,#10011101B ;
MOV IP,#00011000B
SETB IT1 ;下降沿有效
SETB IE1 ;外部中斷1
MOV A,#21H
MOV 89H,A ;TMOD定時器1工作方式2,8位可重裝,定時器0工作方式1,16位定時器
MOV A,#50H ;設串行口模式1
MOV 98H,A ;送串行控制SCON
MOV 8BH,#0EBH ;給定時器1賦值6M=F3,1200波特率,0.833毫秒/位,12M=E8H,9.6=EBH
MOV 8DH,#0EBH ;給定時器0賦值6M=F3,1200波特率,0.833毫秒/位,12M=E8H
SETB TR1
SETB R_T
Q: MOV A,#0FFH
MOV R2,#15 ;清數據區
MOV R0,#21H
QING:MOV@R0,A
INC R0
DJNZ R2,QING
MOV 30H,#09H
MOV31H,#0AFH MOV A,#55H
MOV R2,#40 ;清數據區
MOV R0,#32H
QING1:MOV@R0,A ;清數據區
INC R0
DJNZ R2,QING1
MOV HEAD_WORD_L,#0
MOV HEAD_WORD_H,#0
MOV BIT_SEND_CNT,#9
MOV TMP_SEND_BYTE,#0FFH
MOV TR_RC_BUF_1,#21H ;發送、接收數據緩沖區首址
MOV BYTE_SEND_CNT,#40 ;接收數據長度
ACALLINIT_PL2000A
MOV RXD_TXD_BYTE,#'R'
MAIN1: LCALL RDOG;喂狗
MOV A,RXD_TXD_BYTE; 1AH ;載波收發標志
XRL A,#'F';接收完,轉換狀態,同時通知主程序接收完畢F=46
JZ ZBEND;向主機發數據,否則等待接收數據
AJMP MAIN1
ZBEND :ACALLFPC ;串口發送數據到主機
AJMPMAIN1
INIT_PL2000A: ;檢查PL2000A/PL2101的捕獲門限是否正確,錯誤復位靠上電置初值
SETB RXD_TXD
SETB R_T ; R/〒為“1”、接收態
SETB HEAD; HEAD發生下降沿產生中斷后,將 RXD_TXD狀態讀入緩沖字節
MOV R0,#READ_BUF
MOV B,#1
MOV R1,#0B1H ;讀命令
MOV R2,#48H ;PL2000A/PL2101的捕捉門限地址
LCALL RDOG
ACALL RD_X ;讀取1個字節
MOV A,@R0
CJNE A,#30H,EER
SETB RXD_TXD
SETB R_T
RET
EER: CLR EA ;錯誤復位
SJMP EER
ORG 0100H;中斷接收,R/〒為“1”、接收態;在HEAD對應引腳產生中斷時,將RXD_TXD 管腳比特數據移位到C并保存;等待下一次HEAD中斷,直到按規約接收一次完整幀;進行數據處理。
TRANCIEVE:
PUSH PSW ;TRANCIEVE
PUSH ACC
MOV A,R0
PUSH ACC
MOV A,R1
PUSH ACC
LCALL RDOG
MOV A,RXD_TXD_BYTE
CJNE A,#'R',TRANS ;;;;;;;R=52,A=R是接收,否則發送
LCALL RECEIVE_DATA ;接收
RETURN_TR_RC: POP ACC
MOV R1,A
POP ACC
MOV R0,A
POP ACC
POP PSW
RETI
TRANS: LCALL TRANS_BEGIN ;當RX_TX=0時,轉發射
SJMP RETURN_TR_RC
RECEIVE_DATA:
SETB RXD_TXD
SETB R_T
MOV C,RXD_TXD ;讀R_T狀態入Cflag
MOV A,HEAD_WORD_L ;讀入同步字低位字節
RLCA ;ACC帶CF右環移位
MOV HEAD_WORD_L,A ;回寫同步字低位字節
TB: JB 20H.0,REC_NOR ;R_HEAD_BIT=1,幀同步已被接收,進入正常接收狀態
MOV A,HEAD_WORD_H
SUBB A,#9
JNC TB1
MOV A,HEAD_WORD_L
CJNE A,#0FFH,RC ;當HEAD_WORD_H=0x09,接收到的高字節不符合,返回
INC HEAD_WORD_H
SETB P1.0
SETB P1.3
AJMP RETURN_RC
在16Bit的滑動窗口中搜索同步幀,當搜索到 0x09、0xAF同步幀頭后,表示已經進入同步狀態;
TB1: MOV A,HEAD_WORD_L;
CJNE A,#0AFH,RETURN_RC
MOV HEAD_WORD_H ,#0
SETB 20H.0 ;符合同步字節,設置進入正常數據接受態
CLR p1.0
MOV BIT_SEND_CNT,#9 ;設置比特位計數器
RET ;此次接收完成
REC_NOR: DJNZ BIT_SEND_CNT,return_rc;一個字節未接收完,繼續接收,否則按字節處理
MOV A,TR_RC_BUF_1 ;讀入接收緩沖區基址
MOV R1,A ;
MOV @R1,HEAD_WORD_L ;將接收到的數據存入相應的RAM
INC TR_RC_BUF_1
MOV A,TR_RC_BUF_1 ;讀入接收緩沖區基址30H,59h-30h=29h=41d
CJNEA,#59H,RETURN_OTHERS ;數據尚未全部接收完,繼續接收
MOV RXD_TXD_BYTE,#'F' ;接收完,轉換狀態,同時通知主程序接收完畢F=46
MOVTR_RC_BUF_1,#30H ;接收完40個數據,恢復發送數據緩沖區起始地址
CLR 20H.0
LCALL INIT_PL2000A ;初始化PL2000A/PL2101
SETB P1.0
RET
RETURN_OTHERS: MOV BIT_SEND_CNT,#9 ;設置比特位計數器
MOV A, HEAD_WORD_L
XRL A,#55H
JNZ AAA
CLR P1.3
AAA: MOV HEAD_WORD_L,#0 ;接收完一個字節后清0
ACALL YSA
RC: MOV HEAD_WORD_H ,#0
RET
RETURN_RC: RET
ORG 0300h
TRANS_BEGIN: CLR R_T ; 置R/〒為“0”、發射態;
SETBP1.5 ;合上繼電器 TRAN1: MOVA,TR_RC_BUF_1 ;=30H
CJNEA,#59H,TRANS_DATA ;
MOV TR_RC_BUF_1,#21H ;發送完40個數據,恢復發送數據緩沖區起始地址
TRANS_ERR:
MOV RXD_TXD_BYTE,#'R' ;發射結束,置接收標志
SETB R_T
SETB P1.0
SETB P1.3
RETURN_TR: RET
TRANS_DATA: DJNZ BIT_SEND_CNT,TRANS_GOON ;沒發送完8位繼續
TR_NOR_1: MOV BIT_SEND_CNT,#9 ;每字節8個bit
INC TR_RC_BUF_1
MOV A,TR_RC_BUF_1
MOV R0,A
MOV TMP_SEND_BYTE,@R0 ;讀入欲發送數據
CLR P1.0
RET
TRANS_GOON: MOV A,TMP_SEND_BYTE
RLC A
MOV RXD_TXD,C ;發送當前BIT
MOV TMP_SEND_BYTE,A
CLRP1.5 ;斷開繼電器
RET
S: PUSHACC;串口通信程序,可以和微機通信
PUSH PSW
PUSH DPH
PUSH DPL
MOV R2,#03H
MOV R1,#10H
MOV R0,#1CH
; CLR 0AFH
SETB REN ;允許接收
S2: JNB RI, $ ;查詢接收,RI=0等待,RI=1時收到
CLR RI
MOV A, SBUF ;讀輸入緩沖區
MOV @R1,A
DEC R1
LCALL ASC
SWAP A
MOV 1FH, A
INC R1
LCALL ASC
ORL 1FH, A
MOV @R0,1FH
INC R0
INC R1
DJNZ R2,S2
ACALLRDOG ;關閉看門狗
MOV A,1CH
XRL A, #0AH
JNZ S1
MOV RXD_TXD_BYTE,#'S'
AJMP SEND
S1: MOV A,1CH
XRL A, #0BH
JNZ SEND
MOV RXD_TXD_BYTE,#'R'
SEND: POP DPL
POP DPH
POP PSW
POP ACC
SETB 0AFH
RETI
ASC: MOV A, @R1
CLR C
SUBB A, #30H
MOV R6, A
SUBB A, #0AH
JC ASCEND
XCH A, R6
SUBB A, #07H
MOV R6, A
ASCEND:MOV A, R6
RET
FPC: MOV R7,#41;串口發送數據到主機(PC)
MOV R1,#30H
CLR P1.0
CLREA
FSD: CLR REN
MOV A, @R1
ANL A, #0F0H
SWAP A
MOV SBUF, A
JNB TI, $
CLR TI
MOV A, @R1
ANL A, #0FH
MOV SBUF, A
JNB TI, $
CLR TI
INC R1
ACALL RDOG
ACALL YSB
DJNZ R7,FSD
SETB REN
SETB EA
SETB P1.0
MOV RXD_TXD_BYTE,#'R'
RET
ORG 0600H
;子程序1:打開寫保護子程序
WR_OPEN:
MOV 40H,#80H
MOV R0,#40H
MOV R1,#0B0H
MOV R2,#4FH
MOV B,#1
LCALL WR_X
RET
;;子程序2:關閉寫保護子程序
WR_CLOSE:
MOV 40H,#30H
MOV R0,#40H
MOV R1,#0B0H
MOV R2,#4FH
MOV B,#1
LCALL WR_X
RET
;子程序3:讀同步門限子程序,同步門限默認值為30H
RD_SNY:
MOV R0,#40H
MOV R1,#0B1H
MOV R2,#48H
MOV B,#1
LCALL RD_X
RET
;子程序4:讀時間子程序
RD_TIME:
MOV R0,#40H
MOV R1,#0B1H
MOV R2,#40H
MOV B,#7
LCALL RD_X
RET
;子程序5:從PL2000A/PL2101中讀多字節數據子程序
;(R2) 數據在PL2000A/PL2101中的首地址
;(R0) 讀取數據在RAM中的存放地址
;(B) 需讀數據個數
;(R1) 讀命令字
RD_X:
LCALL I2C_START
MOV A,R1
CLR ACC.0
LCALL WRITE_BYTE
JC RDA_RET
MOV A,R2
LCALL WRITE_BYTE
JC RDA_RET
LCALL I2C_START
MOV A,R1
LCALL WRITE_BYTE
JC RDA_RET
DJNZ B,RDA_S1
SJMP READ_ONE
RDA_S1:
LCALL READ_BYTE
MOV @R0,A
INC R0
CLR ROM_SDA
SETB ROM_SCL
NOP
CLR ROM_SCL
SETB ROM_SDA
DJNZ B,RDA_S1
READ_ONE:
LCALL READ_BYTE
MOV @R0,A
SETB ROM_SDA
SETB ROM_SCL
RDA_RET:
LCALL I2C_STOP
NOP
NOP
RET
ORG 0700H
;子程序6:向PL2000A/PL2101寫數據子程序
;(R2) 數據在PL2000A/PL2101中的首地址
;(R0) 寫數據在RAM中的地址
;(B)需寫數據個數
;(R1) 寫命令字
WR_X:
LCALL I2C_START
MOV A,R1
LCALL WRITE_BYTE
JC WR_RET
MOV A,R2
LCALL WRITE_BYTE
JC WR_RET
MOV A,@R0
LCALL WRITE_BYTE
JC WR_RET
INC R0
INC R2
LCALL I2C_STOP
DJNZ B, WR_X
WR_RET:
NOP
NOP
RET
;子程序7:向PL2000A/PL2101送起始位子程序
I2C_START:
CLR ROM_SCL
NOP
SETB ROM_SDA
NOP
SETB ROM_SCL
NOP
CLR ROM_SDA
RET
;子程序8:向PL2000A/PL2101送停止位子程序
I2C_STOP:
CLR ROM_SCL
NOP
CLR ROM_SDA
NOP
SETB ROM_SCL
NOP
SETB ROM_SDA
NOP
NOP
CLR ROM_SCL
NOP
CLR ROM_SDA
RET
;子程序9:從PL2000A/PL2101讀一字節子程序
READ_BYTE:
MOV R7,#08H
RD_B1:
SETB ROM_SDA
NOP
SETB ROM_SCL
NOP
MOV C,ROM_SDA
RLC A
CLR ROM_SCL
DJNZ R7,RD_B1
RET
;子程序10:向PL2000A/PL2101寫一字節子程序
WRITE_BYTE:
MOV R7,#08H
WR_B1:
CLR ROM_SCL
RLC A
MOV ROM_SDA,C
NOP
SETB ROM_SCL
DJNZ R7,WR_B1
CLR ROM_SCL
NOP
SETB ROM_SDA
NOP
SETB ROM_SCL
MOV C,ROM_SDA
CLR ROM_SCL
RET
YS: MOV 7EH, #0FFH;延時 ;7E---4EH
ACALL RDOG
YS1: MOV 7FH, #0FFH ;7F---4FH
YS2: DJNZ 7FH, YS2
DJNZ 7EH, YS1
RET
YSA: MOV 7FH, #0FFH
YSA1: DJNZ 7FH, YSA1
RET
YSB: MOV 7EH, #50H
YSB1: DJNZ7EH, YSB1
RET
RDOG: SETB P1.7
NOP
NOP
NOP
NOP
CLR P1.7
NOP
NOP
NOP
NOP
RET
ORG 07F0H
DB0FFH,0FFH,0FFH,0FFH,0FFH,09H,0AFH
END
|