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

📄 twi_1.lis

📁 AVR单片机平台Atmega32+CH375A芯片读写U盘代码
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .module twi_1.c
                        .area data(ram, con, rel)
 0000           _localBuffer::
 0000                   .blkb 3
                        .area idata
 0000 212100            .byte 33,33,0
                        .area data(ram, con, rel)
 0003                   .dbfile E:\xm\jxf\u盘读写模块\code\udisk_test0827\twi_1.c
 0003                   .dbsym e localBuffer _localBuffer A[3:3]c
 0003           _localBufferLength::
 0003                   .blkb 1
                        .area idata
 0003 20                .byte 32
                        .area data(ram, con, rel)
 0004                   .dbfile E:\xm\jxf\u盘读写模块\code\udisk_test0827\twi_1.c
 0004                   .dbsym e localBufferLength _localBufferLength c
 0004           _EnFlex::
 0004                   .blkb 1
                        .area idata
 0004 00                .byte 0
                        .area data(ram, con, rel)
 0005                   .dbfile E:\xm\jxf\u盘读写模块\code\udisk_test0827\twi_1.c
 0005                   .dbsym e EnFlex _EnFlex c
 0005           _I2cNotAck::
 0005                   .blkb 1
                        .area idata
 0005 00                .byte 0
                        .area data(ram, con, rel)
 0006                   .dbfile E:\xm\jxf\u盘读写模块\code\udisk_test0827\twi_1.c
 0006                   .dbsym e I2cNotAck _I2cNotAck c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\xm\jxf\u盘读写模块\code\udisk_test0827\twi_1.c
 0000                   .dbfunc e i2cSetBitrate _i2cSetBitrate fV
 0000           ;    bitrate_div -> R10
 0000           ;     bitrateKHz -> R10,R11
                        .even
 0000           _i2cSetBitrate::
 0000 0E940000          xcall push_gset3
 0004 5801              movw R10,R16
 0006                   .dbline -1
 0006                   .dbline 46
 0006           ; /************************************************************************/
 0006           ; //I2C文件读写库函数V1.1
 0006           ; /* I2C读写程序,使用前要确保
 0006           ; 1.中断向量号的正确
 0006           ; 2.确保TWI的初始化
 0006           ; 3.此版本文件是从twi.c派生出来的,读写缓存都不再单独分配,而是由应用函数和场合指定
 0006           ; 4.此版本是速度优先版本,特点是速度快,但读写都是在编译时确定的,不是用指针方式寻址
 0006           ; 5.没有通信超时退出
 0006           ;                                                        */
 0006           ; /************************************************************************/
 0006           ; 
 0006           ; #include "twi.h" 
 0006           ; 
 0006           ; 
 0006           ; // I2C标准波特率: 
 0006           ; // 低速 100KHz  
 0006           ; // 高速 400KHz  
 0006           ; 
 0006           ; // I2C 状态和地址变量 
 0006           ; static volatile eI2cStateType I2cState; 
 0006           ; static unsigned char I2cDeviceAddrRW; 
 0006           ; // 发送缓冲区 
 0006           ; //static unsigned char I2cSendData[I2C_SEND_DATA_BUFFER_SIZE]; 
 0006           ; unsigned char *I2cSendData;
 0006           ; static unsigned int I2cSendDataIndex; 
 0006           ; static unsigned int I2cSendDataLength; 
 0006           ; // 接收缓冲区 
 0006           ; //static unsigned char I2cReceiveData[I2C_RECEIVE_DATA_BUFFER_SIZE]; 
 0006           ; unsigned char *I2cReceiveData;
 0006           ; static unsigned int I2cReceiveDataIndex; 
 0006           ; static unsigned int I2cReceiveDataLength; 
 0006           ; 
 0006           ; unsigned char I2cComStatus;     //通信状态变量
 0006           ; 
 0006           ; unsigned char localBuffer[] = "!!"; 
 0006           ; unsigned char localBufferLength = 0x20;
 0006           ; 
 0006           ; // 存放发送长度的地址
 0006           ; unsigned int* SlaveSendLength;
 0006           ; 
 0006           ; unsigned char EnFlex = 0;                /*变长接收使能*/
 0006           ; 
 0006           ; unsigned char I2cNotAck = 0;            /*如果在主机发送或接收时,SLA+R或者SLA+W,ACK未收到,则I2cNotAck=0xff,否则为0*/
 0006           ; //设置总线速率 
 0006           ; void i2cSetBitrate(unsigned int  bitrateKHz) 
 0006           ; { 
 0006                   .dbline 53
 0006           ;    unsigned char bitrate_div; 
 0006           ;    // SCL freq = F_CPU/(16+2*TWBR)) 
 0006           ;    #ifdef TWPS0 
 0006           ;       // 对于用速率分频的AVR (mega128) 
 0006           ;       // SCL freq = F_CPU/(16+2*TWBR*4^TWPS) 
 0006           ;       // set TWPS to zero 
 0006           ;              TWSR&=~(1<<TWPS0); 
 0006 0898              cbi 0x1,0
 0008                   .dbline 54
 0008           ;       TWSR&=~(1<<TWPS1); 
 0008 0998              cbi 0x1,1
 000A                   .dbline 57
 000A           ;    #endif 
 000A           ;    // 计算分频 
 000A           ;    bitrate_div = ((F_CPU/1000l)/bitrateKHz); 
 000A 1501              movw R2,R10
 000C 4424              clr R4
 000E 5524              clr R5
 0010 40E4              ldi R20,64
 0012 5FE1              ldi R21,31
 0014 60E0              ldi R22,0
 0016 70E0              ldi R23,0
 0018 5A92              st -y,R5
 001A 4A92              st -y,R4
 001C 3A92              st -y,R3
 001E 2A92              st -y,R2
 0020 8A01              movw R16,R20
 0022 9B01              movw R18,R22
 0024 0E940000          xcall div32s
 0028 A02E              mov R10,R16
 002A                   .dbline 58
 002A           ;    if(bitrate_div >= 16) 
 002A 8A2D              mov R24,R10
 002C 0031              cpi R16,16
 002E 18F0              brlo L3
 0030                   .dbline 59
 0030           ;       bitrate_div = (bitrate_div-16)/2; 
 0030 8051              subi R24,16
 0032 A82E              mov R10,R24
 0034 A694              lsr R10
 0036           L3:
 0036                   .dbline 60
 0036           ;           TWBR = bitrate_div; 
 0036 A0B8              out 0x0,R10
 0038                   .dbline -2
 0038           L2:
 0038 0E940000          xcall pop_gset3
 003C                   .dbline 0 ; func end
 003C 0895              ret
 003E                   .dbsym r bitrate_div 10 c
 003E                   .dbsym r bitrateKHz 10 i
 003E                   .dbend
 003E                   .dbfunc e i2cInit _i2cInit fV
                        .even
 003E           _i2cInit::
 003E                   .dbline -1
 003E                   .dbline 65
 003E           ; } 
 003E           ; 
 003E           ; //总线初始化 
 003E           ; void i2cInit(void) 
 003E           ; { 
 003E                   .dbline 68
 003E           ; 
 003E           ;     // I2C总线使能 
 003E           ;     TWCR|=1<<TWEN; 
 003E 86B7              in R24,0x36
 0040 8460              ori R24,4
 0042 86BF              out 0x36,R24
 0044                   .dbline 70
 0044           ;     // 状态设置 
 0044           ;     I2cState = I2C_IDLE; 
 0044 2224              clr R2
 0046 20921000          sts _I2cState,R2
 004A                   .dbline 72
 004A           ;     // 开I2C中断和回应 
 004A           ;     TWCR|=1<<TWIE; 
 004A 86B7              in R24,0x36
 004C 8160              ori R24,1
 004E 86BF              out 0x36,R24
 0050                   .dbline 73
 0050           ;     TWCR|=1<<TWEA; 
 0050 86B7              in R24,0x36
 0052 8064              ori R24,64
 0054 86BF              out 0x36,R24
 0056                   .dbline -2
 0056           L5:
 0056                   .dbline 0 ; func end
 0056 0895              ret
 0058                   .dbend
 0058                   .dbfunc e i2cSetLocalDeviceAddr _i2cSetLocalDeviceAddr fV
 0058           ;      genCallEn -> R18
 0058           ;     deviceAddr -> R16
                        .even
 0058           _i2cSetLocalDeviceAddr::
 0058 0E940000          xcall push_gset1
 005C                   .dbline -1
 005C                   .dbline 82
 005C           ; } 
 005C           ; 
 005C           ; /************************************************************************/
 005C           ; /* 设置本机从地址及是否响应广播
 005C           ; [in]:uchar deviceAddr,设备地址
 005C           ; [in]:uchar genCallEn,广播使能!0-使能,0-不使能                                                                      */
 005C           ; /************************************************************************/
 005C           ; void i2cSetLocalDeviceAddr(unsigned char deviceAddr, unsigned char genCallEn) 
 005C           ; { 
 005C                   .dbline 84
 005C           ;  // 设置本机从地址 (从方式时) 
 005C           ;    TWAR=(deviceAddr&0xFE)|(genCallEn?1:0); 
 005C 2223              tst R18
 005E 19F0              breq L7
 0060 41E0              ldi R20,1
 0062 50E0              ldi R21,0
 0064 02C0              xjmp L8
 0066           L7:
 0066 4427              clr R20
 0068 5527              clr R21
 006A           L8:
 006A 802F              mov R24,R16
 006C 9927              clr R25
 006E 8E7F              andi R24,254
 0070 9070              andi R25,0
 0072 842B              or R24,R20
 0074 952B              or R25,R21
 0076 82B9              out 0x2,R24
 0078                   .dbline -2
 0078           L6:
 0078 0E940000          xcall pop_gset1
 007C                   .dbline 0 ; func end
 007C 0895              ret
 007E                   .dbsym r genCallEn 18 c
 007E                   .dbsym r deviceAddr 16 c
 007E                   .dbend
 007E                   .dbfunc e i2cSendStart _i2cSendStart fV
                        .even
 007E           _i2cSendStart::
 007E                   .dbline -1
 007E                   .dbline 88
 007E           ; } 
 007E           ; 
 007E           ; void i2cSendStart(void) 
 007E           ; { 
 007E                   .dbline 90
 007E           ;     
 007E           ;   TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWSTA); 
 007E 86B7              in R24,0x36
 0080 8F70              andi R24,15
 0082 806A              ori R24,160
 0084 86BF              out 0x36,R24
 0086                   .dbline -2
 0086           L9:
 0086                   .dbline 0 ; func end
 0086 0895              ret
 0088                   .dbend
 0088                   .dbfunc e i2cSendStop _i2cSendStop fV
                        .even
 0088           _i2cSendStop::
 0088                   .dbline -1
 0088                   .dbline 94
 0088           ; } 
 0088           ; 
 0088           ; void i2cSendStop(void) 
 0088           ; { 
 0088                   .dbline 96
 0088           ;    // 发送停止条件,保持TWEA以便从接收 
 0088           ;    TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWEA)|(1<<TWSTO); 
 0088 86B7              in R24,0x36
 008A 8F70              andi R24,15
 008C 806D              ori R24,208
 008E 86BF              out 0x36,R24
 0090                   .dbline -2
 0090           L10:
 0090                   .dbline 0 ; func end
 0090 0895              ret
 0092                   .dbend
 0092                   .dbfunc e i2cWaitForComplete _i2cWaitForComplete fV
                        .even
 0092           _i2cWaitForComplete::
 0092                   .dbline -1
 0092                   .dbline 100
 0092           ; } 
 0092           ; 
 0092           ; void i2cWaitForComplete(void) 
 0092           ; { 
 0092           L12:
 0092                   .dbline 102
 0092           L13:
 0092                   .dbline 102
 0092           ;    // 等待i2c 总线操作完成 
 0092           ;    while( !(TWCR&(1<<TWINT)) ); 
 0092 26B6              in R2,0x36
 0094 27FE              sbrs R2,7
 0096 FDCF              rjmp L12
 0098                   .dbline -2
 0098           L11:
 0098                   .dbline 0 ; func end
 0098 0895              ret
 009A                   .dbend
 009A                   .dbfunc e i2cSendByte _i2cSendByte fV
 009A           ;           data -> R16
                        .even
 009A           _i2cSendByte::
 009A                   .dbline -1
 009A                   .dbline 106
 009A           ; } 
 009A           ; 
 009A           ; void i2cSendByte(unsigned char data) 
 009A           ; { 
 009A                   .dbline 108
 009A           ;    // 装载数据到 TWDR 
 009A           ;           TWDR=data; 
 009A 03B9              out 0x3,R16
 009C                   .dbline 110
 009C           ;    // 发送开始 
 009C           ;           TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT); 
 009C 86B7              in R24,0x36
 009E 8F70              andi R24,15
 00A0 8068              ori R24,128
 00A2 86BF              out 0x36,R24
 00A4                   .dbline -2
 00A4           L15:
 00A4                   .dbline 0 ; func end
 00A4 0895              ret
 00A6                   .dbsym r data 16 c
 00A6                   .dbend
 00A6                   .dbfunc e i2cReceiveByte _i2cReceiveByte fV
 00A6           ;        ackFlag -> R16
                        .even
 00A6           _i2cReceiveByte::
 00A6                   .dbline -1
 00A6                   .dbline 114
 00A6           ; } 
 00A6           ; 
 00A6           ; void i2cReceiveByte(unsigned char ackFlag) 
 00A6           ; { 
 00A6                   .dbline 116

⌨️ 快捷键说明

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