📄 wx_mn.lst
字号:
0165 7F8E ANDI R24,0xFE
0166 BB88 OUT P18,R24
(0089) SpiWrite(WC); // Write config command写放配置命令
0167 2700 CLR R16
0168 DF8C RCALL _SpiWrite
(0090) for (i=0;i<RxTxConf.n;i++) // Write configration words 写放配置字
0169 2744 CLR R20
016A C009 RJMP 0x0174
(0091) {
(0092) SpiWrite(RxTxConf.buf[i]);
016B E08F LDI R24,0xF
016C E091 LDI R25,1
016D 2FE4 MOV R30,R20
016E 27FF CLR R31
016F 0FE8 ADD R30,R24
0170 1FF9 ADC R31,R25
0171 8100 LDD R16,0+Z
0172 DF82 RCALL _SpiWrite
0173 9543 INC R20
0174 9020010E LDS R2,0x10E
0176 1542 CP R20,R2
0177 F398 BCS 0x016B
(0093) //delayus(10);
(0094) }
(0095) CSN=1; // Disable Spi
0178 B388 IN R24,P18
0179 6081 ORI R24,1
017A BB88 OUT P18,R24
(0096) WriteTxAddress();
017B DFC8 RCALL _WriteTxAddress
(0097) }
017C 940E0527 CALL pop_gset1
017E 9508 RET
(0098)
(0099) /*******************************************************************************************/
(0100) //function SetTxMode(); 设置为发送模式
(0101) /*******************************************************************************************/
(0102) void SetTxMode(void)
(0103) {
(0104) TRX_CE=0;
_SetTxMode:
017F B382 IN R24,P12
0180 7E8F ANDI R24,0xEF
0181 BB82 OUT P12,R24
(0105) TX_EN=1;
0182 B382 IN R24,P12
0183 6480 ORI R24,0x40
0184 BB82 OUT P12,R24
(0106) Delay(1); // delay for mode change(>=650us)
0185 E001 LDI R16,1
(0107) }
0186 CF90 RJMP _Delay
(0108)
(0109) /*******************************************************************************************/
(0110) //function SetRxMode(); 设置为接收模式
(0111) /*******************************************************************************************/
(0112) void SetRxMode(void)
(0113) {
(0114) TX_EN=0;
_SetRxMode:
0187 B382 IN R24,P12
0188 7B8F ANDI R24,0xBF
0189 BB82 OUT P12,R24
(0115) TRX_CE=1;
018A B382 IN R24,P12
018B 6180 ORI R24,0x10
018C BB82 OUT P12,R24
(0116) Delay(1); // delay for mode change(>=650us)
018D E001 LDI R16,1
(0117) }
018E CF88 RJMP _Delay
_TxPacket:
i --> R20
TxBuf --> R22
018F 940E053B CALL push_gset2
0191 01B8 MOVW R22,R16
(0118)
(0119) //发送数据包
(0120) /*******************************************************************************************/
(0121) void TxPacket(unsigned char *TxBuf)
(0122) {
(0123) uchar i;
(0124)
(0125) CSN=0; // Spi enable for write a spi command
0192 B388 IN R24,P18
0193 7F8E ANDI R24,0xFE
0194 BB88 OUT P18,R24
(0126) SpiWrite(WTP); // Write payload command
0195 E200 LDI R16,0x20
0196 DF5E RCALL _SpiWrite
(0127) //for (i=0;i<TX_PW;i++)
(0128) for (i=0;i<RxTxConf.buf[4];i++)
0197 2744 CLR R20
0198 C007 RJMP 0x01A0
(0129) {
(0130) SpiWrite(TxBuf[i]); // Write 32 bytes Tx data
0199 2FE4 MOV R30,R20
019A 27FF CLR R31
019B 0FE6 ADD R30,R22
019C 1FF7 ADC R31,R23
019D 8100 LDD R16,0+Z
019E DF56 RCALL _SpiWrite
019F 9543 INC R20
01A0 90200113 LDS R2,0x113
01A2 1542 CP R20,R2
01A3 F3A8 BCS 0x0199
(0131) //delayus(10);
(0132) }
(0133) CSN=1; // Spi disable
01A4 B388 IN R24,P18
01A5 6081 ORI R24,1
01A6 BB88 OUT P18,R24
(0134) TRX_CE=1; // Set TRX_CE high,start Tx data transmission
01A7 B382 IN R24,P12
01A8 6180 ORI R24,0x10
01A9 BB82 OUT P12,R24
(0135) Delay(1); // while (DR!=1);
01AA E001 LDI R16,1
01AB DF6B RCALL _Delay
(0136) TRX_CE=0; // Set TRX_CE low
01AC B382 IN R24,P12
01AD 7E8F ANDI R24,0xEF
01AE BB82 OUT P12,R24
(0137) }
01AF 940E054B CALL pop_gset2
01B1 9508 RET
_RxPacket:
i --> R20
RxBuf --> R22
01B2 940E053B CALL push_gset2
01B4 01B8 MOVW R22,R16
(0138)
(0139) /*
(0140) *******************************************************************************************
(0141) * 读取数据包
(0142) * 返回值: 1-成功接收到数据 0-没有接收到数据
(0143) *******************************************************************************************
(0144) */
(0145) unsigned char RxPacket(unsigned char *RxBuf)
(0146) {
(0147) uchar i;
(0148) if (DR) //DR 高电平 有接收到数据
01B5 B380 IN R24,P10
01B6 9586 LSR R24
01B7 9586 LSR R24
01B8 9586 LSR R24
01B9 7081 ANDI R24,1
01BA F119 BEQ 0x01DE
(0149) {
(0150) TRX_CE=0; // Set nRF905 in standby mode
01BB B382 IN R24,P12
01BC 7E8F ANDI R24,0xEF
01BD BB82 OUT P12,R24
(0151) CSN=0; // Spi enable for write a spi command
01BE B388 IN R24,P18
01BF 7F8E ANDI R24,0xFE
01C0 BB88 OUT P18,R24
(0152) SpiWrite(RRP); // Read payload command
01C1 E204 LDI R16,0x24
01C2 DF32 RCALL _SpiWrite
(0153) //for (i = 0 ;i < RX_PW ;i++)
(0154) for (i = 0 ;i < RxTxConf.buf[3] ;i++)
01C3 2744 CLR R20
01C4 C007 RJMP 0x01CC
(0155) {
(0156) RxBuf[i]=SpiRead(); // Read data and save to buffer
01C5 DF0C RCALL _SpiRead
01C6 2FE4 MOV R30,R20
01C7 27FF CLR R31
01C8 0FE6 ADD R30,R22
01C9 1FF7 ADC R31,R23
01CA 8300 STD R16,0+Z
01CB 9543 INC R20
01CC 90200112 LDS R2,0x112
01CE 1542 CP R20,R2
01CF F3A8 BCS 0x01C5
(0157) //delayus(10);
(0158) }
(0159) CSN=1; // Disable spi
01D0 B388 IN R24,P18
01D1 6081 ORI R24,1
01D2 BB88 OUT P18,R24
(0160) while(DR);//||AM);
01D3 B380 IN R24,P10
01D4 9586 LSR R24
01D5 9586 LSR R24
01D6 9586 LSR R24
01D7 7081 ANDI R24,1
01D8 F7D1 BNE 0x01D3
(0161)
(0162) TRX_CE=1;
01D9 B382 IN R24,P12
01DA 6180 ORI R24,0x10
01DB BB82 OUT P12,R24
(0163)
(0164) return 1;
01DC E001 LDI R16,1
01DD C001 RJMP 0x01DF
(0165) }
(0166) else
(0167) {
(0168) return 0;
01DE 2700 CLR R16
01DF 940E054B CALL pop_gset2
01E1 9508 RET
_delay:
x --> R20
y --> R22
z --> R16
01E2 940E053B CALL push_gset2
FILE: E:\PQ-1A\我的AVR\新建文件夹\无线模拟\TWI.C
(0001) #include <iom128v.h>
(0002) #include <iom128.h>
(0003) #include <macros.h>
(0004) #include "TWI.h"
(0005)
(0006) #define uchar unsigned char
(0007) #define uint unsigned int
(0008) #define Page_size 8
(0009) #define Page_mask Page_size-1
(0010) //#pragma data:code
(0011) //const
(0012) //char table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
(0013) //char table1[8]={0,0,0,0,0,0,0,0};
(0014) void delay(uint z)
(0015) {
(0016) uint x,y;
(0017) for(x=z;x>0;x--)
01E4 01A8 MOVW R20,R16
01E5 C00A RJMP 0x01F0
(0018) for(y=1100;y>0;y--);
01E6 E46C LDI R22,0x4C
01E7 E074 LDI R23,4
01E8 C002 RJMP 0x01EB
01E9 5061 SUBI R22,1
01EA 4070 SBCI R23,0
01EB 3060 CPI R22,0
01EC 0767 CPC R22,R23
01ED F7D9 BNE 0x01E9
01EE 5041 SUBI R20,1
01EF 4050 SBCI R21,0
01F0 3040 CPI R20,0
01F1 0745 CPC R20,R21
01F2 F799 BNE 0x01E6
(0019) }
01F3 940E054B CALL pop_gset2
01F5 9508 RET
(0020)
(0021)
(0022) /*
(0023) 函数:TWI_init()
(0024) 功能:I2C总线初始化,使总线处于空闲状态
(0025) 说明:在main()函数的开始处,通常应当要执行一次本函数
(0026) */
(0027) void TWI_init()
(0028) {
(0029) TWBR=0X22;
_TWI_init:
01F6 E282 LDI R24,0x22
01F7 93800070 STS R24,0x70
(0030) TWSR=0;
01F9 2422 CLR R2
01FA 92200071 STS R2,0x71
(0031) TWCR=0X44;
01FC E484 LDI R24,0x44
01FD 93800074 STS R24,0x74
(0032) }
01FF 9508 RET
(0033)
(0034) /*
(0035) 函数:TWI_start()
(0036) 功能:产生I2C总线的起始状态
(0037) 说明:
(0038) 本函数也可以用来产生重复起始状态
(0039) 本函数执行后,I2C总线处于忙状态
(0040) */
(0041) uchar TWI_start(void)
(0042) {
(0043) TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
_TWI_start:
0200 EA84 LDI R24,0xA4
0201 93800074 STS R24,0x74
(0044) while(!(TWCR&(1<<TWINT)));
0203 90200074 LDS R2,0x74
0205 FE27 SBRS R2,7
0206 CFFC RJMP 0x0203
(0045) return 1;
0207 E001 LDI R16,1
0208 9508 RET
(0046) }
(0047)
(0048) void TWI_stop(void)
(0049) {
(0050) TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
_TWI_stop:
0209 E984 LDI R24,0x94
020A 93800074 STS R24,0x74
(0051) }
020C 9508 RET
_TWI_writeB:
ack --> R20
c --> R16
020D 940E0524 CALL push_gset1
(0052)
(0053) /*
(0054) 函数:TWI_writeB()
(0055) 功能:向I2C总线写1个字节的数据
(0056) 返回:
(0057) 0: 从机无应答
(0058) 1:从机应答
(0059) 参数:
(0060) c:要写到总线上的数据
(0061) */
(0062) uchar TWI_writeB(uchar c)
(0063) {
(0064) uchar ack=1;
020F E041 LDI R20,1
(0065) TWDR=c;
0210 93000073 STS R16,0x73
(0066) TWCR=(1<<TWINT)|(1<<TWEN);
0212 E884 LDI R24,0x84
0213 93800074 STS R24,0x74
(0067) while(!(TWCR&(1<<TWINT)));
0215 90200074 LDS R2,0x74
0217 FE27 SBRS R2,7
0218 CFFC RJMP 0x0215
(0068) if((TWSR&0xF8)!=SLA_W_ACK)
0219 91800071 LDS R24,0x71
021B 7F88 ANDI R24,0xF8
021C 3188 CPI R24,0x18
021D F009 BEQ 0x021F
(0069) ack=0;
021E 2744 CLR R20
(0070) return ack;
021F 2F04 MOV R16,R20
0220 940E0527 CALL pop_gset1
0222 9508 RET
(0071) }
(0072)
(0073) /*
(0074) 函数:TWI_readB()
(0075) 功能:从从机读取1个字节的数据
(0076) 返回:读取的一个字节数据
(0077) 说明:ack=0; 不应答
(0078) ack=1; 应答
(0079) */
(0080) uchar TWI_readB(uchar ack)
(0081) {
(0082) if(ack)
_TWI_readB:
ack --> R16
0223 2300 TST R16
0224 F021 BEQ 0x0229
(0083) TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);
0225 EC84 LDI R24,0xC4
0226 93800074 STS R24,0x74
0228 C003 RJMP 0x022C
(0084) else
(0085) TWCR=(1<<TWINT)|(1<<TWEN);
0229 E884 LDI R24,0x84
022A 93800074 STS R24,0x74
(0086) while(!(TWCR&(1<<TWINT)));
022C 90200074 LDS R2,0x74
022E FE27 SBRS R2,7
022F CFFC RJMP 0x022C
(0087) return(TWDR);
0230 91000073 LDS R16,0x73
0232 9508 RET
_TWI_page_write:
i --> R20
arr --> R22
n --> R10
addr --> R20
devadd --> R12
0233 940E0543 CALL push_gset4
0235 2F42 MOV R20,R18
0236 2EC0 MOV R12,R16
0237 84A8 LDD R10,8+Y
0238 856A LDD R22,10+Y
0239 857B LDD R23,11+Y
(0088) }
(0089)
(0090) /*
(0091) 函数:TWI_page_write()
(0092) 功能:I2C总线综合发送函数,向从机发送多个字节的数据,整页发送
(0093) 参数:
(0094) SlaveAddr:从机地址(7位纯地址,不含读写位)
(0095) addr:从机的子地址
(0096) *arr:要发送的数据
(0097) n:数据的字节数
(0098) 返回:
(0099) 1:发送成功
(0100) 0:在发送过程中出现异常
(0101) 说明:
(0102) 本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
(0103) 当从机没有子地址时,参数addr任意
(0104) */
(0105) uchar TWI_page_write(uchar devadd,uchar addr,uchar n,uchar *arr)//
(0106) {
(0107) uchar i;
(0108) TWI_start();
023A DFC5 RCALL _TWI_start
(0109) TWI_writeB(devadd);
023B 2D0C MOV R16,R12
023C DFD0 RCALL _TWI_writeB
(0110) TWI_writeB(addr);
023D 2F04 MOV R16,R20
023E DFCE RCALL _TWI_writeB
(0111) for(i=1;i<=n;i++)
023F E041 LDI R20,1
0240 C006 RJMP 0x0247
(0112) {
(0113) //TWI_writeB(i);
(0114) //table[i]=i;
(0115) TWI_writeB(*arr);
0241 01FB MOVW R30,R22
0242 8100 LDD R16,0+Z
0243 DFC9 RCALL _TWI_writeB
(0116) arr++;
0244 5F6F SUBI R22,0xFF
0245 4F7F SBCI R23,0xFF
0246 9543 INC R20
0247 16A4 CP R10,R20
0248 F7C0 BCC 0x0241
(0117) }
(0118) TWI_stop();
0249 DFBF RCALL _TWI_stop
(0119) delay(80);
024A E500 LDI R16,0x50
024B E010 LDI R17,0
024C DF95 RCALL _delay
(0120) }
024D 940E0551 CALL pop_gset4
024F 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -