⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pni_11096.txt

📁 pni11096驱动源代码。。。应用与凌阳单片机
💻 TXT
字号:
一个使用io模拟SPI的例子

//======================================================
// 文件名称: 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



模拟主机输出:
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



模拟主机输入:  
  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 
 
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -