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

📄 spi.s

📁 使用RC531读卡芯片读取二代身份证的模块软件设计部分
💻 S
字号:
	.module SPI.c
	.area text
	.dbfile SPI.c
	.dbfunc e SPI0Init _SPI0Init fV
_SPI0Init::
	.dbline -1
	.dbline 25
; //[SPI.c]IO模拟SPI---------------------------------------------------------*
; //本文件包含:                                                              *
; //    (1)SPI0Init      : SPI0初始化                                        *
; //    (2)SPI0SLAVECOM  : SPI0从机通信                                      *
; //    (3)SPI1Init      : SPI1初始化                                        *
; //    (4)SPI1MASTERCOM : SPI1主机通信                                      *
; //硬件连接:                                                                *
; //    (1)SPI0使用PTA口与外部控制芯片通信                                   *
; //    (2)SPI1使用PTD口与射频基站芯片MF RC531通信                           *
; //-------------------------------------------------------------------------*
; //头文件
; #include "SPI.h"         //SPI函数头文件
; 
; //函数
; //SPI0Init:----------------------------------------------------------------*
; //功能:SPI0通信初始化函数,定义为SPI从机                                    *
; //参数:无                                                                  *
; //返回:无                                                                  *
; //#define SPI0_SS    3          //从机选择引脚位                           *
; //#define SPI0_SCK   2          //时钟引脚                                 *
; //#define SPI0_MOSI  1          //主出从入                                 *
; //#define SPI0_MISO  0          //主入从出                                 *
; //-------------------------------------------------------------------------*
; void SPI0Init()
; {
	.dbline 28
;     //定义接口数据方向
;     //设定SPI0_SS引脚为下降沿中断
;     DisableKBint();               //屏蔽键盘中断(IMASKK = 1)
	bset #1,0x16
	.dbline 29
;     KBIER |= (1 << SPI0_SS);      //引脚中断使能
	bset #3,0x17
	.dbline 30
;     KBSCR |= (1 << 2);            //清除键盘中断请求(ACKK = 1)
	bset #2,0x16
	.dbline 32
;        
;     SPI0_D &= ~(1 << SPI0_SCK);   //时钟信号
	bclr #2,0x4
	.dbline 34
;     
;     SPI0_D &= ~(1 << SPI0_MOSI);  //主出从入
	bclr #1,0x4
	.dbline 36
;     
;     SPI0_D |= (1 << SPI0_MISO);   //主入从出
	bset #0,0x4
	.dbline 37
;     SPI0_P |= (1 << SPI0_MISO);   //初始化为高
	bset #0,0
	.dbline -2
L1:
	.dbline 0 ; func end
	rts
	.dbend
	.dbfunc e SPI0SLAVECOM _SPI0SLAVECOM fc
;         redata -> 0,X
;        datalen -> 1,X
;        snddata -> 4,X
_SPI0SLAVECOM::
	.dbline -1
	ais #-2
	tsx
	.dbline 51
;     
; }
; 
; //SPI0SLAVECOM:------------------------------------------------------------*
; //功能:SPI0从机通信程序                                                    *
; //参数:snddata-发送数据                                                    *
; //返回:接收数据                                                            *
; //#define SPI0_SS    3          从机选择引脚位                             *
; //#define SPI0_SCK   2          时钟引脚                                   *
; //#define SPI0_MOSI  1          主出从入                                   *
; //#define SPI0_MISO  0          主入从出                                   *
; //-------------------------------------------------------------------------*
; INT8U SPI0SLAVECOM(INT8U snddata)
; {
	.dbline 55
;     INT8U redata;     //接收数据
;     INT8U datalen;    //数据长度
;     
;     datalen = 0x08;   //每次发送8位
	lda #8
	sta 1,X
	.dbline 58
;     
;     //发送数据字节最高位上线
;     if((snddata & (1 << 7 )) == 0x00)
	lda 4,X
	bit #-128
	bne L3
	.dbline 59
;     {
	.dbline 60
;         SPI0_P &= ~(1 << SPI0_MISO);    //置低电平
	bclr #0,0
	.dbline 61
;     }
	bra L6
L3:
	.dbline 63
;     else
;     {
	.dbline 64
;         SPI0_P |= (1 << SPI0_MISO);     //置高电平
	bset #0,0
	.dbline 65
;     }
	bra L6
X0:
	.dbline 69
;     
;     //判断片选信号是否选中(低电平)
;     while(((SPI0_P & (1 << SPI0_SS)) == 0x00) && datalen)
;     {
L8:
	.dbline 72
L9:
	.dbline 72
;         //从机选中
;         //检测SCK时钟信号,空闲低电平,高电平为产生跳变
;         while ((SPI0_P & (1 << SPI0_SCK)) == 0x00);     //为低电平则等待
	brclr #2,0,L8
	.dbline 76
; 
;         //SCK时钟高电平时操作        
;         //读MOSI
;         if((SPI0_P & (1 << SPI0_MOSI)) == 0x00)
	brset #1,0,L11
	.dbline 77
;         {
	.dbline 78
;             redata &= ~(1 << (datalen - 1));     //低电平            
	lda 1,X
	sub #1
	mov #1,*__r2
	and #7
	beq X2
X1:
	lsl *__r2
	dbnza X1
X2:
	mov *__r2,*__r0
	com *__r0
	lda ,X
	and *__r0
	sta ,X
	.dbline 79
;         }
	bra L12
L11:
	.dbline 81
;         else
;         {
	.dbline 82
;             redata |= 1 << (datalen - 1 );       //高电平            
	lda 1,X
	sub #1
	mov #1,*__r2
	and #7
	beq X4
X3:
	lsl *__r2
	dbnza X3
X4:
	lda ,X
	ora *__r2
	sta ,X
	.dbline 83
;         }
L12:
	.dbline 86
;         
;         //写MISO      
;         if(datalen > 1)
	lda 1,X
	cmp #1
	bls L18
	.dbline 87
;         {
	.dbline 88
;             if((snddata & (1 << (datalen - 2 ))) == 0x00)
	sub #2
	mov #1,*__r2
	and #7
	beq X6
X5:
	lsl *__r2
	dbnza X5
X6:
	lda 4,X
	and *__r2
	bne L15
	.dbline 89
;             {
	.dbline 90
;                 SPI0_P &= ~(1 << SPI0_MISO);     //置低电平
	bclr #0,0
	.dbline 91
;             }
	bra L18
L15:
	.dbline 93
;             else
;             {
	.dbline 94
;                 SPI0_P |= (1 << SPI0_MISO);      //置高电平
	bset #0,0
	.dbline 95
;             }
	.dbline 96
;         }
L17:
	.dbline 98
L18:
	.dbline 98
	brset #2,0,L17
	.dbline 100
	dec 1,X
	.dbline 101
L6:
	.dbline 68
	brset #3,0,L20
	lda 1,X
	bne L9
L20:
	.dbline 103
;         
;         while ((SPI0_P & (1 << SPI0_SCK)) != 0x00);     //等待恢复为空闲低电平
;         
;         datalen--;                                      //继续下一位操作           
;     }//while
;     
;     return redata;  //返回
	lda ,X
	.dbline -2
L2:
	ais #2
	.dbline 0 ; func end
	rts
	.dbsym l redata 0 c
	.dbsym l datalen 1 c
	.dbsym l snddata 4 c
	.dbend
	.dbfunc e SPI1Init _SPI1Init fV
_SPI1Init::
	.dbline -1
	.dbline 118
; } 
; 
; 
; 
; //SPI1Init:----------------------------------------------------------------*
; //功能:SPI1通信初始化函数,定义为SPI主机                                    *
; //参数:无                                                                  *
; //返回:无                                                                  *
; //#define SPI1_SS    7          //从机选择引脚位                           *
; //#define SPI1_SCK   6          //时钟引脚                                 *
; //#define SPI1_MOSI  5          //主出从入                                 *
; //#define SPI1_MISO  4          //主入从出                                 *
; //-------------------------------------------------------------------------*
; void SPI1Init()
; {
	.dbline 122
;     //定义引脚功能
; 
;     //1.从机选择    
;     SPI1_D |= (1 << SPI1_SS);     //输出引脚
	bset #7,0x7
	.dbline 123
;     SPI1_P |= (1 << SPI1_SS);     //初始化为高
	bset #7,0x3
	.dbline 126
;     
;     //2.时钟信号   
;     SPI1_D |= (1 << SPI1_SCK);    //输出引脚   
	bset #6,0x7
	.dbline 127
;     SPI1_P &= ~(1 << SPI1_SCK);   //初始化为低
	bclr #6,0x3
	.dbline 131
;    
;      
;     //3.主出从入    
;     SPI1_D |= (1 << SPI1_MOSI);   //输出引脚
	bset #5,0x7
	.dbline 132
;     SPI1_P |= (1 << SPI1_MOSI);   //初始化为高
	bset #5,0x3
	.dbline 135
;     
;     //4.主入从出  
;     SPI1_D &= ~(1 << SPI1_MISO);   //输入引脚    
	bclr #4,0x7
	.dbline -2
L21:
	.dbline 0 ; func end
	rts
	.dbend
	.dbfunc e SPI1MASTERCOM _SPI1MASTERCOM fc
;         redata -> 0,X
;        datalen -> 1,X
;              i -> 2,X
;        snddata -> 5,X
_SPI1MASTERCOM::
	.dbline -1
	ais #-3
	tsx
	.dbline 150
;     //SPI1_P &= ~(1 << SPI1_MISO);   //初始化为低
; 
; }
; 
; //SPI1MASTERCOM:-----------------------------------------------------------*
; //功能:SPI1主机通信程序                                                    *
; //参数:snddata-发送数据                                                    *
; //返回:接收数据                                                            *
; //#define SPI1_SS    7          //从机选择引脚位                           *
; //#define SPI1_SCK   6          //时钟引脚                                 *
; //#define SPI1_MOSI  5          //主出从入                                 *
; //#define SPI1_MISO  4          //主入从出                                 *
; //-------------------------------------------------------------------------*
; INT8U SPI1MASTERCOM(INT8U snddata)
; {
	.dbline 155
;     INT8U redata;     //接收数据
;     INT8U datalen;    //数据长度
;     INT8U i;
;     
;     datalen = 0x08;   //每次发送8位    
	lda #8
	sta 1,X
	.dbline 158
;     
;     //操作8位
;     for(i = 0; i < datalen; i++)
	clr 2,X
	bra L26
L23:
	.dbline 159
;     {
	.dbline 161
;         //先将MOSI数据上线,高位优先
;         if((snddata & (1 << (datalen - 1 - i ))) == 0x00)
	lda 1,X
	sub #1
	sub 2,X
	mov #1,*__r2
	and #7
	beq X8
X7:
	lsl *__r2
	dbnza X7
X8:
	lda 5,X
	and *__r2
	bne L27
	.dbline 162
;         {
	.dbline 163
;             SPI1_P &= ~(1 << SPI1_MOSI);    //置低电平
	bclr #5,0x3
	.dbline 164
;         }
	bra L28
L27:
	.dbline 166
;         else
;         {
	.dbline 167
;             SPI1_P |= (1 << SPI1_MOSI);      //置高电平
	bset #5,0x3
	.dbline 168
;         } 
L28:
	.dbline 171
;               
;         //读MISO数据
;         if((SPI1_P & (1 << SPI1_MISO)) == 0x00)
	brset #4,0x3,L29
	.dbline 172
;         {
	.dbline 173
;             redata &= ~(1 << (datalen - 1 - i));     //低电平            
	lda 1,X
	sub #1
	sub 2,X
	mov #1,*__r2
	and #7
	beq X10
X9:
	lsl *__r2
	dbnza X9
X10:
	mov *__r2,*__r0
	com *__r0
	lda ,X
	and *__r0
	sta ,X
	.dbline 174
;         }
	bra L30
L29:
	.dbline 176
;         else
;         {
	.dbline 177
;             redata |= 1 << (datalen -1 - i);         //高电平            
	lda 1,X
	sub #1
	sub 2,X
	mov #1,*__r2
	and #7
	beq X12
X11:
	lsl *__r2
	dbnza X11
X12:
	lda ,X
	ora *__r2
	sta ,X
	.dbline 178
;         }       
L30:
	.dbline 181
	bset #6,0x3
	.dbline 182
	NOP
	.dbline 183
	bclr #6,0x3
	.dbline 184
L24:
	.dbline 158
	inc 2,X
L26:
	.dbline 158
	lda 2,X
	cmp 1,X
	blo L23
	.dbline 186
;                     
;         //SPI1_SCK空闲时为低电平,通信时置高
;         SPI1_P |= (1 << SPI1_SCK); 
;         asm("NOP");
;         SPI1_P &= ~(1 << SPI1_SCK);    
;     }//for 
;         
;     return redata;
	lda ,X
	.dbline -2
L22:
	ais #3
	.dbline 0 ; func end
	rts
	.dbsym l redata 0 c
	.dbsym l datalen 1 c
	.dbsym l i 2 c
	.dbsym l snddata 5 c
	.dbend

⌨️ 快捷键说明

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