📄 pni_driver.asm
字号:
//======================================================
// 文件名称: PNI_Driver.asm
// 功能描述: PNI_11096底层驱动程序
// 维护记录: 2007-12-20 v1.0
// 注意事项:
//======================================================
// IO port control registers
.DEFINE P_IOA_Data 0x7000
.DEFINE P_IOA_Buffer 0x7001
.DEFINE P_IOA_Dir 0x7002
.DEFINE P_IOA_Attrib 0x7003
.DEFINE P_IOA_Latch 0x7004
.DEFINE P_IOB_Data 0x7005
.DEFINE P_IOB_Buffer 0x7006
.DEFINE P_IOB_Dir 0x7007
.DEFINE P_IOB_Attrib 0x7008
.DEFINE PORTA 0 // PortA PortB选择
.if PORTA
// redefine the I/O port for PNI_11096
.DEFINE D_Port_Data P_IOA_Data // 端口
.DEFINE D_Port_Buffer P_IOA_Buffer
.DEFINE D_Port_Dir P_IOA_Dir
.DEFINE D_Port_Attrib P_IOA_Attrib
.else
.DEFINE D_Port_Data P_IOB_Data
.DEFINE D_Port_Buffer P_IOB_Buffer
.DEFINE D_Port_Dir P_IOB_Dir
.DEFINE D_Port_Attrib P_IOB_Attrib
.endif
.DEFINE DRDY 0x0100
.DEFINE RESET 0x0200
.DEFINE SSNOT 0x0400
.DEFINE MOSI 0x0800
.DEFINE MISO 0x1000
.DEFINE SCLK 0x2000
.CODE
M_Clr_IOPort: .macro
r1 = [D_Port_Buffer]
r1 &= 0x00ff
[D_Port_Buffer] = r1
.endm
M_Clr_RESET: .macro
r1 = [D_Port_Buffer]
r1 &= ~RESET
[D_Port_Buffer] = r1
.endm
M_Set_RESET: .macro
r1 = [D_Port_Buffer]
r1 |= RESET
[D_Port_Buffer] = r1
.endm
M_Clr_SSNOT: .macro
r1 = [D_Port_Buffer]
r1 &= ~SSNOT
[D_Port_Buffer] = r1
.endm
M_Set_SSNOT: .macro
r1 = [D_Port_Buffer]
r1 |= SSNOT
[D_Port_Buffer] = r1
.endm
M_Clr_MOSI: .macro
r1 = [D_Port_Buffer]
r1 &= ~MOSI
[D_Port_Buffer] = r1
.endm
M_Set_MOSI: .macro
r1 = [D_Port_Buffer]
r1 |= MOSI
[D_Port_Buffer] = r1
.endm
M_Clr_SCLK: .macro
r1 = [D_Port_Buffer]
r1 &= ~SCLK
[D_Port_Buffer] = r1
.endm
M_Set_SCLK: .macro
r1 = [D_Port_Buffer]
r1 |= SCLK
[D_Port_Buffer] = r1
.endm
//======================================================
// 汇编格式:_F_PNI_11096_Init
// C 格式:void F_PNI_11096_Init(void);
// 实现功能:端口初始化
// 入口参数:无
// 出口参数:无
//======================================================
.PUBLIC _F_PNI_11096_Init
_F_PNI_11096_Init:
r1 = [D_Port_Dir]
r1 = r1 | (RESET + SSNOT + MOSI + SCLK) // 用到的IO口设置为输出
[D_Port_Dir] = r1
r1 = [D_Port_Attrib]
r1 = r1 | (RESET + SSNOT + MOSI + MISO + SCLK) // 用到的IO口设置为通向输出
[D_Port_Attrib] = r1
retf
//======================================================
// 汇编格式:_F_PNI_11096_Read
// C 格式:int F_PNI_11096_Read(unsigned int op);
// 实现功能:读x或y轴数据
// 入口参数:操作码
// 出口参数:x或y轴数据
//======================================================
.PUBLIC _F_PNI_11096_Read
_F_PNI_11096_Read:
push bp to [sp]
bp = sp + 4
r3 = [bp] // 得到函数参数
r3 &= 0x00ff
M_Clr_IOPort
M_Clr_SSNOT
M_Clr_RESET
nop
M_Set_RESET
nop
M_Clr_RESET // 复位PNI11096
r2 = 8
?SendCMD:
test r3, 0x80
jnz ?DataHigh
M_Clr_MOSI
jmp ?Next
?DataHigh:
M_Set_MOSI
?Next:
M_Set_SCLK
nop
M_Clr_SCLK
r3 = r3 lsl 1
r2 -= 1
jnz ?SendCMD
M_Clr_MOSI
?Wait: // 等待指南针模块返回数据
r2 = 0x0001
[0x7012] = r2 // 清看门狗
r2 = [D_Port_Data]
test r2, DRDY
jz ?Wait
r2 = 16
r4 = 0
?Read: // 读取16位数据
M_Set_SCLK
r3 = [D_Port_Data]
test r3, MISO
jnz ?SetHigh
jmp ?Save
?SetHigh:
r4 |= 1
?Save:
r4 = r4 lsl 1
M_Clr_SCLK
r2 -= 1
jnz ?Read
r1 = r4
pop bp from [sp]
retf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -