📄 24c01a.lst
字号:
__start:
__text_start:
0035 E5CF LDI R28,0x5F
0036 E0D4 LDI R29,4
0037 BFCD OUT 0x3D,R28
0038 BFDE OUT 0x3E,R29
0039 51C0 SUBI R28,0x10
003A 40D0 SBCI R29,0
003B EA0A LDI R16,0xAA
003C 8308 STD Y+0,R16
003D 2400 CLR R0
003E E6E0 LDI R30,0x60
003F E0F0 LDI R31,0
0040 E010 LDI R17,0
0041 36E0 CPI R30,0x60
0042 07F1 CPC R31,R17
0043 F011 BEQ 0x0046
0044 9201 ST R0,Z+
0045 CFFB RJMP 0x0041
0046 8300 STD Z+0,R16
0047 E6EA LDI R30,0x6A
0048 E0F0 LDI R31,0
0049 E6A0 LDI R26,0x60
004A E0B0 LDI R27,0
004B E010 LDI R17,0
004C 36EA CPI R30,0x6A
004D 07F1 CPC R31,R17
004E F021 BEQ 0x0053
004F 95C8 LPM
0050 9631 ADIW R30,1
0051 920D ST R0,X+
0052 CFF9 RJMP 0x004C
0053 940E022F CALL _main
_exit:
0055 CFFF RJMP _exit
FILE: D:\24C01A\I2C.h
(0001) /*--------------------------文件说明----------------------------------
(0002) 文件用途 :TWI/I2C驱动,查询方式,主机模式
(0003) 原创者 :SEE
(0004) 修改者 :programshao
(0005) 最后修改时间 :2007-05-03
(0006) 使用说明 :调用最后6个API函数进行I2C读写
(0007) 调试说明 :ATmega16L+ICC+AVR studio 4 环境下调试通过。
(0008) 注意事项 :根据原创者意愿,如用于商业用途请注明文件来源。
(0009)
(0010) --------------------------------------------------------------------*/
(0011) #ifndef I2C_H
(0012) #define I2C_H
(0013)
(0014) /* define TWSR values (not bits) */
(0015) /* Master */
(0016) #define I2C_START 0x08
(0017) #define I2C_RESTART 0x10
(0018)
(0019) /* Master Transmitter */
(0020) #define I2C_MT_SLA_ACK 0x18
(0021) #define I2C_MT_SLA_NACK 0x20
(0022) #define I2C_MT_DATA_ACK 0x28
(0023) #define I2C_MT_DATA_NACK 0x30
(0024) #define I2C_MT_ARB_LOST 0x38
(0025)
(0026) /* Master Receiver */
(0027) #define I2C_MR_ARB_LOST 0x38
(0028) #define I2C_MR_SLA_ACK 0x40
(0029) #define I2C_MR_SLA_NACK 0x48
(0030) #define I2C_MR_DATA_ACK 0x50
(0031) #define I2C_MR_DATA_NACK 0x58
(0032)
(0033) /* Slave Receiver */
(0034) #define I2C_SR_SLA_ACK 0x60
(0035) #define I2C_SR_ARB_LOST_SLA_ACK 0x68
(0036) #define I2C_SR_GCALL_ACK 0x70
(0037) #define I2C_SR_ARB_LOST_GCALL_ACK 0x78
(0038) #define I2C_SR_DATA_ACK 0x80
(0039) #define I2C_SR_DATA_NACK 0x88
(0040) #define I2C_SR_GCALL_DATA_ACK 0x90
(0041) #define I2C_SR_GCALL_DATA_NACK 0x98
(0042) #define I2C_SR_STOP 0xA0
(0043)
(0044) /* Slave Transmitter */
(0045) #define I2C_ST_SLA_ACK 0xA8
(0046) #define I2C_ST_ARB_LOST_SLA_ACK 0xB0
(0047) #define I2C_ST_DATA_ACK 0xB8
(0048) #define I2C_ST_DATA_NACK 0xC0
(0049) #define I2C_ST_LAST_DATA 0xC8
(0050)
(0051) /* Misc */
(0052) #define I2C_NO_INFO 0xF8
(0053) #define I2C_BUS_ERROR 0x00
(0054)
(0055)
(0056)
(0057) /*定义SLA中读写控制位极性*/
(0058) #define I2C_READ 1
(0059) #define I2C_WRITE 0
(0060)
(0061) #define I2CStart() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
(0062) #define I2CStop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
(0063) #define I2C_STATUS (TWSR & 0xf8)
(0064) #define I2CSendAck() (TWCR|=(1<<TWEA))
(0065) #define I2CSendNoAck() (TWCR&=~(1<<TWEA))
(0066) #define I2CRcvNckByte() (TWCR=(1<<TWINT)|(1<<TWEN))
(0067) #define I2CRcvAckByte() (TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA))
(0068)
(0069) /*定义运行状态返回值极性*/
(0070) #define I2C_ERR 0 //错误
(0071) #define I2C_CRR 1 //正确
(0072)
(0073) /*定义TWINT位置位查询等待时间*/
(0074) #define WAITCOUNT 50
(0075)
(0076) /*--------------------------------------------------------------------
(0077) 函数名称:I2C_Init
(0078) 函数功能:TWI初始化
(0079) 注意事项:(须根据具体情况设置)
(0080) 提示说明:
(0081) 输 入:
(0082) 返 回:
(0083) --------------------------------------------------------------------*/
(0084) void I2C_Init(void)
(0085) {
(0086) TWBR=0x0f;//波特率设置,必须大于 10
_I2C_Init:
0056 E08F LDI R24,0xF
0057 B980 OUT 0x00,R24
0058 9508 RET
(0087) //TWAR= //从机地址和通用呼叫设置
(0088) }
(0089) /*--------------------------------------------------------------------
(0090) 函数名称:I2C_WaitINT
(0091) 函数功能:等待TWINT位置位
(0092) 注意事项:需定义 WAITCOUNT
(0093) 提示说明:
(0094) 输 入:
(0095) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0096) --------------------------------------------------------------------*/
(0097) unsigned char I2C_WaitINT(void)
(0098) {
(0099) unsigned int i=WAITCOUNT;
_I2C_WaitINT:
i --> R16
0059 E302 LDI R16,0x32
005A E010 LDI R17,0
005B C008 RJMP 0x0064
(0100) while(!(TWCR&(1<<TWINT)))
(0101) {if((--i)==0) return I2C_ERR;}
005C 01C8 MOVW R24,R16
005D 9701 SBIW R24,1
005E 018C MOVW R16,R24
005F 3000 CPI R16,0
0060 0701 CPC R16,R17
0061 F411 BNE 0x0064
0062 2700 CLR R16
0063 C004 RJMP 0x0068
0064 B626 IN R2,0x36
0065 FE27 SBRS R2,7
0066 CFF5 RJMP 0x005C
(0102) return I2C_CRR;
0067 E001 LDI R16,1
0068 9508 RET
(0103) }
(0104) /*--------------------------------------------------------------------
(0105) 函数名称:I2C_SendByte
(0106) 函数功能:发送一字节数据
(0107) 注意事项:
(0108) 提示说明:
(0109) 输 入:待发送数据
(0110) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0111) --------------------------------------------------------------------*/
(0112) void I2C_SendByte(unsigned char x)
(0113) {
(0114) TWDR=(x);
_I2C_SendByte:
x --> R16
0069 B903 OUT 0x03,R16
(0115) TWCR=(1<<TWINT)|(1<<TWEN);
006A E884 LDI R24,0x84
006B BF86 OUT 0x36,R24
006C 9508 RET
(0116) }
(0117) /*--------------------------------------------------------------------
(0118) 函数名称:I2C Start
(0119) 函数功能:发出起始信号
(0120) 注意事项:
(0121) 提示说明:
(0122) 输 入:
(0123) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0124) --------------------------------------------------------------------*/
(0125) unsigned char I2C_Start()
(0126) {
(0127) I2CStart();
_I2C_Start:
006D EA84 LDI R24,0xA4
006E BF86 OUT 0x36,R24
(0128) if(!I2C_WaitINT()) return I2C_ERR;
006F DFE9 RCALL _I2C_WaitINT
0070 2300 TST R16
0071 F411 BNE 0x0074
0072 2700 CLR R16
0073 C007 RJMP 0x007B
(0129) if( I2C_STATUS!=I2C_START )
0074 B181 IN R24,0x01
0075 7F88 ANDI R24,0xF8
0076 3088 CPI R24,0x8
0077 F011 BEQ 0x007A
(0130) return I2C_ERR;
0078 2700 CLR R16
0079 C001 RJMP 0x007B
(0131) return I2C_CRR;
007A E001 LDI R16,1
007B 9508 RET
(0132) }
(0133) /*--------------------------------------------------------------------
(0134) 函数名称:I2C ReStart
(0135) 函数功能:发出重复起始信号
(0136) 注意事项:
(0137) 提示说明:
(0138) 输 入:
(0139) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0140) --------------------------------------------------------------------*/
(0141) unsigned char I2C_Restart()
(0142) {
(0143) I2CStart();
_I2C_Restart:
007C EA84 LDI R24,0xA4
007D BF86 OUT 0x36,R24
(0144) if(!I2C_WaitINT()) return I2C_ERR;
007E DFDA RCALL _I2C_WaitINT
007F 2300 TST R16
0080 F411 BNE 0x0083
0081 2700 CLR R16
0082 C007 RJMP 0x008A
(0145) if( I2C_STATUS!=I2C_RESTART )
0083 B181 IN R24,0x01
0084 7F88 ANDI R24,0xF8
0085 3180 CPI R24,0x10
0086 F011 BEQ 0x0089
(0146) return I2C_ERR;
0087 2700 CLR R16
0088 C001 RJMP 0x008A
(0147) return I2C_CRR;
0089 E001 LDI R16,1
008A 9508 RET
_I2C_SendWrDAdr:
wrDAdr --> R20
008B 940E02A0 CALL push_gset1
008D 2F40 MOV R20,R16
(0148) }
(0149) /*--------------------------------------------------------------------
(0150) 函数名称:I2C_SendWrDAdr
(0151) 函数功能:发送 7位 器件写地址: XXXX XXX0
(0152) 注意事项:
(0153) 提示说明:
(0154) 输 入:写地址
(0155) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0156) --------------------------------------------------------------------*/
(0157) unsigned char I2C_SendWrDAdr(unsigned char wrDAdr)
(0158) {
(0159) I2C_SendByte(wrDAdr); //设置器件写地址
008E 2F04 MOV R16,R20
008F DFD9 RCALL _I2C_SendByte
(0160) if(!I2C_WaitINT()) return I2C_ERR;
0090 DFC8 RCALL _I2C_WaitINT
0091 2300 TST R16
0092 F411 BNE 0x0095
0093 2700 CLR R16
0094 C007 RJMP 0x009C
(0161) if( I2C_STATUS!=I2C_MT_SLA_ACK )
0095 B181 IN R24,0x01
0096 7F88 ANDI R24,0xF8
0097 3188 CPI R24,0x18
0098 F011 BEQ 0x009B
(0162) return I2C_ERR;
0099 2700 CLR R16
009A C001 RJMP 0x009C
(0163) return I2C_CRR;
009B E001 LDI R16,1
009C 940E02A3 CALL pop_gset1
009E 9508 RET
_I2C_SendWrDAdr_:
wrDAdr --> R20
009F 940E02A0 CALL push_gset1
00A1 01A8 MOVW R20,R16
(0164) }
(0165) /*--------------------------------------------------------------------
(0166) 函数名称:I2C_SendWrDAdr_
(0167) 函数功能:发送 10位 器件写地址: 1111 0XX0, XXXX XXXX
(0168) 注意事项:
(0169) 提示说明:兼容 发送 7位 器件写地址: XXXX XXX0
(0170) 输 入:
(0171) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0172) --------------------------------------------------------------------*/
(0173) unsigned char I2C_SendWrDAdr_(unsigned int wrDAdr)
(0174) {
(0175) if( wrDAdr&0xF000 == 0xF000 ) //判断是否为 10位 器件地址
00A2 FF40 SBRS R20,0
00A3 C00B RJMP 0x00AF
(0176) if( I2C_SendWrDAdr((unsigned char )wrDAdr>>8)==I2C_ERR ) //设置(高位)器件写地址
00A4 2F04 MOV R16,R20
00A5 2711 CLR R17
00A6 2F01 MOV R16,R17
00A7 2711 CLR R17
00A8 FD07 SBRC R16,7
00A9 9510 COM R17
00AA DFE0 RCALL _I2C_SendWrDAdr
00AB 2300 TST R16
00AC F411 BNE 0x00AF
(0177) return I2C_ERR;
00AD 2700 CLR R16
00AE C007 RJMP 0x00B6
(0178) if( I2C_SendWrDAdr( (unsigned char)wrDAdr )==I2C_ERR ) //设置 (低位)器件写地址
00AF 2F04 MOV R16,R20
00B0 DFDA RCALL _I2C_SendWrDAdr
00B1 2300 TST R16
00B2 F411 BNE 0x00B5
(0179) return I2C_ERR;
00B3 2700 CLR R16
00B4 C001 RJMP 0x00B6
(0180) return I2C_CRR;
00B5 E001 LDI R16,1
00B6 940E02A3 CALL pop_gset1
00B8 9508 RET
_I2C_SendRdDAdr:
rdDAdr --> R20
00B9 940E02A0 CALL push_gset1
00BB 2F40 MOV R20,R16
(0181) }
(0182) /*--------------------------------------------------------------------
(0183) 函数名称:I2C_SendRdDAdr
(0184) 函数功能:发送 7位 器件读地址: XXXX XXX1
(0185) 注意事项:
(0186) 提示说明:
(0187) 输 入:读地址
(0188) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0189) --------------------------------------------------------------------*/
(0190) unsigned char I2C_SendRdDAdr(unsigned char rdDAdr)
(0191) {
(0192) I2C_SendByte(rdDAdr); //设置 器件读地址
00BC 2F04 MOV R16,R20
00BD DFAB RCALL _I2C_SendByte
(0193) if(!I2C_WaitINT()) return I2C_ERR;
00BE DF9A RCALL _I2C_WaitINT
00BF 2300 TST R16
00C0 F411 BNE 0x00C3
00C1 2700 CLR R16
00C2 C007 RJMP 0x00CA
(0194) if( I2C_STATUS!=I2C_MR_SLA_ACK )
00C3 B181 IN R24,0x01
00C4 7F88 ANDI R24,0xF8
00C5 3480 CPI R24,0x40
00C6 F011 BEQ 0x00C9
(0195) return I2C_ERR;
00C7 2700 CLR R16
00C8 C001 RJMP 0x00CA
(0196) return I2C_CRR;
00C9 E001 LDI R16,1
00CA 940E02A3 CALL pop_gset1
00CC 9508 RET
_I2C_SendRdDAdr_:
rdDAdr --> R20
00CD 940E02A0 CALL push_gset1
00CF 2F40 MOV R20,R16
(0197) }
(0198) /*--------------------------------------------------------------------
(0199) 函数名称:I2C_SendRdDAdr_
(0200) 函数功能:发送 10位 器件读地址: 1111 0XX0, XXXX XXXX
(0201) 注意事项:
(0202) 提示说明:兼容 发送 7位 器件读地址: XXXX XXX1
(0203) 输 入:
(0204) 返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
(0205) --------------------------------------------------------------------*/
(0206) unsigned char I2C_SendRdDAdr_(unsigned char rdDAdr)
(0207) {
(0208) if( rdDAdr&0xF000 == 0xF000 ) //判断是否为 10位 器件地址
00D0 FF40 SBRS R20,0
00D1 C00B RJMP 0x00DD
(0209) if( I2C_SendWrDAdr( (unsigned char)rdDAdr>>8 )==I2C_ERR ) //设置 (高位)器件读地址
00D2 2F04 MOV R16,R20
00D3 2711 CLR R17
00D4 2F01 MOV R16,R17
00D5 2711 CLR R17
00D6 FD07 SBRC R16,7
00D7 9510 COM R17
00D8 DFB2 RCALL _I2C_SendWrDAdr
00D9 2300 TST R16
00DA F411 BNE 0x00DD
(0210) return I2C_ERR;
00DB 2700 CLR R16
00DC C007 RJMP 0x00E4
(0211) if( I2C_SendWrDAdr( (unsigned char)rdDAdr )==I2C_ERR ) //设置 (低位)器件读地址
00DD 2F04 MOV R16,R20
00DE DFAC RCALL _I2C_SendWrDAdr
00DF 2300 TST R16
00E0 F411 BNE 0x00E3
(0212) return I2C_ERR;
00E1 2700 CLR R16
00E2 C001 RJMP 0x00E4
(0213) return I2C_CRR;
00E3 E001 LDI R16,1
00E4 940E02A3 CALL pop_gset1
00E6 9508 RET
_I2C_SendDat:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -