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

📄 spi.lis

📁 使用RC531读卡芯片读取二代身份证的模块软件设计部分
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module SPI.c
                        .area text
 0000                   .dbfile SPI.c
 0000                   .dbfunc e SPI0Init _SPI0Init fV
 0000           _SPI0Init::
 0000                   .dbline -1
 0000                   .dbline 25
 0000           ; //[SPI.c]IO模拟SPI---------------------------------------------------------*
 0000           ; //本文件包含:                                                              *
 0000           ; //    (1)SPI0Init      : SPI0初始化                                        *
 0000           ; //    (2)SPI0SLAVECOM  : SPI0从机通信                                      *
 0000           ; //    (3)SPI1Init      : SPI1初始化                                        *
 0000           ; //    (4)SPI1MASTERCOM : SPI1主机通信                                      *
 0000           ; //硬件连接:                                                                *
 0000           ; //    (1)SPI0使用PTA口与外部控制芯片通信                                   *
 0000           ; //    (2)SPI1使用PTD口与射频基站芯片MF RC531通信                           *
 0000           ; //-------------------------------------------------------------------------*
 0000           ; //头文件
 0000           ; #include "SPI.h"         //SPI函数头文件
 0000           ; 
 0000           ; //函数
 0000           ; //SPI0Init:----------------------------------------------------------------*
 0000           ; //功能:SPI0通信初始化函数,定义为SPI从机                                    *
 0000           ; //参数:无                                                                  *
 0000           ; //返回:无                                                                  *
 0000           ; //#define SPI0_SS    3          //从机选择引脚位                           *
 0000           ; //#define SPI0_SCK   2          //时钟引脚                                 *
 0000           ; //#define SPI0_MOSI  1          //主出从入                                 *
 0000           ; //#define SPI0_MISO  0          //主入从出                                 *
 0000           ; //-------------------------------------------------------------------------*
 0000           ; void SPI0Init()
 0000           ; {
 0000                   .dbline 28
 0000           ;     //定义接口数据方向
 0000           ;     //设定SPI0_SS引脚为下降沿中断
 0000           ;     DisableKBint();               //屏蔽键盘中断(IMASKK = 1)
 0000 1216              bset #1,0x16
 0002                   .dbline 29
 0002           ;     KBIER |= (1 << SPI0_SS);      //引脚中断使能
 0002 1617              bset #3,0x17
 0004                   .dbline 30
 0004           ;     KBSCR |= (1 << 2);            //清除键盘中断请求(ACKK = 1)
 0004 1416              bset #2,0x16
 0006                   .dbline 32
 0006           ;        
 0006           ;     SPI0_D &= ~(1 << SPI0_SCK);   //时钟信号
 0006 1504              bclr #2,0x4
 0008                   .dbline 34
 0008           ;     
 0008           ;     SPI0_D &= ~(1 << SPI0_MOSI);  //主出从入
 0008 1304              bclr #1,0x4
 000A                   .dbline 36
 000A           ;     
 000A           ;     SPI0_D |= (1 << SPI0_MISO);   //主入从出
 000A 1004              bset #0,0x4
 000C                   .dbline 37
 000C           ;     SPI0_P |= (1 << SPI0_MISO);   //初始化为高
 000C 1000              bset #0,0
 000E                   .dbline -2
 000E           L1:
 000E                   .dbline 0 ; func end
 000E 81                rts
 000F                   .dbend
 000F                   .dbfunc e SPI0SLAVECOM _SPI0SLAVECOM fc
 000F           ;         redata -> 0,X
 000F           ;        datalen -> 1,X
 000F           ;        snddata -> 4,X
 000F           _SPI0SLAVECOM::
 000F                   .dbline -1
 000F A7FE              ais #-2
 0011 95                tsx
 0012                   .dbline 51
 0012           ;     
 0012           ; }
 0012           ; 
 0012           ; //SPI0SLAVECOM:------------------------------------------------------------*
 0012           ; //功能:SPI0从机通信程序                                                    *
 0012           ; //参数:snddata-发送数据                                                    *
 0012           ; //返回:接收数据                                                            *
 0012           ; //#define SPI0_SS    3          从机选择引脚位                             *
 0012           ; //#define SPI0_SCK   2          时钟引脚                                   *
 0012           ; //#define SPI0_MOSI  1          主出从入                                   *
 0012           ; //#define SPI0_MISO  0          主入从出                                   *
 0012           ; //-------------------------------------------------------------------------*
 0012           ; INT8U SPI0SLAVECOM(INT8U snddata)
 0012           ; {
 0012                   .dbline 55
 0012           ;     INT8U redata;     //接收数据
 0012           ;     INT8U datalen;    //数据长度
 0012           ;     
 0012           ;     datalen = 0x08;   //每次发送8位
 0012 A608              lda #8
 0014 E701              sta 1,X
 0016                   .dbline 58
 0016           ;     
 0016           ;     //发送数据字节最高位上线
 0016           ;     if((snddata & (1 << 7 )) == 0x00)
 0016 E604              lda 4,X
 0018 A580              bit #-128
 001A 2604              bne L3
 001C                   .dbline 59
 001C           ;     {
 001C                   .dbline 60
 001C           ;         SPI0_P &= ~(1 << SPI0_MISO);    //置低电平
 001C 1100              bclr #0,0
 001E                   .dbline 61
 001E           ;     }
 001E 205B              bra L6
 0020           L3:
 0020                   .dbline 63
 0020           ;     else
 0020           ;     {
 0020                   .dbline 64
 0020           ;         SPI0_P |= (1 << SPI0_MISO);     //置高电平
 0020 1000              bset #0,0
 0022                   .dbline 65
 0022           ;     }
 0022 2057              bra L6
 0024           X0:
 0024                   .dbline 69
 0024           ;     
 0024           ;     //判断片选信号是否选中(低电平)
 0024           ;     while(((SPI0_P & (1 << SPI0_SS)) == 0x00) && datalen)
 0024           ;     {
 0024           L8:
 0024                   .dbline 72
 0024           L9:
 0024                   .dbline 72
 0024           ;         //从机选中
 0024           ;         //检测SCK时钟信号,空闲低电平,高电平为产生跳变
 0024           ;         while ((SPI0_P & (1 << SPI0_SCK)) == 0x00);     //为低电平则等待
 0024 0500FD            brclr #2,0,L8
 0027                   .dbline 76
 0027           ; 
 0027           ;         //SCK时钟高电平时操作        
 0027           ;         //读MOSI
 0027           ;         if((SPI0_P & (1 << SPI0_MOSI)) == 0x00)
 0027 02001A            brset #1,0,L11
 002A                   .dbline 77
 002A           ;         {
 002A                   .dbline 78
 002A           ;             redata &= ~(1 << (datalen - 1));     //低电平            
 002A E601              lda 1,X
 002C A001              sub #1
 002E 6E0100            mov #1,*__r2
 0031 A407              and #7
 0033 2704              beq X2
 0035           X1:
 0035 3800              lsl *__r2
 0037 4BFC              dbnza X1
 0039           X2:
 0039 4E0000            mov *__r2,*__r0
 003C 3300              com *__r0
 003E F6                lda ,X
 003F B400              and *__r0
 0041 F7                sta ,X
 0042                   .dbline 79
 0042           ;         }
 0042 2013              bra L12
 0044           L11:
 0044                   .dbline 81
 0044           ;         else
 0044           ;         {
 0044                   .dbline 82
 0044           ;             redata |= 1 << (datalen - 1 );       //高电平            
 0044 E601              lda 1,X
 0046 A001              sub #1
 0048 6E0100            mov #1,*__r2
 004B A407              and #7
 004D 2704              beq X4
 004F           X3:
 004F 3800              lsl *__r2
 0051 4BFC              dbnza X3
 0053           X4:
 0053 F6                lda ,X
 0054 BA00              ora *__r2
 0056 F7                sta ,X
 0057                   .dbline 83
 0057           ;         }
 0057           L12:
 0057                   .dbline 86
 0057           ;         
 0057           ;         //写MISO      
 0057           ;         if(datalen > 1)
 0057 E601              lda 1,X
 0059 A101              cmp #1
 005B 2319              bls L18
 005D                   .dbline 87
 005D           ;         {
 005D                   .dbline 88
 005D           ;             if((snddata & (1 << (datalen - 2 ))) == 0x00)
 005D A002              sub #2
 005F 6E0100            mov #1,*__r2
 0062 A407              and #7
 0064 2704              beq X6
 0066           X5:
 0066 3800              lsl *__r2
 0068 4BFC              dbnza X5
 006A           X6:
 006A E604              lda 4,X
 006C B400              and *__r2
 006E 2604              bne L15
 0070                   .dbline 89
 0070           ;             {
 0070                   .dbline 90
 0070           ;                 SPI0_P &= ~(1 << SPI0_MISO);     //置低电平
 0070 1100              bclr #0,0
 0072                   .dbline 91
 0072           ;             }
 0072 2002              bra L18
 0074           L15:
 0074                   .dbline 93
 0074           ;             else
 0074           ;             {
 0074                   .dbline 94
 0074           ;                 SPI0_P |= (1 << SPI0_MISO);      //置高电平
 0074 1000              bset #0,0
 0076                   .dbline 95
 0076           ;             }
 0076                   .dbline 96
 0076           ;         }
 0076           L17:
 0076                   .dbline 98
 0076           L18:
 0076                   .dbline 98
 0076 0400FD            brset #2,0,L17
 0079                   .dbline 100
 0079 6A01              dec 1,X
 007B                   .dbline 101
 007B           L6:
 007B                   .dbline 68
 007B 060004            brset #3,0,L20
 007E E601              lda 1,X
 0080 26A2              bne L9
 0082           L20:

⌨️ 快捷键说明

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