本帖最后由 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。如果以前存取(读或写操作均可)的地址为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
|