📄 spi.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 + -