📄 spi.lis
字号:
.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 + -