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

📄 i2c-master.lst

📁 at90can128底层驱动 有SPI,TWI,总线,CAN接口等
💻 LST
📖 第 1 页 / 共 3 页
字号:
__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 + -