📄 jb8_io~1.lst
字号:
(0002) //本文件包含: *
(0003) // (1)SPI0Init : SPI0初始化 *
(0004) // (2)SPI0SLAVECOM : SPI0从机通信 *
(0005) // (3)SPI1Init : SPI1初始化 *
(0006) // (4)SPI1MASTERCOM : SPI1主机通信 *
(0007) //硬件连接: *
(0008) // (1)SPI0使用PTA口与外部控制芯片通信 *
(0009) // (2)SPI1使用PTD口与射频基站芯片MF RC531通信 *
(0010) //-------------------------------------------------------------------------*
(0011) //头文件
(0012) #include "SPI.h" //SPI函数头文件
(0013)
(0014) //函数
(0015) //SPI0Init:----------------------------------------------------------------*
(0016) //功能:SPI0通信初始化函数,定义为SPI从机 *
(0017) //参数:无 *
(0018) //返回:无 *
(0019) //#define SPI0_SS 3 //从机选择引脚位 *
(0020) //#define SPI0_SCK 2 //时钟引脚 *
(0021) //#define SPI0_MOSI 1 //主出从入 *
(0022) //#define SPI0_MISO 0 //主入从出 *
(0023) //-------------------------------------------------------------------------*
(0024) void SPI0Init()
(0025) {
_SPI0Init:
DEAB 12 16 Bset 1,0x16
(0026) //定义接口数据方向
(0027) //设定SPI0_SS引脚为下降沿中断
(0028) DisableKBint(); //屏蔽键盘中断(IMASKK = 1)
(0029) KBIER |= (1 << SPI0_SS); //引脚中断使能
DEAD 16 17 Bset 3,0x17
(0030) KBSCR |= (1 << 2); //清除键盘中断请求(ACKK = 1)
DEAF 14 16 Bset 2,0x16
(0031)
(0032) SPI0_D &= ~(1 << SPI0_SCK); //时钟信号
DEB1 15 04 Bclr 2,0x04
(0033)
(0034) SPI0_D &= ~(1 << SPI0_MOSI); //主出从入
DEB3 13 04 Bclr 1,0x04
(0035)
(0036) SPI0_D |= (1 << SPI0_MISO); //主入从出
DEB5 10 04 Bset 0,0x04
(0037) SPI0_P |= (1 << SPI0_MISO); //初始化为高
DEB7 10 00 Bset 0,0x00
DEB9 81 rts
_SPI0SLAVECOM:
redata --> X+0
datalen --> X+1
snddata --> X+4
DEBA A7 FE aiS #-2
DEBC 95 tSX
(0038)
(0039) }
(0040)
(0041) //SPI0SLAVECOM:------------------------------------------------------------*
(0042) //功能:SPI0从机通信程序 *
(0043) //参数:snddata-发送数据 *
(0044) //返回:接收数据 *
(0045) //#define SPI0_SS 3 从机选择引脚位 *
(0046) //#define SPI0_SCK 2 时钟引脚 *
(0047) //#define SPI0_MOSI 1 主出从入 *
(0048) //#define SPI0_MISO 0 主入从出 *
(0049) //-------------------------------------------------------------------------*
(0050) INT8U SPI0SLAVECOM(INT8U snddata)
(0051) {
DEBD A6 08 ldA #8
DEBF E7 01 stA 1,X
(0052) INT8U redata; //接收数据
(0053) INT8U datalen; //数据长度
(0054)
(0055) datalen = 0x08; //每次发送8位
(0056)
(0057) //发送数据字节最高位上线
(0058) if((snddata & (1 << 7 )) == 0x00)
DEC1 E6 04 ldA 4,X
DEC3 A5 80 bit #-128
DEC5 26 04 bne 0xDECB
(0059) {
DEC7 11 00 Bclr 0,0x00
(0060) SPI0_P &= ~(1 << SPI0_MISO); //置低电平
(0061) }
DEC9 20 5B bra 0xDF26
(0062) else
(0063) {
DECB 10 00 Bset 0,0x00
(0064) SPI0_P |= (1 << SPI0_MISO); //置高电平
(0065) }
DECD 20 57 bra 0xDF26
(0066)
(0067) //判断片选信号是否选中(低电平)
(0068) while(((SPI0_P & (1 << SPI0_SS)) == 0x00) && datalen)
(0069) {
DECF 05 00FD BRclr 2,0x00,0xDECF
(0070) //从机选中
(0071) //检测SCK时钟信号,空闲低电平,高电平为产生跳变
(0072) while ((SPI0_P & (1 << SPI0_SCK)) == 0x00); //为低电平则等待
(0073)
(0074) //SCK时钟高电平时操作
(0075) //读MOSI
(0076) if((SPI0_P & (1 << SPI0_MOSI)) == 0x00)
DED2 02 001A BRset 1,0x00,0xDEEF
(0077) {
DED5 E6 01 ldA 1,X
DED7 A0 01 sub #1
DED9 6E 0142 mov #1,*__r2
DEDC A4 07 and #7
DEDE 27 04 beq 0xDEE4
DEE0 38 42 lsl *__r2
DEE2 4B FC dbnzA 0xDF26
DEE4 4E 4240 mov *__r2,*__r0
DEE7 33 40 com *__r0
DEE9 F6 ldA 0,X
DEEA B4 40 and *__r0
DEEC F7 stA 0,X
(0078) redata &= ~(1 << (datalen - 1)); //低电平
(0079) }
DEED 20 13 bra 0xDF02
(0080) else
(0081) {
DEEF E6 01 ldA 1,X
DEF1 A0 01 sub #1
DEF3 6E 0142 mov #1,*__r2
DEF6 A4 07 and #7
DEF8 27 04 beq 0xDEFE
DEFA 38 42 lsl *__r2
DEFC 4B FC dbnzA 0xDF40
DEFE F6 ldA 0,X
DEFF BA 42 orA *__r2
DF01 F7 stA 0,X
(0082) redata |= 1 << (datalen - 1 ); //高电平
(0083) }
DF02 E6 01 ldA 1,X
DF04 A1 01 cmp #1
DF06 23 19 bls 0xDF21
(0084)
(0085) //写MISO
(0086) if(datalen > 1)
(0087) {
DF08 A0 02 sub #2
DF0A 6E 0142 mov #1,*__r2
DF0D A4 07 and #7
DF0F 27 04 beq 0xDF15
DF11 38 42 lsl *__r2
DF13 4B FC dbnzA 0xDF57
DF15 E6 04 ldA 4,X
DF17 B4 42 and *__r2
DF19 26 04 bne 0xDF1F
(0088) if((snddata & (1 << (datalen - 2 ))) == 0x00)
(0089) {
DF1B 11 00 Bclr 0,0x00
(0090) SPI0_P &= ~(1 << SPI0_MISO); //置低电平
(0091) }
DF1D 20 02 bra 0xDF21
(0092) else
(0093) {
DF1F 10 00 Bset 0,0x00
(0094) SPI0_P |= (1 << SPI0_MISO); //置高电平
(0095) }
DF21 04 00FD BRset 2,0x00,0xDF21
(0096) }
(0097)
(0098) while ((SPI0_P & (1 << SPI0_SCK)) != 0x00); //等待恢复为空闲低电平
(0099)
(0100) datalen--; //继续下一位操作
DF24 6A 01 dec 1,X
(0101) }//while
DF26 06 0004 BRset 3,0x00,0xDF2D
DF29 E6 01 ldA 1,X
DF2B 26 A2 bne 0xDECF
(0102)
(0103) return redata; //返回
DF2D F6 ldA 0,X
DF2E A7 02 aiS #2
DF30 81 rts
(0104) }
(0105)
(0106)
(0107)
(0108) //SPI1Init:----------------------------------------------------------------*
(0109) //功能:SPI1通信初始化函数,定义为SPI主机 *
(0110) //参数:无 *
(0111) //返回:无 *
(0112) //#define SPI1_SS 7 //从机选择引脚位 *
(0113) //#define SPI1_SCK 6 //时钟引脚 *
(0114) //#define SPI1_MOSI 5 //主出从入 *
(0115) //#define SPI1_MISO 4 //主入从出 *
(0116) //-------------------------------------------------------------------------*
(0117) void SPI1Init()
(0118) {
_SPI1Init:
DF31 1E 07 Bset 7,0x07
(0119) //定义引脚功能
(0120)
(0121) //1.从机选择
(0122) SPI1_D |= (1 << SPI1_SS); //输出引脚
(0123) SPI1_P |= (1 << SPI1_SS); //初始化为高
DF33 1E 03 Bset 7,0x03
(0124)
(0125) //2.时钟信号
(0126) SPI1_D |= (1 << SPI1_SCK); //输出引脚
DF35 1C 07 Bset 6,0x07
(0127) SPI1_P &= ~(1 << SPI1_SCK); //初始化为低
DF37 1D 03 Bclr 6,0x03
(0128)
(0129)
(0130) //3.主出从入
(0131) SPI1_D |= (1 << SPI1_MOSI); //输出引脚
DF39 1A 07 Bset 5,0x07
(0132) SPI1_P |= (1 << SPI1_MOSI); //初始化为高
DF3B 1A 03 Bset 5,0x03
(0133)
(0134) //4.主入从出
(0135) SPI1_D &= ~(1 << SPI1_MISO); //输入引脚
DF3D 19 07 Bclr 4,0x07
DF3F 81 rts
_SPI1MASTERCOM:
redata --> X+0
datalen --> X+1
i --> X+2
snddata --> X+5
DF40 A7 FD aiS #-3
DF42 95 tSX
(0136) //SPI1_P &= ~(1 << SPI1_MISO); //初始化为低
(0137)
(0138) }
(0139)
(0140) //SPI1MASTERCOM:-----------------------------------------------------------*
(0141) //功能:SPI1主机通信程序 *
(0142) //参数:snddata-发送数据 *
(0143) //返回:接收数据 *
(0144) //#define SPI1_SS 7 //从机选择引脚位 *
(0145) //#define SPI1_SCK 6 //时钟引脚 *
(0146) //#define SPI1_MOSI 5 //主出从入 *
(0147) //#define SPI1_MISO 4 //主入从出 *
(0148) //-------------------------------------------------------------------------*
(0149) INT8U SPI1MASTERCOM(INT8U snddata)
(0150) {
DF43 A6 08 ldA #8
DF45 E7 01 stA 1,X
(0151) INT8U redata; //接收数据
(0152) INT8U datalen; //数据长度
(0153) INT8U i;
(0154)
(0155) datalen = 0x08; //每次发送8位
(0156)
(0157) //操作8位
(0158) for(i = 0; i < datalen; i++)
DF47 6F 02 clr 2,X
DF49 20 58 bra 0xDFA3
(0159) {
DF4B E6 01 ldA 1,X
DF4D A0 01 sub #1
DF4F E0 02 sub 2,X
DF51 6E 0142 mov #1,*__r2
DF54 A4 07 and #7
DF56 27 04 beq 0xDF5C
DF58 38 42 lsl *__r2
DF5A 4B FC dbnzA 0xDF9E
DF5C E6 05 ldA 5,X
DF5E B4 42 and *__r2
DF60 26 04 bne 0xDF66
(0160) //先将MOSI数据上线,高位优先
(0161) if((snddata & (1 << (datalen - 1 - i ))) == 0x00)
(0162) {
DF62 1B 03 Bclr 5,0x03
(0163) SPI1_P &= ~(1 << SPI1_MOSI); //置低电平
(0164) }
DF64 20 02 bra 0xDF68
(0165) else
(0166) {
DF66 1A 03 Bset 5,0x03
(0167) SPI1_P |= (1 << SPI1_MOSI); //置高电平
(0168) }
DF68 08 031C BRset 4,0x03,0xDF87
(0169)
(0170) //读MISO数据
(0171) if((SPI1_P & (1 << SPI1_MISO)) == 0x00)
(0172) {
DF6B E6 01 ldA 1,X
DF6D A0 01 sub #1
DF6F E0 02 sub 2,X
DF71 6E 0142 mov #1,*__r2
DF74 A4 07 and #7
DF76 27 04 beq 0xDF7C
DF78 38 42 lsl *__r2
DF7A 4B FC dbnzA 0xDFBE
DF7C 4E 4240 mov *__r2,*__r0
DF7F 33 40 com *__r0
DF81 F6 ldA 0,X
DF82 B4 40 and *__r0
DF84 F7 stA 0,X
(0173) redata &= ~(1 << (datalen - 1 - i)); //低电平
(0174) }
DF85 20 15 bra 0xDF9C
(0175) else
(0176) {
DF87 E6 01 ldA 1,X
DF89 A0 01 sub #1
DF8B E0 02 sub 2,X
DF8D 6E 0142 mov #1,*__r2
DF90 A4 07 and #7
DF92 27 04 beq 0xDF98
DF94 38 42 lsl *__r2
DF96 4B FC dbnzA 0xDFDA
DF98 F6 ldA 0,X
DF99 BA 42 orA *__r2
DF9B F7 stA 0,X
(0177) redata |= 1 << (datalen -1 - i); //高电平
(0178) }
DF9C 1C 03 Bset 6,0x03
(0179)
(0180) //SPI1_SCK空闲时为低电平,通信时置高
(0181) SPI1_P |= (1 << SPI1_SCK);
(0182) asm("NOP");
DF9E 9D nop
(0183) SPI1_P &= ~(1 << SPI1_SCK);
DF9F 1D 03 Bclr 6,0x03
(0184) }//for
DFA1 6C 02 inc 2,X
DFA3 E6 02 ldA 2,X
DFA5 E1 01 cmp 1,X
DFA7 25 A2 bcs 0xDF4B
(0185)
(0186) return redata;
DFA9 F6 ldA 0,X
DFAA A7 03 aiS #3
DFAC 81 rts
_RFRegRead:
ReData1 --> X+0
ReData2 --> X+1
SndData --> X+2
addr --> X+5
DFAD A7 FD aiS #-3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -