📄 i2c.lis
字号:
;
; /*
; * The function is used to tell the device the the transmission is over.
; * The stop condition is signified by a low-to-high transition of SDA
; * while SCL is high.
; */
; unsigned char i2c_stop(void)
; {
009E .dbline 121
; //scl_lo();
; //I2C_delay();//HOLDING_TIME*3);
; sda_lo();
009E A998 CBI 0x15,1
00A0 .dbline 122
; I2C_delay();//HOLDING_TIME*3);
00A0 AFDF xcall _I2C_delay
00A2 .dbline 123
; scl_hi();
00A2 A89A SBI 0x15,0
00A4 .dbline 124
; I2C_delay();//HOLDING_TIME*3);
00A4 ADDF xcall _I2C_delay
00A6 .dbline 125
; if (!wait_scl_hi())
00A6 D1DF xcall _wait_scl_hi
00A8 1801 movw R2,R16
00AA 2220 tst R2
00AC 19F4 brne L27
00AE .dbline 126
; return FALSE;
00AE 0027 clr R16
00B0 1127 clr R17
00B2 0CC0 xjmp L26
00B4 L27:
00B4 .dbline 128
;
; sda_hi(); /* this triggers the stop */
00B4 A99A SBI 0x15,1
00B6 .dbline 129
; if (!wait_sda_hi())
00B6 B4DF xcall _wait_sda_hi
00B8 1801 movw R2,R16
00BA 2220 tst R2
00BC 19F4 brne L29
00BE .dbline 130
; return FALSE;
00BE 0027 clr R16
00C0 1127 clr R17
00C2 04C0 xjmp L26
00C4 L29:
00C4 .dbline 131
; scl_lo();
00C4 A898 CBI 0x15,0
00C6 .dbline 133
;
; I2C_delay();//HOLDING_TIME*3);
00C6 9CDF xcall _I2C_delay
00C8 .dbline 135
;
; return TRUE;
00C8 01E0 ldi R16,1
00CA 10E0 ldi R17,0
00CC .dbline -2
00CC L26:
00CC .dbline 0 ; func end
00CC 0895 ret
00CE .dbfunc s i2c_putc _i2c_putc fI
; ack -> R20,R21
; mask -> R22
; d -> R10
.even
00CE _i2c_putc::
00CE 0E940000 xcall push_gset3
00D2 A02E mov R10,R16
00D4 .dbline -1
00D4 .dbline 144
; }
;
; /*
; * This function sends one byte on the I2C bus. The bits in the byte are
; * sent in the order of the high bit first and the lowest bit last.
; */
;
; unsigned char i2c_putc(unsigned char d)
; {
00D4 .dbline 149
; unsigned char mask;
; unsigned ack;
;
;
; for (mask = 0x80; mask; mask >>= 1)
00D4 60E8 ldi R22,128
00D6 0CC0 xjmp L35
00D8 L32:
00D8 .dbline 150
; {
00D8 .dbline 151
; if (d & mask)
00D8 2A2C mov R2,R10
00DA 2622 and R2,R22
00DC 2220 tst R2
00DE 11F0 breq L36
00E0 .dbline 152
; sda_hi();
00E0 A99A SBI 0x15,1
00E2 01C0 xjmp L37
00E4 L36:
00E4 .dbline 154
; else
; sda_lo();
00E4 A998 CBI 0x15,1
00E6 L37:
00E6 .dbline 156
00E6 8CDF xcall _I2C_delay
00E8 .dbline 157
00E8 A89A SBI 0x15,0
00EA .dbline 158
00EA 8ADF xcall _I2C_delay
00EC .dbline 159
00EC A898 CBI 0x15,0
00EE .dbline 161
00EE L33:
00EE .dbline 149
00EE 6695 lsr R22
00F0 L35:
00F0 .dbline 149
00F0 6623 tst R22
00F2 91F7 brne L32
00F4 .dbline 164
;
; I2C_delay();//HOLDING_TIME); // SEC LEE0216
; scl_hi();
; I2C_delay();//HOLDING_TIME);
; scl_lo();
; //Idelay_us(5);//HOLDING_TIME);
; }
;
; //sda_hi(); /* ack handshake after every byte */
; sda_set_input();
00F4 A198 CBI 0x14,1
00F6 .dbline 165
; I2C_delay();//HOLDING_TIME);
00F6 84DF xcall _I2C_delay
00F8 .dbline 167
;
; scl_hi();
00F8 A89A SBI 0x15,0
00FA .dbline 168
; I2C_delay();//HOLDING_TIME);
00FA 82DF xcall _I2C_delay
00FC .dbline 170
;
; if (!is_sda_hi()) /* sda low means an ack */
00FC 9999 sbic 0x13,1
00FE 03C0 rjmp L38
0100 .dbline 171
; ack = TRUE;
0100 41E0 ldi R20,1
0102 50E0 ldi R21,0
0104 02C0 xjmp L39
0106 L38:
0106 .dbline 173
; else
; ack = FALSE;
0106 4427 clr R20
0108 5527 clr R21
010A L39:
010A .dbline 175
;
; scl_lo();
010A A898 CBI 0x15,0
010C .dbline 176
; I2C_delay();//HOLDING_TIME); // SEC LEE0216
010C 79DF xcall _I2C_delay
010E .dbline 177
; sda_set_output();
010E A19A SBI 0x14,1
0110 .dbline 178
; return ack;
0110 042F mov R16,R20
0112 1127 clr R17
0114 .dbline -2
0114 L31:
0114 0E940000 xcall pop_gset3
0118 .dbline 0 ; func end
0118 0895 ret
011A .dbsym r ack 20 i
011A .dbsym r mask 22 c
011A .dbsym r d 10 c
011A .dbfunc s i2c_getc _i2c_getc fI
; i -> R10
; d -> R20
; rdack -> R22,R23
.even
011A _i2c_getc::
011A 0E940000 xcall push_gset3
011E B801 movw R22,R16
0120 .dbline -1
0120 .dbline 189
; }
;
; /*
; * This function is used to get data from another I2C device. The |rdack|
; * parameter is used to tell the device if we want to read more bytes. If
; * |rdack| is true then we want to receive the byte at the next address,
; * otherwise we don't want anymore bytes.
; */
;
; unsigned char i2c_getc(unsigned rdack)
; {
0120 .dbline 194
; register unsigned char d;
; register unsigned char i;
;
; //sda_hi(); /* don't drive the data line */
; sda_set_input();
0120 A198 CBI 0x14,1
0122 .dbline 195
; d=0;
0122 4427 clr R20
0124 .dbline 196
0124 AA24 clr R10
0126 10C0 xjmp L44
0128 L41:
0128 .dbline 196
; for (i = 0; i < 8; i++) {
0128 .dbline 197
; d <<= 1;
0128 440F lsl R20
012A .dbline 199
;
; scl_hi(); /* drive clock high to get data */
012A A89A SBI 0x15,0
012C .dbline 200
; I2C_delay();//HOLDING_TIME);
012C 69DF xcall _I2C_delay
012E .dbline 202
;
; if (!wait_scl_hi())
012E 8DDF xcall _wait_scl_hi
0130 1801 movw R2,R16
0132 2220 tst R2
0134 19F4 brne L45
0136 .dbline 203
; return 0xFF; /* i2c error */
0136 0FEF ldi R16,255
0138 10E0 ldi R17,0
013A 1DC0 xjmp L40
013C L45:
013C .dbline 205
;
; if (is_sda_hi())
013C 999B sbis 0x13,1
013E 01C0 rjmp L47
0140 .dbline 206
; d |= 1; /* bit is a one */
0140 4160 ori R20,1
0142 L47:
0142 .dbline 208
0142 A898 CBI 0x15,0
0144 .dbline 209
0144 5DDF xcall _I2C_delay
0146 .dbline 210
0146 L42:
0146 .dbline 196
0146 A394 inc R10
0148 L44:
0148 .dbline 196
0148 8A2D mov R24,R10
014A 8830 cpi R24,8
014C 68F3 brlo L41
014E .dbline 212
;
; scl_lo(); /* drive clock back down */
; I2C_delay();//HOLDING_TIME);
; }
;
; sda_set_output();
014E A19A SBI 0x14,1
0150 .dbline 213
; if (rdack)
0150 6030 cpi R22,0
0152 6707 cpc R22,R23
0154 09F0 breq L49
0156 .dbline 214
; sda_lo(); /* send an ack */
0156 A998 CBI 0x15,1
0158 L49:
0158 .dbline 216
;
; scl_hi();
0158 A89A SBI 0x15,0
015A .dbline 218
;
; if (!wait_scl_hi())
015A 77DF xcall _wait_scl_hi
015C 1801 movw R2,R16
015E 2220 tst R2
0160 19F4 brne L51
0162 .dbline 219
; return 0xFF; /* i2c error */
0162 0FEF ldi R16,255
0164 10E0 ldi R17,0
0166 07C0 xjmp L40
0168 L51:
0168 .dbline 220
; scl_lo();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -