📄 twi.lis
字号:
.module twi.c
.area vector(rom, abs)
.org 34
0022 22C0 rjmp _twi_isr
.area text(rom, con, rel)
0000 .dbfile E:\iccavr\无线+I2C\test1--sr\twi.c
0000 .dbfunc e StopDelay _StopDelay fV
0000 ; i -> R16,R17
.even
0000 _StopDelay::
0000 .dbline -1
0000 .dbline 40
0000 ;
0000 ; /*函数的使用说明:
0000 ; 1.该twi模块包含四种工作模式,主发,主收,从收,从发,其中主发由
0000 ; twiWriteByte(从机地址,要发送的数据)实现,主收由twiReadByte(从机地址)实现,从机
0000 ; 的发送与接收均通过中断实现
0000 ; 2.在从机模式下,需调用twi_init()来使能并初始化twi总线
0000 ; 3.在主机模式下,调用twiWriteByte(从机地址,要发送的数据)向指定的从机写入数据,
0000 ; 调用twiReadByte(从机地址)从指定的从机读取数据,然后可通过查询错误状态error_state
0000 ; 的值决定下一步如何操作。
0000 ; */
0000 ;
0000 ; //************************* 头文件 ******************************************
0000 ; #include "twi.h"
0000 ;
0000 ; //TWI同程序的接口参数
0000 ; //receive_data,error_state不用设置
0000 ; extern char receive_data; // 接收到的数据
0000 ; extern char error_state; // twi错误状态
0000 ; //以下三个参数根据需求进行设置
0000 ; extern char slave_address; // 设置从机地址,Bits 7..1:存放从机地址,Bit 0:最低位为广播识别使能位
0000 ; extern char bit_race; // 设置主机模式的比特率,SCL=CPU频率/(16+2*(TWBR)*4TWPS),TWPS在4的指数位置
0000 ; extern char send_data; // 从机发送模式下从机向主机发送的数据
0000 ;
0000 ; //*************************** twi错误状态说明*********************************
0000 ; // 0:twi传送无错误
0000 ; // 1:在主发模式下,SLA+W已发送,返回NOT ACK
0000 ; // 2:在主发模式下,DATA已发送,返回NOT ACK
0000 ; // 3:在主发模式下,SLA+W或者数据的仲裁失败
0000 ; // 4:在主收模式下,SLA+R或者数据的仲裁失败
0000 ; // 5:在主收模式下,SLA+R已发送,返回NOT ACK
0000 ; // 6:在主发模式下,START信号发送不成功
0000 ; // 7:在主收模式下,START信号发送不成功
0000 ; // 8:在主收模式下,数据接受完成
0000 ; // 9:在主收模式下,数据接受不成功
0000 ; //*****************************************************************************
0000 ;
0000 ; //*************************** twi stop 信号延时时间 ****************************
0000 ; //******************************************************************************
0000 ; void StopDelay(void)
0000 ; {
0000 .dbline 42
0000 0027 clr R16
0002 1127 clr R17
0004 02C0 rjmp L5
0006 L2:
0006 .dbline 42
0006 L3:
0006 .dbline 42
0006 0F5F subi R16,255 ; offset = 1
0008 1F4F sbci R17,255
000A L5:
000A .dbline 42
000A ; unsigned int i;
000A ; for(i = 0;i < 20;i ++);
000A 0431 cpi R16,20
000C E0E0 ldi R30,0
000E 1E07 cpc R17,R30
0010 D0F3 brlo L2
0012 .dbline -2
0012 .dbline 43
0012 ; }
0012 L1:
0012 .dbline 0 ; func end
0012 0895 ret
0014 .dbsym r i 16 i
0014 .dbend
0014 .dbfunc e start _start fV
.even
0014 _start::
0014 .dbline -1
0014 .dbline 47
0014 ; //******************************* twi 启动总线*********************************
0014 ; //******************************************************************************
0014 ; void start(void)
0014 ; {
0014 .dbline 48
0014 ; TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); //发出start信号
0014 84EA ldi R24,164
0016 86BF out 0x36,R24
0018 .dbline 49
0018 ; _NOP();
0018 0000 nop
001A .dbline 50
001A ; _NOP();
001A 0000 nop
001C .dbline -2
001C .dbline 51
001C ; }
001C L6:
001C .dbline 0 ; func end
001C 0895 ret
001E .dbend
001E .dbfunc e stop _stop fV
.even
001E _stop::
001E .dbline -1
001E .dbline 55
001E ; //************************** twi 释放总线************************************
001E ; //***************************************************************************
001E ; void stop(void)
001E ; {
001E .dbline 56
001E ; TWCR = (1 << TWINT) |(1 << TWEN)|(1 << TWSTO); //发出stop信号
001E 84E9 ldi R24,148
0020 86BF out 0x36,R24
0022 .dbline 57
0022 ; StopDelay(); //等待总线恢复
0022 EEDF rcall _StopDelay
0024 .dbline 58
0024 ; TWCR= 0x45;
0024 85E4 ldi R24,69
0026 86BF out 0x36,R24
0028 .dbline -2
0028 .dbline 59
0028 ; }
0028 L7:
0028 .dbline 0 ; func end
0028 0895 ret
002A .dbend
002A .dbfunc e twi_init _twi_init fV
.even
002A _twi_init::
002A .dbline -1
002A .dbline 71
002A ; //****************************** twi 初始化*************************************
002A ; // TWCR: 控制寄存器,用来控制TWI操作,说明如下:
002A ; // Bit 7-TWINT:中断标志位,Bit 6-TWEA:使能应答位,Bit 5-TWSTA:START状态位
002A ; // Bit 4-TWSTO:STOP状态位,Bit 3-TWWC: 写冲突标志,Bit 2-TWEN:TWI使能位
002A ; // Bit 1-RES:保留,Bit 0-TWIE:中断使能
002A ; // TWSR: 状态寄存器,Bits 7..3:表示了TWI总线的当前状态,读取时需屏蔽低三位的值,Bits 1..0-TWPS:TWI预分频位
002A ; // TWBR: 比特率寄存器,用来设置TWI的工作频率,计算公式为:SCL=CPU频率/(16+2*(TWBR)*4TWPS),TWPS在4的指数位置
002A ; // TWAR: 从机地址寄存器,Bits 7..1:存放从机地址,Bit 0:最低位为广播识别使能位
002A ; // TWDR: 数据寄存器,用来存放接收或要发送的地址和数据
002A ; //******************************************************************************
002A ; void twi_init(void)
002A ; {
002A .dbline 72
002A ; TWCR= 0x00; //disable twi
002A 2224 clr R2
002C 26BE out 0x36,R2
002E .dbline 73
002E ; TWBR= bit_race; //set bit rate
002E 20900000 lds R2,_bit_race
0032 20B8 out 0x0,R2
0034 .dbline 74
0034 ; TWSR= 0x00; //set prescale为1
0034 2224 clr R2
0036 21B8 out 0x1,R2
0038 .dbline 75
0038 ; TWAR= slave_address; //set slave address
0038 20900000 lds R2,_slave_address
003C 22B8 out 0x2,R2
003E .dbline 76
003E ; TWCR= 0x45; //enable twi
003E 85E4 ldi R24,69
0040 86BF out 0x36,R24
0042 .dbline -2
0042 .dbline 77
0042 ; }
0042 L8:
0042 .dbline 0 ; func end
0042 0895 ret
0044 .dbend
0044 .dbfunc e twi_isr _twi_isr fc
0044 ; TWSR_state -> R16
.even
0044 _twi_isr::
0044 2A92 st -y,R2
0046 0A93 st -y,R16
0048 1A93 st -y,R17
004A 8A93 st -y,R24
004C 9A93 st -y,R25
004E EA93 st -y,R30
0050 2FB6 in R2,0x3f
0052 2A92 st -y,R2
0054 .dbline -1
0054 .dbline 190
0054 ; //************************** 检测发送时的状态码 ****************************
0054 ; //**************************************************************************
0054 ; /*void checkstate(void)
0054 ; {
0054 ; unsigned char TWSR_state;
0054 ; TWSR_state = TWSR & 0xf8; //屏蔽第三位读取状态
0054 ; switch(TWSR_state)
0054 ; {
0054 ; case 0x08:error_state=0;break; // START已发送
0054 ; case 0x18:error_state=0;break; // SLA+W已发送,接收到ACK
0054 ; case 0x20:error_state=1;break; // SLA+W已发送,接收到NOT ACK
0054 ; case 0x28:error_state=0;break; // 数据已发送,接收到ACK
0054 ; case 0x30:error_state=2;break; // 数据已发送,接收到NOT ACK
0054 ; case 0x38:error_state=3;break; // SLA+W或数据的仲裁失败
0054 ; default: break;
0054 ; }
0054 ; TWCR=0x45;
0054 ; }
0054 ; //********** twi主机发送,向地址为WriteAddress的从机发送1个字节数据************
0054 ; // 入口参数1:WriteAddress:从机地址
0054 ; // TWDR中存放的高七位为地址,最低位表示读写控制,0为写,1为读
0054 ; // 入口参数2:data,向从机写的数据
0054 ; //******************************************************************************
0054 ; void twiWriteByte(unsigned char WriteAddress,char data)
0054 ; {
0054 ; unsigned char TWCR_state;
0054 ; char i=0;
0054 ; error_state=0;
0054 ;
0054 ; //初始化 twi
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -