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

📄 twi.lis

📁 avr 单片机twi源程序 功能:实现TWI主从机通讯.
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module twi.c
                        .area data(ram, con, rel)
 0000           _main_tmp::
 0000                   .blkb 1
                        .area idata
 0000 00                .byte 0
                        .area data(ram, con, rel)
 0001                   .dbfile F:\2007电子设计\古欣\twitest\twi_slave_test\twi.c
 0001                   .dbsym e main_tmp _main_tmp c
                        .area text(rom, con, rel)
 0000                   .dbfile F:\2007电子设计\古欣\twitest\twi_slave_test\twi.c
 0000                   .dbfunc e twi_master_init _twi_master_init fV
                        .even
 0000           _twi_master_init::
 0000                   .dbline -1
 0000                   .dbline 9
 0000           ; #include "config.h"
 0000           ; 
 0000           ; volatile uint8 main_tmp=0;
 0000           ; //extern volatile uint8 main_tmp=0;
 0000           ; 
 0000           ; //TWI master initialize
 0000           ; // bit rate:100
 0000           ; void twi_master_init(void)
 0000           ; {
 0000                   .dbline 10
 0000           ;  TWCR= 0x00; //disable twi
 0000 2224              clr R2
 0002 26BE              out 0x36,R2
 0004                   .dbline 11
 0004           ;  TWBR= 0x64; //set bit rate
 0004 84E6              ldi R24,100
 0006 80B9              out 0x0,R24
 0008                   .dbline 12
 0008           ;  TWSR= 0x00; //set prescale
 0008 21B8              out 0x1,R2
 000A                   .dbline 13
 000A           ;  TWAR= 0x00; //set slave address
 000A 22B8              out 0x2,R2
 000C                   .dbline 14
 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 20
 0012           ; }
 0012           ; 
 0012           ; //TWI slave initialize
 0012           ; // bit rate:100
 0012           ; void twi_slave_init(uint8 add)
 0012           ; {
 0012                   .dbline 21
 0012           ;  TWCR= 0x00; //disable twi
 0012 2224              clr R2
 0014 26BE              out 0x36,R2
 0016                   .dbline 22
 0016           ;  TWBR= 0x64; //set bit rate
 0016 84E6              ldi R24,100
 0018 80B9              out 0x0,R24
 001A                   .dbline 23
 001A           ;  TWSR= 0x00; //set prescale
 001A 21B8              out 0x1,R2
 001C                   .dbline 24
 001C           ;  TWAR= add; //set slave address 从机地址为 0x01
 001C 02B9              out 0x2,R16
 001E                   .dbline 25
 001E           ;  TWCR= (1<<TWEN)|(1<<TWEA)|(1<<TWIE); //enable twi
 001E 85E4              ldi R24,69
 0020 86BF              out 0x36,R24
 0022                   .dbline -2
 0022           L2:
 0022                   .dbline 0 ; func end
 0022 0895              ret
 0024                   .dbsym r add 16 c
 0024                   .dbend
 0024                   .dbfunc e i2c_start _i2c_start fV
                        .even
 0024           _i2c_start::
 0024                   .dbline -1
 0024                   .dbline 31
 0024           ;  //TWEN必须置位以使能TWI接口。TWEA也要置位以使主机寻址到自己(从机地址或广播) 时返回确认信息ACK
 0024           ; }
 0024           ; 
 0024           ; //总线上起动开始条件
 0024           ; void i2c_start(void)
 0024           ; {
 0024                   .dbline 32
 0024           ;       TWCR= (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
 0024 84EA              ldi R24,164
 0026 86BF              out 0x36,R24
 0028           L4:
 0028                   .dbline 33
 0028           L5:
 0028                   .dbline 33
 0028           ;       while (!(TWCR & (1<<TWINT))); //等待START 信号成功发送
 0028 26B6              in R2,0x36
 002A 27FE              sbrs R2,7
 002C FDCF              rjmp L4
 002E                   .dbline -2
 002E           L3:
 002E                   .dbline 0 ; func end
 002E 0895              ret
 0030                   .dbend
 0030                   .dbfunc e i2c_write _i2c_write fc
 0030           ;           data -> R16
                        .even
 0030           _i2c_write::
 0030                   .dbline -1
 0030                   .dbline 39
 0030           ; }
 0030           ; 
 0030           ; //把一个字节数据输入器件, 返回TWI状态
 0030           ; //发送地址和数据都可以使用本函数
 0030           ; uint8 i2c_write(uint8 data)
 0030           ; {
 0030                   .dbline 40
 0030           ;       TWDR = data; 
 0030 03B9              out 0x3,R16
 0032                   .dbline 41
 0032           ;       TWCR = (1<<TWINT)|(1<<TWEN); 
 0032 84E8              ldi R24,132
 0034 86BF              out 0x36,R24
 0036           L8:
 0036                   .dbline 42
 0036           L9:
 0036                   .dbline 42
 0036           ;       while (!(TWCR & (1<<TWINT)));
 0036 26B6              in R2,0x36
 0038 27FE              sbrs R2,7
 003A FDCF              rjmp L8
 003C                   .dbline 43
 003C           ;       _NOP();
 003C 0000              nop
 003E                   .dbline 44
 003E           ;       return(TWSR&0b11111000); //TWSR高五位为I2C工作状态。
 003E 01B1              in R16,0x1
 0040 087F              andi R16,248
 0042                   .dbline -2
 0042           L7:
 0042                   .dbline 0 ; func end
 0042 0895              ret
 0044                   .dbsym r data 16 c
 0044                   .dbend
 0044                   .dbfunc e i2c_read _i2c_read fc
                        .even
 0044           _i2c_read::
 0044                   .dbline -1
 0044                   .dbline 49
 0044           ; }
 0044           ; 
 0044           ; //从器件读出一个字节
 0044           ; uint8 i2c_read(void)
 0044           ; {
 0044                   .dbline 50
 0044           ;       TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWEN); 
 0044 84EC              ldi R24,196
 0046 86BF              out 0x36,R24
 0048           L12:
 0048                   .dbline 51
 0048           L13:
 0048                   .dbline 51
 0048           ;       while (!(TWCR & (1<<TWINT)));
 0048 26B6              in R2,0x36
 004A 27FE              sbrs R2,7
 004C FDCF              rjmp L12
 004E                   .dbline 52
 004E           ;       return(TWDR);
 004E 03B1              in R16,0x3
 0050                   .dbline -2
 0050           L11:
 0050                   .dbline 0 ; func end
 0050 0895              ret
 0052                   .dbend
 0052                   .dbfunc e i2c_stop _i2c_stop fV
                        .even
 0052           _i2c_stop::
 0052                   .dbline -1
 0052                   .dbline 57
 0052           ; }
 0052           ; 
 0052           ; //总线上起动停止条件 
 0052           ; void i2c_stop(void) 
 0052           ; { 
 0052                   .dbline 58
 0052           ;    TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN); 
 0052 84E9              ldi R24,148
 0054 86BF              out 0x36,R24
 0056                   .dbline -2
 0056           L15:
 0056                   .dbline 0 ; func end
 0056 0895              ret
 0058                   .dbend
 0058                   .dbfunc e i2c_maste_transt _i2c_maste_transt fV
 0058           ;           data -> R20
 0058           ;           addr -> R22
                        .even
 0058           _i2c_maste_transt::
 0058 0E940000          xcall push_gset2
 005C 422F              mov R20,R18
 005E 602F              mov R22,R16
 0060                   .dbline -1
 0060                   .dbline 63
 0060           ; }
 0060           ; 
 0060           ; //操作步骤: 启动,发送地址,发送数据,关闭总线
 0060           ; void i2c_maste_transt(uint8 addr, uint8 data)
 0060           ; {
 0060                   .dbline 64
 0060           ;  i2c_start();
 0060 E1DF              xcall _i2c_start
 0062                   .dbline 65
 0062           ;  if(i2c_write(addr)==TW_MT_SLA_ACK) //发送地址成功并收到ACK
 0062 062F              mov R16,R22
 0064 E5DF              xcall _i2c_write
 0066 0831              cpi R16,24
 0068 11F4              brne L17
 006A                   .dbline 66
 006A           ;  {
 006A                   .dbline 67
 006A           ;   i2c_write(data);
 006A 042F              mov R16,R20
 006C E1DF              xcall _i2c_write
 006E                   .dbline 68
 006E           ;  }
 006E           L17:
 006E                   .dbline 69
 006E           ;  i2c_stop();
 006E F1DF              xcall _i2c_stop
 0070                   .dbline -2
 0070           L16:
 0070 0E940000          xcall pop_gset2
 0074                   .dbline 0 ; func end
 0074 0895              ret
 0076                   .dbsym r data 20 c
 0076                   .dbsym r addr 22 c
 0076                   .dbend
                        .area vector(rom, abs)
                        .org 68
 0044 0C943B00          jmp _twi_isr
                        .area text(rom, con, rel)
 0076                   .dbfile F:\2007电子设计\古欣\twitest\twi_slave_test\twi.c
 0076                   .dbfunc e twi_isr _twi_isr fV
                        .even
 0076           _twi_isr::
 0076 0E940000          xcall push_lset
 007A 0E940000          xcall push_gset1
 007E                   .dbline -1
 007E                   .dbline 75
 007E           ; }
 007E           ; 
 007E           ; #if TWI_MOD==0 //从机模式
 007E           ; #pragma interrupt_handler twi_isr:18
 007E           ; void twi_isr(void)
 007E           ; {
 007E                   .dbline 77
 007E           ;  //twi event
 007E           ;  switch (TWSR&0xF8)
 007E 41B1              in R20,0x1
 0080 5527              clr R21
 0082 487F              andi R20,248
 0084 5070              andi R21,0
 0086 4039              cpi R20,144
 0088 E0E0              ldi R30,0
 008A 5E07              cpc R21,R30
 008C 09F4              brne X3
 008E 86C0              xjmp L25
 0090           X3:
 0090 80E9              ldi R24,144
 0092 90E0              ldi R25,0
 0094 8417              cp R24,R20
 0096 9507              cpc R25,R21
 0098 0CF4              brge X4
 009A 35C0              xjmp L33
 009C           X4:
 009C           L32:
 009C 4037              cpi R20,112
 009E E0E0              ldi R30,0

⌨️ 快捷键说明

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