⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 slave_test.lst

📁 avr 单片机twi源程序 功能:实现TWI主从机通讯.
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -