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

📄 twi.lis

📁 avr 单片机twi源程序 功能:实现TWI主从机通讯.
💻 LIS
字号:
                        .module twi.c
                        .area text(rom, con, rel)
 0000                   .dbfile F:\2007电子设计\古欣\twitest\twi_test\twi.c
 0000                   .dbfunc e twi_master_init _twi_master_init fV
                        .even
 0000           _twi_master_init::
 0000                   .dbline -1
 0000                   .dbline 7
 0000           ; 
 0000           ; #include "config.h"
 0000           ; 
 0000           ; //TWI master initialize
 0000           ; // bit rate:100
 0000           ; void twi_master_init(void)
 0000           ; {
 0000                   .dbline 8
 0000           ;  TWCR= 0x00; //disable twi
 0000 2224              clr R2
 0002 26BE              out 0x36,R2
 0004                   .dbline 9
 0004           ;  TWBR= 0x64; //set bit rate
 0004 84E6              ldi R24,100
 0006 80B9              out 0x0,R24
 0008                   .dbline 10
 0008           ;  TWSR= 0x00; //set prescale
 0008 21B8              out 0x1,R2
 000A                   .dbline 11
 000A           ;  TWAR= 0x00; //set slave address
 000A 22B8              out 0x2,R2
 000C                   .dbline 12
 000C           ;  TWCR= 0x04; //enable twi
 000C 84E0              ldi R24,4
 000E 86BF              out 0x36,R24
 0010                   .dbline -2
 0010           L1:
 0010                   .dbline 0 ; func end
 0010 0895              ret
 0012                   .dbend
 0012                   .dbfunc e twi_slave_init _twi_slave_init fV
 0012           ;            add -> R16
                        .even
 0012           _twi_slave_init::
 0012                   .dbline -1
 0012                   .dbline 18
 0012           ; }
 0012           ; 
 0012           ; //TWI slave initialize
 0012           ; // bit rate:100
 0012           ; void twi_slave_init(uint8 add)
 0012           ; {
 0012                   .dbline 19
 0012           ;  TWCR= 0x00; //disable twi
 0012 2224              clr R2
 0014 26BE              out 0x36,R2
 0016                   .dbline 20
 0016           ;  TWBR= 0x64; //set bit rate
 0016 84E6              ldi R24,100
 0018 80B9              out 0x0,R24
 001A                   .dbline 21
 001A           ;  TWSR= 0x00; //set prescale
 001A 21B8              out 0x1,R2
 001C                   .dbline 22
 001C           ;  TWAR= (add<<1); //set slave address 从机地址为 0x01
 001C 202E              mov R2,R16
 001E 220C              lsl R2
 0020 22B8              out 0x2,R2
 0022                   .dbline 23
 0022           ;  TWCR= (1<<TWEN)|(1<<TWEA)|(1<<TWIE); //enable twi
 0022 85E4              ldi R24,69
 0024 86BF              out 0x36,R24
 0026                   .dbline -2
 0026           L2:
 0026                   .dbline 0 ; func end
 0026 0895              ret
 0028                   .dbsym r add 16 c
 0028                   .dbend
 0028                   .dbfunc e i2c_start _i2c_start fV
                        .even
 0028           _i2c_start::
 0028                   .dbline -1
 0028                   .dbline 29
 0028           ;  //TWEN必须置位以使能TWI接口。TWEA也要置位以使主机寻址到自己(从机地址或广播) 时返回确认信息ACK
 0028           ; }
 0028           ; 
 0028           ; //总线上起动开始条件
 0028           ; void i2c_start(void)
 0028           ; {
 0028                   .dbline 30
 0028           ;       TWCR= (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
 0028 84EA              ldi R24,164
 002A 86BF              out 0x36,R24
 002C           L4:
 002C                   .dbline 31
 002C           L5:
 002C                   .dbline 31
 002C           ;       while (!(TWCR & (1<<TWINT))); //等待START 信号成功发送
 002C 26B6              in R2,0x36
 002E 27FE              sbrs R2,7
 0030 FDCF              rjmp L4
 0032                   .dbline -2
 0032           L3:
 0032                   .dbline 0 ; func end
 0032 0895              ret
 0034                   .dbend
 0034                   .dbfunc e i2c_write_addr _i2c_write_addr fc
 0034           ;            r_w -> R18
 0034           ;           addr -> R16
                        .even
 0034           _i2c_write_addr::
 0034                   .dbline -1
 0034                   .dbline 37
 0034           ; }
 0034           ; 
 0034           ; //把一个字节数据输入器件, 返回TWI状态
 0034           ; //发送地址,r_w:1为读,0为写
 0034           ; uint8 i2c_write_addr(uint8 addr,uint8 r_w)
 0034           ; {
 0034                   .dbline 38
 0034           ;       if(r_w)
 0034 2223              tst R18
 0036 21F0              breq L8
 0038                   .dbline 39
 0038           ;       {
 0038                   .dbline 40
 0038           ;        TWDR = addr|r_w;     //RW 为1:读操作
 0038 202E              mov R2,R16
 003A 222A              or R2,R18
 003C 23B8              out 0x3,R2
 003E                   .dbline 41
 003E           ;       }
 003E 03C0              xjmp L9
 0040           L8:
 0040                   .dbline 43
 0040           ;       else
 0040           ;       {
 0040                   .dbline 44
 0040           ;       TWDR = addr & 0xFE;   // RW 为0: 写操作
 0040 802F              mov R24,R16
 0042 8E7F              andi R24,254
 0044 83B9              out 0x3,R24
 0046                   .dbline 45
 0046           ;       } 
 0046           L9:
 0046                   .dbline 47
 0046           ; 
 0046           ;       TWCR = (1<<TWINT)|(1<<TWEN); 
 0046 84E8              ldi R24,132
 0048 86BF              out 0x36,R24
 004A           L10:
 004A                   .dbline 48
 004A           L11:
 004A                   .dbline 48
 004A           ;       while (!(TWCR & (1<<TWINT)));
 004A 26B6              in R2,0x36
 004C 27FE              sbrs R2,7
 004E FDCF              rjmp L10
 0050                   .dbline 49
 0050           ;       _NOP();
 0050 0000              nop
 0052                   .dbline 50
 0052           ;       return(TWSR&0b11111000); //TWSR高五位为I2C工作状态。
 0052 01B1              in R16,0x1
 0054 087F              andi R16,248
 0056                   .dbline -2
 0056           L7:
 0056                   .dbline 0 ; func end
 0056 0895              ret
 0058                   .dbsym r r_w 18 c
 0058                   .dbsym r addr 16 c
 0058                   .dbend
 0058                   .dbfunc e i2c_write_data _i2c_write_data fc
 0058           ;           data -> R16
                        .even
 0058           _i2c_write_data::
 0058                   .dbline -1
 0058                   .dbline 56
 0058           ; }
 0058           ; 
 0058           ; //把一个字节数据输入器件, 返回TWI状态
 0058           ; //发送数据
 0058           ; uint8 i2c_write_data(uint8 data)
 0058           ; {
 0058                   .dbline 57
 0058           ;       TWDR = data;
 0058 03B9              out 0x3,R16
 005A                   .dbline 58
 005A           ;       TWCR = (1<<TWINT)|(1<<TWEN); 
 005A 84E8              ldi R24,132
 005C 86BF              out 0x36,R24
 005E           L14:
 005E                   .dbline 59
 005E           L15:
 005E                   .dbline 59
 005E           ;       while (!(TWCR & (1<<TWINT)));
 005E 26B6              in R2,0x36
 0060 27FE              sbrs R2,7
 0062 FDCF              rjmp L14
 0064                   .dbline 60
 0064           ;       _NOP();
 0064 0000              nop
 0066                   .dbline 61
 0066           ;       return(TWSR&0b11111000); //TWSR高五位为I2C工作状态。
 0066 01B1              in R16,0x1
 0068 087F              andi R16,248
 006A                   .dbline -2
 006A           L13:
 006A                   .dbline 0 ; func end
 006A 0895              ret
 006C                   .dbsym r data 16 c
 006C                   .dbend
 006C                   .dbfunc e i2c_read _i2c_read fc
                        .even
 006C           _i2c_read::
 006C                   .dbline -1
 006C                   .dbline 67
 006C           ; }
 006C           ; 
 006C           ; 
 006C           ; //从器件读出一个字节
 006C           ; uint8 i2c_read(void)
 006C           ; {
 006C                   .dbline 68
 006C           ;       TWCR = (1<<TWINT)|(1<<TWEN); 
 006C 84E8              ldi R24,132
 006E 86BF              out 0x36,R24
 0070                   .dbline 69
 0070           ;       Twi_NoAcK();
 0070                   .dbline 69
 0070 86B7              in R24,0x36
 0072 8F70              andi R24,15
 0074 8068              ori R24,128
 0076 86BF              out 0x36,R24
 0078                   .dbline 69
 0078                   .dbline 69
 0078           L18:
 0078                   .dbline 70
 0078           L19:
 0078                   .dbline 70
 0078           ;       while (!(TWCR & (1<<TWINT)));
 0078 26B6              in R2,0x36
 007A 27FE              sbrs R2,7
 007C FDCF              rjmp L18
 007E                   .dbline 71
 007E           ;       return(TWDR);
 007E 03B1              in R16,0x3
 0080                   .dbline -2
 0080           L17:
 0080                   .dbline 0 ; func end
 0080 0895              ret
 0082                   .dbend
 0082                   .dbfunc e i2c_stop _i2c_stop fV
                        .even
 0082           _i2c_stop::
 0082                   .dbline -1
 0082                   .dbline 76
 0082           ; }
 0082           ; 
 0082           ; //总线上起动停止条件 
 0082           ; void i2c_stop(void) 
 0082           ; { 
 0082                   .dbline 77
 0082           ;    TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN); 
 0082 84E9              ldi R24,148
 0084 86BF              out 0x36,R24
 0086                   .dbline -2
 0086           L21:
 0086                   .dbline 0 ; func end
 0086 0895              ret
 0088                   .dbend
 0088                   .dbfunc e i2c_maste_transt _i2c_maste_transt fV
 0088           ;           data -> R20
 0088           ;           addr -> R22
                        .even
 0088           _i2c_maste_transt::
 0088 0E940000          xcall push_gset2
 008C 422F              mov R20,R18
 008E 602F              mov R22,R16
 0090                   .dbline -1
 0090                   .dbline 82
 0090           ; }
 0090           ; 
 0090           ; //操作步骤: 启动,发送地址,发送数据,关闭总线
 0090           ; void i2c_maste_transt(uint8 addr, uint8 data)
 0090           ; {
 0090                   .dbline 83
 0090           ;  i2c_start();
 0090 CBDF              xcall _i2c_start
 0092                   .dbline 85
 0092           ;  
 0092           ;  if(i2c_write_addr(addr, 0)==TW_MT_SLA_ACK) //发送地址成功并收到ACK
 0092 2227              clr R18
 0094 062F              mov R16,R22
 0096 CEDF              xcall _i2c_write_addr
 0098 0831              cpi R16,24
 009A 11F4              brne L23
 009C                   .dbline 86
 009C           ;  {
 009C                   .dbline 87
 009C           ;   i2c_write_data(data);
 009C 042F              mov R16,R20
 009E DCDF              xcall _i2c_write_data
 00A0                   .dbline 88
 00A0           ;  }
 00A0           L23:
 00A0                   .dbline 89
 00A0           ;  i2c_stop();
 00A0 F0DF              xcall _i2c_stop
 00A2                   .dbline -2
 00A2           L22:
 00A2 0E940000          xcall pop_gset2
 00A6                   .dbline 0 ; func end
 00A6 0895              ret
 00A8                   .dbsym r data 20 c
 00A8                   .dbsym r addr 22 c
 00A8                   .dbend
 00A8                   .dbfunc e i2c_maste_read _i2c_maste_read fc
 00A8           ;            tmp -> R20
 00A8           ;           addr -> R22
                        .even
 00A8           _i2c_maste_read::
 00A8 0E940000          xcall push_gset2
 00AC 602F              mov R22,R16
 00AE                   .dbline -1
 00AE                   .dbline 93
 00AE           ; }
 00AE           ; //操作步骤,启动,发送地址,读数据,关闭总线
 00AE           ; uint8 i2c_maste_read(uint8 addr)
 00AE           ; {
 00AE                   .dbline 94
 00AE           ;   uint8 tmp=0; 
 00AE 4427              clr R20
 00B0                   .dbline 95
 00B0           ;   i2c_start();
 00B0 BBDF              xcall _i2c_start
 00B2                   .dbline 96
 00B2           ;   if(i2c_write_addr(addr, 1)==TW_MR_SLA_ACK) //发送地址成功并收到ACK
 00B2 21E0              ldi R18,1
 00B4 062F              mov R16,R22
 00B6 BEDF              xcall _i2c_write_addr
 00B8 0034              cpi R16,64
 00BA 11F4              brne L26
 00BC                   .dbline 97
 00BC           ;   {
 00BC                   .dbline 98
 00BC           ;    tmp=i2c_read();
 00BC D7DF              xcall _i2c_read
 00BE 402F              mov R20,R16
 00C0                   .dbline 99
 00C0           ;   }
 00C0           L26:
 00C0                   .dbline 100
 00C0           ;   i2c_stop();
 00C0 E0DF              xcall _i2c_stop
 00C2                   .dbline 101
 00C2           ;   return tmp;
 00C2 042F              mov R16,R20
 00C4                   .dbline -2
 00C4           L25:
 00C4 0E940000          xcall pop_gset2
 00C8                   .dbline 0 ; func end
 00C8 0895              ret
 00CA                   .dbsym r tmp 20 c
 00CA                   .dbsym r addr 22 c
 00CA                   .dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -