📄 twi_1.lis
字号:
.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 + -