📄 d12ci.asm
字号:
#include "PDIUSBD12.h"
#include "defBF531.h"
.global ByteCntRxedFromUsbEP;
.section SECTION_Data; //8bit width, total size: 16K Byte
.align 4;
.byte2 ByteCntRxedFromUsbEP;
.section SECTION_Code2;
/************************************************************
** 函数名称: ReadChipID()
** 功能描述: 读取芯片ID
** 输 入: 无
** 输 出: 芯片的ID号,存于D12Data内
************************************************************/
.global ReadChipID;
ReadChipID:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
[ --SP ]=r1; //push r1
//read Chip ID
////write command byte
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0.l=0xFD;
w[p0]=r0.l;
call CmdOutPortB;
////read data byte 1
call InPortD; //Chip ID LOW byte
r0=[p0];
////read data byte 2
call InPortD; //Chip ID HIGH byte
r1=[p0];
//combine LOW & HIGH byte together
r1=r1<<8;
r0=r1|r0;
[p0]=r0; //Write it back to D12Data
r1=[ SP++ ]; //pop r1
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
ReadChipID.end:
/************************************************************
** 函数名称: SetAddressEnable()
** 功能描述: 设置地址/使能
** 输 入: INT8U bAddress: 地址
INT8U bEnable : 0 --- 禁止
1 --- 使能
** 输 出: 无
************************************************************/
.global SetAddressEnable;
SetAddressEnable:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
[ --SP ]=r1; //push r1
p0.l=lo(bAddress);
p0.h=hi(bAddress);
r1=[p0];
p0.l=lo(bEnable);
p0.h=hi(bEnable);
r0=[p0];
cc=r0==1;
if !cc jump AddressDisable;
r0=0x80;
r1=r1|r0;
AddressDisable:
//read interrupt register
////write command byte
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0.l=0xD0;
w[p0]=r0.l;
call CmdOutPortB;
////write data byte 1
p0.l=lo(D12Data);
p0.h=hi(D12Data);
w[p0]=r1.l;
call DataOutPortB;
r1=[ SP++ ]; //pop r1
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
SetAddressEnable.end:
/************************************************************
** 函数名称: SetEndpointEnable()
** 功能描述: 设置端点使能
** 输 入: bEnable : 0 --- 禁止
1 --- 允许
** 输 出: 无
************************************************************/
.global SetEndpointEnable;
SetEndpointEnable:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
///write command byte
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0.l=0xD8;
w[p0]=r0.l;
call CmdOutPortB;
//read variable bEnable
p0.l=lo(bEnable);
p0.h=hi(bEnable);
r0=[p0];
cc=r0==1;
if cc jump EndpointEnable;
r0=0;
EndpointEnable:
////write data byte 1
p0.l=lo(D12Data);
p0.h=hi(D12Data);
w[p0]=r0.l;
call DataOutPortB;
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
SetEndpointEnable.end:
/************************************************************
** 函数名称: ReadIntReg
** 功能描述: 读取中断寄存器值
** 输 入: 无
** 输 出: 中断寄存器值,存于D12Data
************************************************************/
.global ReadIntReg;
ReadIntReg:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
[ --SP ]=r1; //push r1
//read interrupt register
////write command byte
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0.l=0xF4;
w[p0]=r0.l;
call CmdOutPortB;
////read data byte 1
call InPortD; //Chip ID LOW byte
r0=[p0];
////read data byte 2
call InPortD; //Chip ID HIGH byte
r1=[p0];
//combine LOW & HIGH byte together
r1=r1<<8;
r0=r1|r0;
[p0]=r0; //Write it back to D12Data
r1=[ SP++ ]; //pop r1
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
ReadIntReg.end:
/************************************************************
** 函数名称: SelectEndpoint()
** 功能描述: 端点选择,将内部指针初始化到选择的缓冲区起始位置
** 输 入: bEndp: 端点索引号,取值0 ~ 5
** 输 出: 读出的1个字节,存于D12Data
************************************************************/
.global SelectEndpoint;
SelectEndpoint:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=[p0];
////write command byte
p0.l=lo(D12Data);
p0.h=hi(D12Data);
w[p0]=r0.l;
call CmdOutPortB;
////read 1 data byte
call InPortD;
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
SelectEndpoint.end:
/************************************************************
** 函数名称: ReadEndpointStatus()
** 功能描述: 读取端点状态
** 输 入: bEndp: 端点索引号,取值0 ~ 5
** 输 出: 端点状态, 存于D12Data
************************************************************/
.global ReadEndpointStatus;
ReadEndpointStatus:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
[ --SP ]=r1; //push r1
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=[p0];
r1=0x80;
r0=r0+r1;
////write command byte
p0.l=lo(D12Data);
p0.h=hi(D12Data);
w[p0]=r0.l;
call CmdOutPortB;
////read 1 data byte
call InPortD;
r1=[ SP++ ]; //pop r1
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
ReadEndpointStatus.end:
/************************************************************
** 函数名称: ReadLastTransactionStatus()
** 功能描述: 读取最后处理状态寄存器
** 输 入: bEndp: 端点索引号,取值0 ~ 5
** 输 出: 端点最后处理的状态,存于D12Data
************************************************************/
.global ReadLastTransactionStatus;
ReadLastTransactionStatus:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
[ --SP ]=r1; //push r1
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=[p0];
r1=0x40;
r0=r0+r1;
////write command byte
p0.l=lo(D12Data);
p0.h=hi(D12Data);
w[p0]=r0.l;
call CmdOutPortB;
////read 1 data byte
call InPortD;
r1=[ SP++ ]; //pop r1
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
ReadLastTransactionStatus.end:
/************************************************************
** 函数名称: SetEndpointStatus()
** 功能描述: 设置端点状态
** 输 入: bEndp: 端点索引号,取值0 ~ 5
bStalled: 状态值,0/1
** 输 出: 端点状态
************************************************************/
.global SetEndpointStatus;
SetEndpointStatus:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
[ --SP ]=r1; //push r1
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=[p0];
r1=0x40;
r0=r0+r1;
p0.l=lo(bStalled);
p0.h=hi(bStalled);
r1=[p0];
////write command byte
p0.l=lo(D12Data);
p0.h=hi(D12Data);
w[p0]=r0.l;
call CmdOutPortB;
////write 1 data byte
w[p0]=r1.l;
call DataOutPortB;
r1=[ SP++ ]; //pop r1
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
SetEndpointStatus.end:
/************************************************************
** 函数名称: SendResume()
** 功能描述: 传输恢复
** 输 入: 无
** 输 出: 无
************************************************************/
.global SendResume;
SendResume:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
////write command byte
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0.l=0xF6;
w[p0]=r0.l;
call CmdOutPortB;
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
SendResume.end:
/************************************************************
** 函数名称: ReadCurrentFrameNumber()
** 功能描述: 读取当前帧号
** 输 入: 无
** 输 出: 当前帧号,存于D12Data
************************************************************/
.global ReadCurrentFrameNumber;
ReadCurrentFrameNumber:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
[ --SP ]=r1; //push r1
////write command byte
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0.l=0xF5;
w[p0]=r0.l;
call CmdOutPortB;
call InPortD;
r0=[p0];
call InPortD;
r1=[p0];
r1=r1<<8;
r0=r0|r1;
[p0]=r0;
r1=[ SP++ ]; //pop r1
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
ReadCurrentFrameNumber.end:
/************************************************************
** 函数名称: ReadEndpoint()
** 功能描述: 读取端点数据
** 输 入: bEndp: 端点索引号,取值 0 ~ 5
bLen: 要读取的数据长度
* pBuf: 接收数据指针
** 输 出: 实际读得的字节数,存放于D12Data
************************************************************/
.global ReadEndpoint;
ReadEndpoint:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=p1; //push p1
[ --SP ]=p2; //push p2
[ --SP ]=r0; //push r0
[ --SP ]=r1; //push r1
[ --SP ]=r2; //push r2
p2=0;
call SelectEndpoint;
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0=[p0];
r1=D12_FULLEMPTY;
r0=r0&r1;
cc = r0 ==1;
if !cc jump ReadEndpoit_Exit;
////write command byte
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0.l=0xF0;
w[p0]=r0.l;
call CmdOutPortB;
////read data byte 1
call InPortD;
////read data byte 2
call InPortD;
r1.l=w[ p0 ];
//save actual length of the data packet into ByteCntRxedFromUsbEP
r0=0xff;
r1=r1&r0; //actual length of the data packet
p1.l=lo(ByteCntRxedFromUsbEP);
p1.h=hi(ByteCntRxedFromUsbEP);
w[p1]=r1;
p1.l=lo(bLen);
p1.h=hi(bLen);
r0=[p1]; //length the user want to read
r2=r1-r0;
cc=r2<0;
if cc jump RxData;
r1=r0;
RxData:
//load the buf pointer you want to store the rx data to
p1.l=lo(pBuf);
p1.h=hi(pBuf);
r0=[p1];
p1=r0;
p2 = r1;nop;nop;nop;nop;
lsetup(Loop_start1, Loop_end1) lc0=p2;
Loop_start1:
call InPortD;
r1.l=w[ p0 ];
w[ p1 ] = r1.l;
p1+=2;
Loop_end1:
nop;
ReadEndpoit_Exit:
[p0]=p2;
r2=[ SP++ ]; //pop r2
r1=[ SP++ ]; //pop r1
r0=[ SP++ ]; //pop r0
p2=[ SP++ ]; //pop p2
p1=[ SP++ ]; //pop p1
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
ReadEndpoint.end:
/************************************************************
** 函数名称: WriteEndpoint()
** 功能描述: 把数据写入端点
** 输 入: bEndp: 端点索引号,取值 0 ~ 5
bLen: 要写入的数据长度
* pBuf: 发送数据指针
** 输 出: 实际写入的字节数
************************************************************/
.global WriteEndpoint;
WriteEndpoint:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=p1; //push p1
[ --SP ]=p2; //push p2
[ --SP ]=r0; //push r0
[ --SP ]=r1; //push r1
[ --SP ]=r2; //push r2
p2=0;
call SelectEndpoint;
/*
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0=[p0];
r1=D12_FULLEMPTY;
r0=r0&r1;
cc = r0 ==1;
if !cc jump ReadEndpoit_Exit;
*/
////write command byte
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0.l=0xF0;
w[p0]=r0.l;
call CmdOutPortB;
////write data byte 1,always 0
r0=0;
[p0]=r0;
call DataOutPortB;
////write data byte 2, length of data u want to write
p1.l=lo(bLen);
p1.h=hi(bLen);
r1=[p1]; //length the user want to read
[p0]=r1;
call DataOutPortB;
//load the buf pointer you want to read the tx data from
p1.l=lo(pBuf);
p1.h=hi(pBuf);
r0=[p1];
p1=r0;
p2 = r1;nop;nop;nop;nop;
lsetup(Loop_start2, Loop_end2) lc0=p2;
Loop_start2:
r1.l=w[p1];
p1+=2;
w[p0]=r1.l;
call DataOutPortB;
Loop_end2:
nop;
//Validate IN buffer
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0=0xFA;
[p0]=r0;
call CmdOutPortB;
[p0]=p2;
r2=[ SP++ ]; //pop r2
r1=[ SP++ ]; //pop r1
r0=[ SP++ ]; //pop r0
p2=[ SP++ ]; //pop p2
p1=[ SP++ ]; //pop p1
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
WriteEndpoint.end:
/************************************************************
** 函数名称: AcknowledgeEndpoint()
** 功能描述: 应答Setup
** 输 入: bEndp: 端点索引号,取值 0 ~ 5
** 输 出: 无
************************************************************/
.global AcknowledgeEndpoint;
AcknowledgeEndpoint:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
call SelectEndpoint;
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0=0xF1;
[p0]=r0;
call CmdOutPortB;
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=[p0];
cc=r0==0;
if !cc jump AcknowledgeEndpoint_Exit;
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0=0xF2;
[p0]=r0;
call CmdOutPortB;
AcknowledgeEndpoint_Exit:
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
AcknowledgeEndpoint.end:
/************************************************************
** 函数名称: ClearBuf()
** 功能描述: 清指定端点的缓冲区(包括双缓冲区)
** 输 入: bEndp: 端点索引号,取值 0 ~ 5
** 输 出: 无
************************************************************/
.global ClearBuf;
ClearBuf:
[ --SP ] = RETS;
[ --SP ]=p0; //push p0
[ --SP ]=r0; //push r0
call SelectEndpoint;
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0=0xF2;
[p0]=r0;
call CmdOutPortB;
p0.l=lo(bEndp);
p0.h=hi(bEndp);
r0=[p0];
r1=3;
r0=r1-r0;
cc=r0<0;
if !cc jump Clear_Exit;
p0.l=lo(D12Data);
p0.h=hi(D12Data);
r0=0xF2;
[p0]=r0;
call CmdOutPortB;
Clear_Exit:
r0=[ SP++ ]; //pop r0
p0=[ SP++ ]; //pop p0
RETS = [ SP++ ];
rts;
ClearBuf.end:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -