📄 i2c-master.lst
字号:
__start:
__text_start:
004C EFCF LDI R28,0xFF
004D E1D0 LDI R29,0x10
004E BFCD OUT 0x3D,R28
004F BFDE OUT 0x3E,R29
0050 51C0 SUBI R28,0x10
0051 40D0 SBCI R29,0
0052 EA0A LDI R16,0xAA
0053 8308 STD Y+0,R16
0054 2400 CLR R0
0055 E0E0 LDI R30,0
0056 E0F1 LDI R31,1
0057 E011 LDI R17,1
0058 30E8 CPI R30,0x8
0059 07F1 CPC R31,R17
005A F011 BEQ 0x005D
005B 9201 ST R0,Z+
005C CFFB RJMP 0x0058
005D 8300 STD Z+0,R16
005E E9E7 LDI R30,0x97
005F E0F0 LDI R31,0
0060 E0A0 LDI R26,0
0061 E0B1 LDI R27,1
0062 E010 LDI R17,0
0063 39E7 CPI R30,0x97
0064 07F1 CPC R31,R17
0065 F021 BEQ 0x006A
0066 95C8 LPM
0067 9631 ADIW R30,1
0068 920D ST R0,X+
0069 CFF9 RJMP 0x0063
006A 940E029D CALL _main
_exit:
006C CFFF RJMP _exit
FILE: F:\zzz\i2c-master\twi_master_drv.c
(0001) /*头文件*/
(0002) #include "twi_master_drv.h"
(0003)
(0004) /*全局变量定义*/
(0005) uchar twi_busy; //=FALSE,TWI通讯空闲;=TRUE,TWI通讯忙
(0006) uchar twi_err; //TWI通讯状态
(0007) uchar twi_nb_transmited; //收发字节数
(0008) //uchar twi_recptr;
(0009)
(0010) TWI_MSG twi_message; //TWI数据结构
(0011)
(0012) /*****************************************************************************
(0013) 函数介绍:TWI初始化,设置通讯波特率和启动通讯
(0014) 输入参数:
(0015) 输出参数:
(0016) 返回值:无
(0017) *****************************************************************************/
(0018) void twi_lib_init(void)
(0019) {
(0020) //Twi_set_baudrate(0xf9); //8MOSC 1K
(0021) //Twi_set_status(0x02);
(0022) //Twi_set_baudrate(0x62); //8MOSC 10K
(0023) //Twi_set_status(0x01);
(0024) Twi_set_baudrate(0x20); //8MOSC 100K
_twi_lib_init:
006D E280 LDI R24,0x20
006E 938000B8 STS 0xB8,R24
(0025) Twi_set_status(0x00);
0070 2422 CLR R2
0071 922000B9 STS 0xB9,R2
(0026)
(0027) //Twi_set_address(0x51);
(0028) Twi_init_hw(TWI_CONFIG);
0073 E084 LDI R24,4
0074 938000BC STS 0xBC,R24
0076 9508 RET
(0029) }
(0030)
(0031) /*****************************************************************************
(0032) 函数介绍:在从机或主机模式下,TWI信息的收发的主流程状态。
(0033) 此函数在TWI通讯事件发生时,对各个状态进行解码,查询和中断方式都可以。
(0034) 输入参数:
(0035) 输出参数:
(0036) 返回值:无
(0037) *****************************************************************************/
(0038) void twi_decode_status()
(0039) {
(0040) switch ( Twi_get_status()&0xF8 ) // switch (SSTA)
_twi_decode_status:
0077 910000B9 LDS R16,0xB9
0079 2711 CLR R17
007A 7F08 ANDI R16,0xF8
007B 7010 ANDI R17,0
007C 3208 CPI R16,0x28
007D E0E0 LDI R30,0
007E 071E CPC R17,R30
007F F409 BNE 0x0081
0080 C0C1 RJMP 0x0142
0081 E288 LDI R24,0x28
0082 E090 LDI R25,0
0083 1780 CP R24,R16
0084 0791 CPC R25,R17
0085 F14C BLT 0x00AF
0086 3100 CPI R16,0x10
0087 E0E0 LDI R30,0
0088 071E CPC R17,R30
0089 F409 BNE 0x008B
008A C074 RJMP 0x00FF
008B E180 LDI R24,0x10
008C E090 LDI R25,0
008D 1780 CP R24,R16
008E 0791 CPC R25,R17
008F F07C BLT 0x009F
0090 3000 CPI R16,0
0091 0701 CPC R16,R17
0092 F409 BNE 0x0094
0093 C04B RJMP 0x00DF
0094 3000 CPI R16,0
0095 E0E0 LDI R30,0
0096 071E CPC R17,R30
0097 F40C BGE 0x0099
0098 C159 RJMP 0x01F2
0099 3008 CPI R16,0x8
009A E0E0 LDI R30,0
009B 071E CPC R17,R30
009C F409 BNE 0x009E
009D C048 RJMP 0x00E6
009E C153 RJMP 0x01F2
009F 3108 CPI R16,0x18
00A0 E0E0 LDI R30,0
00A1 071E CPC R17,R30
00A2 F409 BNE 0x00A4
00A3 C074 RJMP 0x0118
00A4 3108 CPI R16,0x18
00A5 E0E0 LDI R30,0
00A6 071E CPC R17,R30
00A7 F40C BGE 0x00A9
00A8 C149 RJMP 0x01F2
00A9 3200 CPI R16,0x20
00AA E0E0 LDI R30,0
00AB 071E CPC R17,R30
00AC F409 BNE 0x00AE
00AD C088 RJMP 0x0136
00AE C143 RJMP 0x01F2
00AF 3400 CPI R16,0x40
00B0 E0E0 LDI R30,0
00B1 071E CPC R17,R30
00B2 F409 BNE 0x00B4
00B3 C0CF RJMP 0x0183
00B4 E480 LDI R24,0x40
00B5 E090 LDI R25,0
00B6 1780 CP R24,R16
00B7 0791 CPC R25,R17
00B8 F084 BLT 0x00C9
00B9 3300 CPI R16,0x30
00BA E0E0 LDI R30,0
00BB 071E CPC R17,R30
00BC F409 BNE 0x00BE
00BD C0AD RJMP 0x016B
00BE 3300 CPI R16,0x30
00BF E0E0 LDI R30,0
00C0 071E CPC R17,R30
00C1 F40C BGE 0x00C3
00C2 C12F RJMP 0x01F2
00C3 3308 CPI R16,0x38
00C4 E0E0 LDI R30,0
00C5 071E CPC R17,R30
00C6 F409 BNE 0x00C8
00C7 C0AF RJMP 0x0177
00C8 C129 RJMP 0x01F2
00C9 3500 CPI R16,0x50
00CA E0E0 LDI R30,0
00CB 071E CPC R17,R30
00CC F409 BNE 0x00CE
00CD C0E3 RJMP 0x01B1
00CE E580 LDI R24,0x50
00CF E090 LDI R25,0
00D0 1780 CP R24,R16
00D1 0791 CPC R25,R17
00D2 F034 BLT 0x00D9
00D3 3408 CPI R16,0x48
00D4 E0E0 LDI R30,0
00D5 071E CPC R17,R30
00D6 F409 BNE 0x00D8
00D7 C0CD RJMP 0x01A5
00D8 C119 RJMP 0x01F2
00D9 3508 CPI R16,0x58
00DA E0E0 LDI R30,0
00DB 071E CPC R17,R30
00DC F409 BNE 0x00DE
00DD C0FC RJMP 0x01DA
00DE C113 RJMP 0x01F2
(0041) {
(0042) // STATE 00h: Bus Error has occurred
(0043) // ACTION: Enter not addressed SLV mode and release bus
(0044) case 0x00 :
(0045) twi_busy = FALSE;
00DF 2422 CLR R2
00E0 92200102 STS twi_busy,R2
(0046) twi_err = TWI_BUS_ERROR;
00E2 E082 LDI R24,2
00E3 93800101 STS twi_err,R24
(0047) break;
00E5 C117 RJMP 0x01FD
(0048)
(0049)
(0050) //STATE 08h: A start condition has been sent
(0051) //ACTION: SLR+R/W are transmitted, ACK bit received
(0052) case 0x08 :
(0053) Twi_clear_start(); //Pas besoin fait en hard ???
00E6 918000BC LDS R24,0xBC
00E8 758F ANDI R24,0x5F
00E9 938000BC STS 0xBC,R24
(0054) Twi_set_data(twi_message.address<<1);
00EB 90200103 LDS R2,twi_message
00ED 0C22 LSL R2
00EE 922000BB STS 0xBB,R2
(0055) if ( twi_message.rw == TWI_READ )
00F0 91800104 LDS R24,twi_message+1
00F2 3081 CPI R24,1
00F3 F429 BNE 0x00F9
(0056) {
(0057) Twi_set_data(Twi_get_data()+1); // Add 1 for Read bit in AdrWord modify by zmq
00F4 918000BB LDS R24,0xBB
00F6 5F8F SUBI R24,0xFF
00F7 938000BB STS 0xBB,R24
(0058) }
(0059) Twi_set_aa(); //from here to 0x18 transmit or 0x40 receive
00F9 918000BC LDS R24,0xBC
00FB 6480 ORI R24,0x40
00FC 938000BC STS 0xBC,R24
(0060) break;
00FE C0FE RJMP 0x01FD
(0061)
(0062) //STATE 10h: A repeated start condition has been sent
(0063) //ACTION: SLR+R/W are transmitted, ACK bit received
(0064) case 0x10 :
(0065) Twi_clear_start(); // Reset STA bit in SSCON
00FF 918000BC LDS R24,0xBC
0101 758F ANDI R24,0x5F
0102 938000BC STS 0xBC,R24
(0066) Twi_set_data(twi_message.address<<1);
0104 90200103 LDS R2,twi_message
0106 0C22 LSL R2
0107 922000BB STS 0xBB,R2
(0067) if ( twi_message.rw == TWI_READ )
0109 91800104 LDS R24,twi_message+1
010B 3081 CPI R24,1
010C F429 BNE 0x0112
(0068) {
(0069) Twi_set_data(Twi_get_data()+1); // Add 1 for Read bit in AdrWord modify by zmq
010D 918000BB LDS R24,0xBB
010F 5F8F SUBI R24,0xFF
0110 938000BB STS 0xBB,R24
(0070) }
(0071) Twi_set_aa(); // wait on ACK bit
0112 918000BC LDS R24,0xBC
0114 6480 ORI R24,0x40
0115 938000BC STS 0xBC,R24
(0072) break;
0117 C0E5 RJMP 0x01FD
(0073)
(0074) //STATE 18h: SLR+W was transmitted, ACK bit received
(0075) //ACTION: Transmit data byte, ACK bit received
(0076) //PREVIOUS STATE: 0x08 or 0x10
(0077) case 0x18 : // master transmit, after sending
(0078) twi_nb_transmited=0; // slave address, now load data
0118 2422 CLR R2
0119 92200100 STS twi_nb_transmited,R2
(0079) Twi_set_data(*(twi_message.buf)); // byte and send it
011B 91E00106 LDS R30,twi_message+3
011D 91F00107 LDS R31,0x107
011F 8020 LDD R2,Z+0
0120 922000BB STS 0xBB,R2
(0080)
(0081) if (twi_message.nbbytes==0) // no datas to transmit
0122 90200105 LDS R2,twi_message+2
0124 2022 TST R2
0125 F451 BNE 0x0130
(0082) {
(0083) Twi_set_stop();
0126 918000BC LDS R24,0xBC
0128 6180 ORI R24,0x10
0129 938000BC STS 0xBC,R24
(0084) twi_err = TWI_TRANSFER_OK;
012B 2422 CLR R2
012C 92200101 STS twi_err,R2
(0085) twi_busy = FALSE; // transfer complete, clear twi_busy
012E 92200102 STS twi_busy,R2
(0086) }
(0087) Twi_clear_si();
0130 918000BC LDS R24,0xBC
0132 6880 ORI R24,0x80
0133 938000BC STS 0xBC,R24
(0088) break;
0135 C0C7 RJMP 0x01FD
(0089)
(0090) //STATE 20h: SLR+W was transmitted, NOT ACK bit received
(0091) //ACTION: Transmit STOP
(0092) case 0x20 :
(0093) Twi_set_stop(); // Twi_set_stop will also clear twiint flag
0136 918000BC LDS R24,0xBC
0138 6180 ORI R24,0x10
0139 938000BC STS 0xBC,R24
(0094) twi_busy = FALSE;
013B 2422 CLR R2
013C 92200102 STS twi_busy,R2
(0095) twi_err = TWI_HOST_ADR_NACK;
013E E083 LDI R24,3
013F 93800101 STS twi_err,R24
(0096) break;
0141 C0BB RJMP 0x01FD
(0097)
(0098) //STATE 28h: DATA was transmitted, ACK bit received
(0099) //ACTION: If last byte, send STOP, else send more data bytes
(0100) case 0x28: // master transmit, after sending ; data byte, ACK received
(0101) twi_nb_transmited++; // inc nb data transmit on message
0142 91800100 LDS R24,twi_nb_transmited
0144 5F8F SUBI R24,0xFF
0145 93800100 STS twi_nb_transmited,R24
(0102) twi_message.buf++; // inc pointer ti data to be transmited
0147 91800106 LDS R24,twi_message+3
0149 91900107 LDS R25,0x107
014B 9601 ADIW R24,1
014C 93900107 STS 0x107,R25
014E 93800106 STS twi_message+3,R24
(0103) if ( twi_nb_transmited < twi_message.nbbytes ) // if there are still bytes to send
0150 90200105 LDS R2,twi_message+2
0152 90300100 LDS R3,twi_nb_transmited
0154 1432 CP R3,R2
0155 F450 BCC 0x0160
(0104) {
(0105) Twi_set_data(*(twi_message.buf));
0156 01FC MOVW R30,R24
0157 8020 LDD R2,Z+0
0158 922000BB STS 0xBB,R2
(0106) Twi_set_aa(); // wait on ACK bit
015A 918000BC LDS R24,0xBC
015C 6480 ORI R24,0x40
015D 938000BC STS 0xBC,R24
(0107) }
015F C09D RJMP 0x01FD
(0108) else
(0109) { //run out of data, send stop,
(0110) Twi_set_stop(); // Twi_set_stop will also clear twiint flag
0160 918000BC LDS R24,0xBC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -