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

📄 twi.lis

📁 PTR8000无线通信模块的单片机控制程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -