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

📄 i2c.lis

📁 sunplus spca514 cdmp3 源码
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                       ; 
                       ; /*
                       ;  * 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 + -