📄 slave_test.lst
字号:
__start:
__text_start:
002B E5CF LDI R28,0x5F
002C E0D4 LDI R29,4
002D BFCD OUT 0x3D,R28
002E BFDE OUT 0x3E,R29
002F 51C0 SUBI R28,0x10
0030 40D0 SBCI R29,0
0031 EA0A LDI R16,0xAA
0032 8308 STD Y+0,R16
0033 2400 CLR R0
0034 E6E1 LDI R30,0x61
0035 E0F0 LDI R31,0
0036 E010 LDI R17,0
0037 36E1 CPI R30,0x61
0038 07F1 CPC R31,R17
0039 F011 BEQ 0x003C
003A 9201 ST R0,Z+
003B CFFB RJMP 0x0037
003C 8300 STD Z+0,R16
003D E5E4 LDI R30,0x54
003E E0F0 LDI R31,0
003F E6A0 LDI R26,0x60
0040 E0B0 LDI R27,0
0041 E010 LDI R17,0
0042 35E5 CPI R30,0x55
0043 07F1 CPC R31,R17
0044 F021 BEQ 0x0049
0045 95C8 LPM
0046 9631 ADIW R30,1
0047 920D ST R0,X+
0048 CFF9 RJMP 0x0042
0049 940E0140 CALL _main
_exit:
004B CFFF RJMP _exit
FILE: F:\2007电子设计\古欣\twitest\twi_slave_test\twi.c
(0001) #include "config.h"
(0002)
(0003) volatile uint8 main_tmp=0;
(0004) //extern volatile uint8 main_tmp=0;
(0005)
(0006) //TWI master initialize
(0007) // bit rate:100
(0008) void twi_master_init(void)
(0009) {
(0010) TWCR= 0x00; //disable twi
_twi_master_init:
004C 2422 CLR R2
004D BE26 OUT 0x36,R2
(0011) TWBR= 0x64; //set bit rate
004E E684 LDI R24,0x64
004F B980 OUT 0x00,R24
(0012) TWSR= 0x00; //set prescale
0050 B821 OUT 0x01,R2
(0013) TWAR= 0x00; //set slave address
0051 B822 OUT 0x02,R2
(0014) TWCR= 0x04; //enable twi
0052 E084 LDI R24,4
0053 BF86 OUT 0x36,R24
0054 9508 RET
(0015) }
(0016)
(0017) //TWI slave initialize
(0018) // bit rate:100
(0019) void twi_slave_init(uint8 add)
(0020) {
(0021) TWCR= 0x00; //disable twi
_twi_slave_init:
add --> R16
0055 2422 CLR R2
0056 BE26 OUT 0x36,R2
(0022) TWBR= 0x64; //set bit rate
0057 E684 LDI R24,0x64
0058 B980 OUT 0x00,R24
(0023) TWSR= 0x00; //set prescale
0059 B821 OUT 0x01,R2
(0024) TWAR= add; //set slave address 从机地址为 0x01
005A B902 OUT 0x02,R16
(0025) TWCR= (1<<TWEN)|(1<<TWEA)|(1<<TWIE); //enable twi
005B E485 LDI R24,0x45
005C BF86 OUT 0x36,R24
005D 9508 RET
(0026) //TWEN必须置位以使能TWI接口。TWEA也要置位以使主机寻址到自己(从机地址或广播) 时返回确认信息ACK
(0027) }
(0028)
(0029) //总线上起动开始条件
(0030) void i2c_start(void)
(0031) {
(0032) TWCR= (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
_i2c_start:
005E EA84 LDI R24,0xA4
005F BF86 OUT 0x36,R24
(0033) while (!(TWCR & (1<<TWINT))); //等待START 信号成功发送
0060 B626 IN R2,0x36
0061 FE27 SBRS R2,7
0062 CFFD RJMP 0x0060
0063 9508 RET
(0034) }
(0035)
(0036) //把一个字节数据输入器件, 返回TWI状态
(0037) //发送地址和数据都可以使用本函数
(0038) uint8 i2c_write(uint8 data)
(0039) {
(0040) TWDR = data;
_i2c_write:
data --> R16
0064 B903 OUT 0x03,R16
(0041) TWCR = (1<<TWINT)|(1<<TWEN);
0065 E884 LDI R24,0x84
0066 BF86 OUT 0x36,R24
(0042) while (!(TWCR & (1<<TWINT)));
0067 B626 IN R2,0x36
0068 FE27 SBRS R2,7
0069 CFFD RJMP 0x0067
(0043) _NOP();
006A 0000 NOP
(0044) return(TWSR&0b11111000); //TWSR高五位为I2C工作状态。
006B B101 IN R16,0x01
006C 7F08 ANDI R16,0xF8
006D 9508 RET
(0045) }
(0046)
(0047) //从器件读出一个字节
(0048) uint8 i2c_read(void)
(0049) {
(0050) TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWEN);
_i2c_read:
006E EC84 LDI R24,0xC4
006F BF86 OUT 0x36,R24
(0051) while (!(TWCR & (1<<TWINT)));
0070 B626 IN R2,0x36
0071 FE27 SBRS R2,7
0072 CFFD RJMP 0x0070
(0052) return(TWDR);
0073 B103 IN R16,0x03
0074 9508 RET
(0053) }
(0054)
(0055) //总线上起动停止条件
(0056) void i2c_stop(void)
(0057) {
(0058) TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
_i2c_stop:
0075 E984 LDI R24,0x94
0076 BF86 OUT 0x36,R24
0077 9508 RET
_i2c_maste_transt:
data --> R20
addr --> R22
0078 940E0155 CALL push_gset2
007A 2F42 MOV R20,R18
007B 2F60 MOV R22,R16
(0059) }
(0060)
(0061) //操作步骤: 启动,发送地址,发送数据,关闭总线
(0062) void i2c_maste_transt(uint8 addr, uint8 data)
(0063) {
(0064) i2c_start();
007C DFE1 RCALL _i2c_start
(0065) if(i2c_write(addr)==TW_MT_SLA_ACK) //发送地址成功并收到ACK
007D 2F06 MOV R16,R22
007E DFE5 RCALL _i2c_write
007F 3108 CPI R16,0x18
0080 F411 BNE 0x0083
(0066) {
(0067) i2c_write(data);
0081 2F04 MOV R16,R20
0082 DFE1 RCALL _i2c_write
(0068) }
(0069) i2c_stop();
0083 DFF1 RCALL _i2c_stop
0084 940E014C CALL pop_gset2
0086 9508 RET
_twi_isr:
0087 940E016E CALL push_lset
0089 940E0157 CALL push_gset1
(0070) }
(0071)
(0072) #if TWI_MOD==0 //从机模式
(0073) #pragma interrupt_handler twi_isr:18
(0074) void twi_isr(void)
(0075) {
(0076) //twi event
(0077) switch (TWSR&0xF8)
008B B141 IN R20,0x01
008C 2755 CLR R21
008D 7F48 ANDI R20,0xF8
008E 7050 ANDI R21,0
008F 3940 CPI R20,0x90
0090 E0E0 LDI R30,0
0091 075E CPC R21,R30
0092 F409 BNE 0x0094
0093 C086 RJMP 0x011A
0094 E980 LDI R24,0x90
0095 E090 LDI R25,0
0096 1784 CP R24,R20
0097 0795 CPC R25,R21
0098 F40C BGE 0x009A
0099 C035 RJMP 0x00CF
009A 3740 CPI R20,0x70
009B E0E0 LDI R30,0
009C 075E CPC R21,R30
009D F409 BNE 0x009F
009E C06B RJMP 0x010A
009F E780 LDI R24,0x70
00A0 E090 LDI R25,0
00A1 1784 CP R24,R20
00A2 0795 CPC R25,R21
00A3 F0AC BLT 0x00B9
00A4 3640 CPI R20,0x60
00A5 E0E0 LDI R30,0
00A6 075E CPC R21,R30
00A7 F409 BNE 0x00A9
00A8 C061 RJMP 0x010A
00A9 E680 LDI R24,0x60
00AA E090 LDI R25,0
00AB 1784 CP R24,R20
00AC 0795 CPC R25,R21
00AD F02C BLT 0x00B3
00AE 3040 CPI R20,0
00AF 0745 CPC R20,R21
00B0 F409 BNE 0x00B2
00B1 C085 RJMP 0x0137
00B2 C088 RJMP 0x013B
00B3 3648 CPI R20,0x68
00B4 E0E0 LDI R30,0
00B5 075E CPC R21,R30
00B6 F409 BNE 0x00B8
00B7 C052 RJMP 0x010A
00B8 C082 RJMP 0x013B
00B9 3840 CPI R20,0x80
00BA E0E0 LDI R30,0
00BB 075E CPC R21,R30
00BC F409 BNE 0x00BE
00BD C051 RJMP 0x010F
00BE E880 LDI R24,0x80
00BF E090 LDI R25,0
00C0 1784 CP R24,R20
00C1 0795 CPC R25,R21
00C2 F034 BLT 0x00C9
00C3 3748 CPI R20,0x78
00C4 E0E0 LDI R30,0
00C5 075E CPC R21,R30
00C6 F409 BNE 0x00C8
00C7 C042 RJMP 0x010A
00C8 C072 RJMP 0x013B
00C9 3848 CPI R20,0x88
00CA E0E0 LDI R30,0
00CB 075E CPC R21,R30
00CC F409 BNE 0x00CE
00CD C041 RJMP 0x010F
00CE C06C RJMP 0x013B
00CF 3B40 CPI R20,0xB0
00D0 E0E0 LDI R30,0
00D1 075E CPC R21,R30
00D2 F409 BNE 0x00D4
00D3 C050 RJMP 0x0124
00D4 EB80 LDI R24,0xB0
00D5 E090 LDI R25,0
00D6 1784 CP R24,R20
00D7 0795 CPC R25,R21
00D8 F0AC BLT 0x00EE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -