📄 twi_master_drv.lis
字号:
.module twi_master_drv.c
.area text(rom, con, rel)
0000 .dbfile F:\zzz\i2c-master\twi_master_drv.c
0000 .dbfunc e twi_lib_init _twi_lib_init fV
.even
0000 _twi_lib_init::
0000 .dbline -1
0000 .dbline 19
0000 ; /*头文件*/
0000 ; #include "twi_master_drv.h"
0000 ;
0000 ; /*全局变量定义*/
0000 ; uchar twi_busy; //=FALSE,TWI通讯空闲;=TRUE,TWI通讯忙
0000 ; uchar twi_err; //TWI通讯状态
0000 ; uchar twi_nb_transmited; //收发字节数
0000 ; //uchar twi_recptr;
0000 ;
0000 ; TWI_MSG twi_message; //TWI数据结构
0000 ;
0000 ; /*****************************************************************************
0000 ; 函数介绍:TWI初始化,设置通讯波特率和启动通讯
0000 ; 输入参数:
0000 ; 输出参数:
0000 ; 返回值:无
0000 ; *****************************************************************************/
0000 ; void twi_lib_init(void)
0000 ; {
0000 .dbline 24
0000 ; //Twi_set_baudrate(0xf9); //8MOSC 1K
0000 ; //Twi_set_status(0x02);
0000 ; //Twi_set_baudrate(0x62); //8MOSC 10K
0000 ; //Twi_set_status(0x01);
0000 ; Twi_set_baudrate(0x20); //8MOSC 100K
0000 80E2 ldi R24,32
0002 8093B800 sts 184,R24
0006 .dbline 25
0006 ; Twi_set_status(0x00);
0006 2224 clr R2
0008 2092B900 sts 185,R2
000C .dbline 28
000C ;
000C ; //Twi_set_address(0x51);
000C ; Twi_init_hw(TWI_CONFIG);
000C 84E0 ldi R24,4
000E 8093BC00 sts 188,R24
0012 .dbline -2
0012 L2:
0012 .dbline 0 ; func end
0012 0895 ret
0014 .dbend
0014 .dbfunc e twi_decode_status _twi_decode_status fV
.even
0014 _twi_decode_status::
0014 .dbline -1
0014 .dbline 39
0014 ; }
0014 ;
0014 ; /*****************************************************************************
0014 ; 函数介绍:在从机或主机模式下,TWI信息的收发的主流程状态。
0014 ; 此函数在TWI通讯事件发生时,对各个状态进行解码,查询和中断方式都可以。
0014 ; 输入参数:
0014 ; 输出参数:
0014 ; 返回值:无
0014 ; *****************************************************************************/
0014 ; void twi_decode_status()
0014 ; {
0014 .dbline 40
0014 ; switch ( Twi_get_status()&0xF8 ) // switch (SSTA)
0014 0091B900 lds R16,185
0018 1127 clr R17
001A 087F andi R16,248
001C 1070 andi R17,0
001E 0832 cpi R16,40
0020 E0E0 ldi R30,0
0022 1E07 cpc R17,R30
0024 09F4 brne X2
0026 C1C0 xjmp L22
0028 X2:
0028 88E2 ldi R24,40
002A 90E0 ldi R25,0
002C 8017 cp R24,R16
002E 9107 cpc R25,R17
0030 4CF1 brlt L46
0032 L45:
0032 0031 cpi R16,16
0034 E0E0 ldi R30,0
0036 1E07 cpc R17,R30
0038 09F4 brne X3
003A 74C0 xjmp L12
003C X3:
003C 80E1 ldi R24,16
003E 90E0 ldi R25,0
0040 8017 cp R24,R16
0042 9107 cpc R25,R17
0044 7CF0 brlt L48
0046 L47:
0046 0030 cpi R16,0
0048 0107 cpc R16,R17
004A 09F4 brne X4
004C 4BC0 xjmp L7
004E X4:
004E X0:
004E 0030 cpi R16,0
0050 E0E0 ldi R30,0
0052 1E07 cpc R17,R30
0054 0CF4 brge X5
0056 59C1 xjmp L4
0058 X5:
0058 L49:
0058 0830 cpi R16,8
005A E0E0 ldi R30,0
005C 1E07 cpc R17,R30
005E 09F4 brne X6
0060 48C0 xjmp L8
0062 X6:
0062 53C1 xjmp L4
0064 L48:
0064 0831 cpi R16,24
0066 E0E0 ldi R30,0
0068 1E07 cpc R17,R30
006A 09F4 brne X7
006C 74C0 xjmp L16
006E X7:
006E 0831 cpi R16,24
0070 E0E0 ldi R30,0
0072 1E07 cpc R17,R30
0074 0CF4 brge X8
0076 49C1 xjmp L4
0078 X8:
0078 L50:
0078 0032 cpi R16,32
007A E0E0 ldi R30,0
007C 1E07 cpc R17,R30
007E 09F4 brne X9
0080 88C0 xjmp L21
0082 X9:
0082 43C1 xjmp L4
0084 L46:
0084 0034 cpi R16,64
0086 E0E0 ldi R30,0
0088 1E07 cpc R17,R30
008A 09F4 brne X10
008C CFC0 xjmp L30
008E X10:
008E 80E4 ldi R24,64
0090 90E0 ldi R25,0
0092 8017 cp R24,R16
0094 9107 cpc R25,R17
0096 84F0 brlt L52
0098 L51:
0098 0033 cpi R16,48
009A E0E0 ldi R30,0
009C 1E07 cpc R17,R30
009E 09F4 brne X11
00A0 ADC0 xjmp L28
00A2 X11:
00A2 0033 cpi R16,48
00A4 E0E0 ldi R30,0
00A6 1E07 cpc R17,R30
00A8 0CF4 brge X12
00AA 2FC1 xjmp L4
00AC X12:
00AC L53:
00AC 0833 cpi R16,56
00AE E0E0 ldi R30,0
00B0 1E07 cpc R17,R30
00B2 09F4 brne X13
00B4 AFC0 xjmp L29
00B6 X13:
00B6 29C1 xjmp L4
00B8 L52:
00B8 0035 cpi R16,80
00BA E0E0 ldi R30,0
00BC 1E07 cpc R17,R30
00BE 09F4 brne X14
00C0 E3C0 xjmp L38
00C2 X14:
00C2 80E5 ldi R24,80
00C4 90E0 ldi R25,0
00C6 8017 cp R24,R16
00C8 9107 cpc R25,R17
00CA 34F0 brlt L55
00CC L54:
00CC 0834 cpi R16,72
00CE E0E0 ldi R30,0
00D0 1E07 cpc R17,R30
00D2 09F4 brne X15
00D4 CDC0 xjmp L37
00D6 X15:
00D6 19C1 xjmp L4
00D8 L55:
00D8 0835 cpi R16,88
00DA E0E0 ldi R30,0
00DC 1E07 cpc R17,R30
00DE 09F4 brne X16
00E0 FCC0 xjmp L43
00E2 X16:
00E2 13C1 xjmp L4
00E4 X1:
00E4 .dbline 41
00E4 ; {
00E4 L7:
00E4 .dbline 45
00E4 ; // STATE 00h: Bus Error has occurred
00E4 ; // ACTION: Enter not addressed SLV mode and release bus
00E4 ; case 0x00 :
00E4 ; twi_busy = FALSE;
00E4 2224 clr R2
00E6 20920200 sts _twi_busy,R2
00EA .dbline 46
00EA ; twi_err = TWI_BUS_ERROR;
00EA 82E0 ldi R24,2
00EC 80930100 sts _twi_err,R24
00F0 .dbline 47
00F0 ; break;
00F0 17C1 xjmp L5
00F2 L8:
00F2 .dbline 53
00F2 ;
00F2 ;
00F2 ; //STATE 08h: A start condition has been sent
00F2 ; //ACTION: SLR+R/W are transmitted, ACK bit received
00F2 ; case 0x08 :
00F2 ; Twi_clear_start(); //Pas besoin fait en hard ???
00F2 8091BC00 lds R24,188
00F6 8F75 andi R24,95
00F8 8093BC00 sts 188,R24
00FC .dbline 54
00FC ; Twi_set_data(twi_message.address<<1);
00FC 20900300 lds R2,_twi_message
0100 220C lsl R2
0102 2092BB00 sts 187,R2
0106 .dbline 55
0106 ; if ( twi_message.rw == TWI_READ )
0106 80910400 lds R24,_twi_message+1
010A 8130 cpi R24,1
010C 29F4 brne L9
010E .dbline 56
010E ; {
010E .dbline 57
010E ; Twi_set_data(Twi_get_data()+1); // Add 1 for Read bit in AdrWord modify by zmq
010E 8091BB00 lds R24,187
0112 8F5F subi R24,255 ; addi 1
0114 8093BB00 sts 187,R24
0118 .dbline 58
0118 ; }
0118 L9:
0118 .dbline 59
0118 ; Twi_set_aa(); //from here to 0x18 transmit or 0x40 receive
0118 8091BC00 lds R24,188
011C 8064 ori R24,64
011E 8093BC00 sts 188,R24
0122 .dbline 60
0122 ; break;
0122 FEC0 xjmp L5
0124 L12:
0124 .dbline 65
0124 ;
0124 ; //STATE 10h: A repeated start condition has been sent
0124 ; //ACTION: SLR+R/W are transmitted, ACK bit received
0124 ; case 0x10 :
0124 ; Twi_clear_start(); // Reset STA bit in SSCON
0124 8091BC00 lds R24,188
0128 8F75 andi R24,95
012A 8093BC00 sts 188,R24
012E .dbline 66
012E ; Twi_set_data(twi_message.address<<1);
012E 20900300 lds R2,_twi_message
0132 220C lsl R2
0134 2092BB00 sts 187,R2
0138 .dbline 67
0138 ; if ( twi_message.rw == TWI_READ )
0138 80910400 lds R24,_twi_message+1
013C 8130 cpi R24,1
013E 29F4 brne L13
0140 .dbline 68
0140 ; {
0140 .dbline 69
0140 ; Twi_set_data(Twi_get_data()+1); // Add 1 for Read bit in AdrWord modify by zmq
0140 8091BB00 lds R24,187
0144 8F5F subi R24,255 ; addi 1
0146 8093BB00 sts 187,R24
014A .dbline 70
014A ; }
014A L13:
014A .dbline 71
014A ; Twi_set_aa(); // wait on ACK bit
014A 8091BC00 lds R24,188
014E 8064 ori R24,64
0150 8093BC00 sts 188,R24
0154 .dbline 72
0154 ; break;
0154 E5C0 xjmp L5
0156 L16:
0156 .dbline 78
0156 ;
0156 ; //STATE 18h: SLR+W was transmitted, ACK bit received
0156 ; //ACTION: Transmit data byte, ACK bit received
0156 ; //PREVIOUS STATE: 0x08 or 0x10
0156 ; case 0x18 : // master transmit, after sending
0156 ; twi_nb_transmited=0; // slave address, now load data
0156 2224 clr R2
0158 20920000 sts _twi_nb_transmited,R2
015C .dbline 79
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -