📄 at45db161.lst
字号:
(0114) #define I2C_ERR 0
(0115) #define I2C_CRR 1
(0116)
(0117) /*--------------------------------------------------------------------
(0118) 函数名称:I2C Start
(0119) 函数功能:
(0120) 注意事项:
(0121) 提示说明:
(0122) 输 入:
(0123) 返 回:
(0124) --------------------------------------------------------------------*/
(0125) bool I2C_Start()
(0126) {
(0127) I2CStart();
_I2C_Start:
00AE EA84 LDI R24,0xA4
00AF BF86 OUT 0x36,R24
(0128) I2CWaitAck();
00B0 B626 IN R2,0x36
00B1 FE27 SBRS R2,7
00B2 CFFD RJMP 0x00B0
(0129) if( I2CChkAck()!=I2C_START )
00B3 B181 IN R24,0x01
00B4 7F88 ANDI R24,0xF8
00B5 3088 CPI R24,0x8
00B6 F011 BEQ 0x00B9
(0130) return I2C_ERR;
00B7 2700 CLR R16
00B8 C001 RJMP 0x00BA
(0131) return I2C_CRR;
00B9 E001 LDI R16,1
00BA 9508 RET
(0132) }
(0133) /*--------------------------------------------------------------------
(0134) 函数名称:I2C ReStart
(0135) 函数功能:
(0136) 注意事项:
(0137) 提示说明:
(0138) 输 入:
(0139) 返 回:
(0140) --------------------------------------------------------------------*/
(0141) bool I2C_Restart()
(0142) {
(0143) I2CStart();
_I2C_Restart:
00BB EA84 LDI R24,0xA4
00BC BF86 OUT 0x36,R24
(0144) I2CWaitAck();
00BD B626 IN R2,0x36
00BE FE27 SBRS R2,7
00BF CFFD RJMP 0x00BD
(0145) if( I2CChkAck()!=I2C_RESTART )
00C0 B181 IN R24,0x01
00C1 7F88 ANDI R24,0xF8
00C2 3180 CPI R24,0x10
00C3 F011 BEQ 0x00C6
(0146) return I2C_ERR;
00C4 2700 CLR R16
00C5 C001 RJMP 0x00C7
(0147) return I2C_CRR;
00C6 E001 LDI R16,1
00C7 9508 RET
(0148) }
(0149) /*--------------------------------------------------------------------
(0150) 函数名称:发送 7位 器件写地址: XXXX XXX0
(0151) 函数功能:
(0152) 注意事项:
(0153) 提示说明:
(0154) 输 入:
(0155) 返 回:
(0156) --------------------------------------------------------------------*/
(0157) bool I2C_SendWrDAdr(uint8 wrDAdr)
(0158) {
(0159) I2CSendByte(wrDAdr); //设置 器件写地址
_I2C_SendWrDAdr:
wrDAdr --> R16
00C8 B903 OUT 0x03,R16
00C9 E884 LDI R24,0x84
00CA BF86 OUT 0x36,R24
(0160) I2CWaitAck();
00CB B626 IN R2,0x36
00CC FE27 SBRS R2,7
00CD CFFD RJMP 0x00CB
(0161) if( I2CChkAck()!=I2C_MT_SLA_ACK )
00CE B181 IN R24,0x01
00CF 7F88 ANDI R24,0xF8
00D0 3188 CPI R24,0x18
00D1 F011 BEQ 0x00D4
(0162) return I2C_ERR;
00D2 2700 CLR R16
00D3 C001 RJMP 0x00D5
(0163) return I2C_CRR;
00D4 E001 LDI R16,1
00D5 9508 RET
_I2C_SendWrDAdr_:
wrDAdr --> R20
00D6 940E04DE CALL push_gset1
00D8 01A8 MOVW R20,R16
(0164) }
(0165) /*--------------------------------------------------------------------
(0166) 函数名称:发送 10位 器件写地址: 1111 0XX0, XXXX XXXX
(0167) 函数功能:
(0168) 注意事项:
(0169) 提示说明:兼容 发送 7位 器件写地址: XXXX XXX0
(0170) 输 入:
(0171) 返 回:
(0172) --------------------------------------------------------------------*/
(0173) bool I2C_SendWrDAdr_(uint16 wrDAdr)
(0174) {
(0175) if( wrDAdr&0xF000 == 0xF000 ) //判断是否为 10位 器件地址
00D9 FF40 SBRS R20,0
00DA C00B RJMP 0x00E6
(0176) if( I2C_SendWrDAdr( (uint8)wrDAdr>>8 )==I2C_ERR ) //设置 (高位)器件写地址
00DB 2F04 MOV R16,R20
00DC 2711 CLR R17
00DD 2F01 MOV R16,R17
00DE 2711 CLR R17
00DF FD07 SBRC R16,7
00E0 9510 COM R17
00E1 DFE6 RCALL _I2C_SendWrDAdr
00E2 2300 TST R16
00E3 F411 BNE 0x00E6
(0177) return I2C_ERR;
00E4 2700 CLR R16
00E5 C007 RJMP 0x00ED
(0178) if( I2C_SendWrDAdr( (uint8)wrDAdr )==I2C_ERR ) //设置 (低位)器件写地址
00E6 2F04 MOV R16,R20
00E7 DFE0 RCALL _I2C_SendWrDAdr
00E8 2300 TST R16
00E9 F411 BNE 0x00EC
(0179) return I2C_ERR;
00EA 2700 CLR R16
00EB C001 RJMP 0x00ED
(0180) return I2C_CRR;
00EC E001 LDI R16,1
00ED 940E04E1 CALL pop_gset1
00EF 9508 RET
(0181) }
(0182) /*--------------------------------------------------------------------
(0183) 函数名称:发送 7位 器件读地址: XXXX XXX1
(0184) 函数功能:
(0185) 注意事项:
(0186) 提示说明:
(0187) 输 入:
(0188) 返 回:
(0189) --------------------------------------------------------------------*/
(0190) bool I2C_SendRdDAdr(uint8 rdDAdr)
(0191) {
(0192) I2CSendByte(rdDAdr); //设置 器件读地址
_I2C_SendRdDAdr:
rdDAdr --> R16
00F0 B903 OUT 0x03,R16
00F1 E884 LDI R24,0x84
00F2 BF86 OUT 0x36,R24
(0193) I2CWaitAck();
00F3 B626 IN R2,0x36
00F4 FE27 SBRS R2,7
00F5 CFFD RJMP 0x00F3
(0194) if( I2CChkAck()!=I2C_MR_SLA_ACK )
00F6 B181 IN R24,0x01
00F7 7F88 ANDI R24,0xF8
00F8 3480 CPI R24,0x40
00F9 F011 BEQ 0x00FC
(0195) return I2C_ERR;
00FA 2700 CLR R16
00FB C001 RJMP 0x00FD
(0196) return I2C_CRR;
00FC E001 LDI R16,1
00FD 9508 RET
_I2C_SendRdDAdr_:
rdDAdr --> R20
00FE 940E04DE CALL push_gset1
0100 2F40 MOV R20,R16
(0197) }
(0198) /*--------------------------------------------------------------------
(0199) 函数名称:发送 10位 器件读地址: 1111 0XX0, XXXX XXXX
(0200) 函数功能:
(0201) 注意事项:
(0202) 提示说明:
(0203) 输 入:
(0204) 返 回:
(0205) --------------------------------------------------------------------*/
(0206) bool I2C_SendRdDAdr_(uint8 rdDAdr)
(0207) {
(0208) if( rdDAdr&0xF000 == 0xF000 ) //判断是否为 10位 器件地址
0101 FF40 SBRS R20,0
0102 C00B RJMP 0x010E
(0209) if( I2C_SendWrDAdr( (uint8)rdDAdr>>8 )==I2C_ERR ) //设置 (高位)器件读地址
0103 2F04 MOV R16,R20
0104 2711 CLR R17
0105 2F01 MOV R16,R17
0106 2711 CLR R17
0107 FD07 SBRC R16,7
0108 9510 COM R17
0109 DFBE RCALL _I2C_SendWrDAdr
010A 2300 TST R16
010B F411 BNE 0x010E
(0210) return I2C_ERR;
010C 2700 CLR R16
010D C007 RJMP 0x0115
(0211) if( I2C_SendWrDAdr( (uint8)rdDAdr )==I2C_ERR ) //设置 (低位)器件读地址
010E 2F04 MOV R16,R20
010F DFB8 RCALL _I2C_SendWrDAdr
0110 2300 TST R16
0111 F411 BNE 0x0114
(0212) return I2C_ERR;
0112 2700 CLR R16
0113 C001 RJMP 0x0115
(0213) return I2C_CRR;
0114 E001 LDI R16,1
0115 940E04E1 CALL pop_gset1
0117 9508 RET
(0214) }
(0215) /*--------------------------------------------------------------------
(0216) 函数名称:I2C发送数据
(0217) 函数功能:
(0218) 注意事项:
(0219) 提示说明:
(0220) 输 入:
(0221) 返 回:
(0222) --------------------------------------------------------------------*/
(0223) bool I2C_SendDat(uint8 configDat)
(0224) {
(0225) I2CSendByte(configDat);
_I2C_SendDat:
configDat --> R16
0118 B903 OUT 0x03,R16
0119 E884 LDI R24,0x84
011A BF86 OUT 0x36,R24
(0226) I2CWaitAck();
011B B626 IN R2,0x36
011C FE27 SBRS R2,7
011D CFFD RJMP 0x011B
(0227) if( I2CChkAck()!=I2C_MT_DATA_ACK )
011E B181 IN R24,0x01
011F 7F88 ANDI R24,0xF8
0120 3288 CPI R24,0x28
0121 F011 BEQ 0x0124
(0228) return I2C_ERR;
0122 2700 CLR R16
0123 C001 RJMP 0x0125
(0229) return I2C_CRR;
0124 E001 LDI R16,1
0125 9508 RET
(0230) }
(0231) /*--------------------------------------------------------------------
(0232) 函数名称:I2C接收数据且不产生应答
(0233) 函数功能:
(0234) 注意事项:
(0235) 提示说明:
(0236) 输 入:
(0237) 返 回:
(0238) --------------------------------------------------------------------*/
(0239) bool I2C_RcvNAckDat(uint8 *pRdDat)
(0240) {
(0241) I2CRcvNckByte();
_I2C_RcvNAckDat:
pRdDat --> R16
0126 E884 LDI R24,0x84
0127 BF86 OUT 0x36,R24
(0242) I2CWaitAck();
0128 B626 IN R2,0x36
0129 FE27 SBRS R2,7
012A CFFD RJMP 0x0128
(0243) if( I2CChkAck()!=I2C_MR_DATA_NACK )
012B B181 IN R24,0x01
012C 7F88 ANDI R24,0xF8
012D 3588 CPI R24,0x58
012E F011 BEQ 0x0131
(0244) return I2C_ERR;
012F 2700 CLR R16
0130 C004 RJMP 0x0135
(0245) *pRdDat=TWDR;
0131 B023 IN R2,0x03
0132 01F8 MOVW R30,R16
0133 8220 STD Z+0,R2
(0246) return I2C_CRR;
0134 E001 LDI R16,1
0135 9508 RET
(0247) }
(0248) /*--------------------------------------------------------------------
(0249) 函数名称:I2C接收数据且产生应答
(0250) 函数功能:
(0251) 注意事项:
(0252) 提示说明:
(0253) 输 入:
(0254) 返 回:
(0255) --------------------------------------------------------------------*/
(0256) bool I2C_RcvAckDat(uint8 *pRdDat)
(0257) {
(0258) I2CRcvAckByte();
_I2C_RcvAckDat:
pRdDat --> R16
0136 EC84 LDI R24,0xC4
0137 BF86 OUT 0x36,R24
(0259) I2CWaitAck();
0138 B626 IN R2,0x36
0139 FE27 SBRS R2,7
013A CFFD RJMP 0x0138
(0260) if( I2CChkAck()!=I2C_MR_DATA_ACK )
013B B181 IN R24,0x01
013C 7F88 ANDI R24,0xF8
013D 3580 CPI R24,0x50
013E F011 BEQ 0x0141
(0261) return I2C_ERR;
013F 2700 CLR R16
0140 C004 RJMP 0x0145
(0262) *pRdDat=TWDR;
0141 B023 IN R2,0x03
0142 01F8 MOVW R30,R16
0143 8220 STD Z+0,R2
(0263) return I2C_CRR;
0144 E001 LDI R16,1
0145 9508 RET
_I2C_Write:
dat --> Y+4
wordAdr --> R20
wrDAdr --> R22
0146 940E04DC CALL push_gset2
0148 2F42 MOV R20,R18
0149 01B8 MOVW R22,R16
(0264) }
(0265) /*--------------------------------------------------------------------
(0266) 函数名称:I2C写器件,写一个数据
(0267) 函数功能:
(0268) 注意事项:
(0269) 提示说明:
(0270) 输 入:wrDAdr: write device-address 写器件地址
(0271) wordAdr: word address 字地址
(0272) dat: data 数据
(0273) 返 回:
(0274) --------------------------------------------------------------------*/
(0275) bool I2C_Write(uint16 wrDAdr,uint8 wordAdr,uint8 dat)
(0276) {
(0277) if( I2C_Start()==I2C_ERR )
014A DF63 RCALL _I2C_Start
014B 2300 TST R16
014C F411 BNE 0x014F
(0278) return I2C_ERR;
014D 2700 CLR R16
014E C015 RJMP 0x0164
(0279)
(0280) if( I2C_SendWrDAdr_(wrDAdr)==I2C_ERR )
014F 018B MOVW R16,R22
0150 DF85 RCALL _I2C_SendWrDAdr_
0151 2300 TST R16
0152 F411 BNE 0x0155
(0281) return I2C_ERR;
0153 2700 CLR R16
0154 C00F RJMP 0x0164
(0282)
(0283) if( I2C_SendDat(wordAdr)==I2C_ERR )
0155 2F04 MOV R16,R20
0156 DFC1 RCALL _I2C_SendDat
0157 2300 TST R16
0158 F411 BNE 0x015B
(0284) return I2C_ERR;
0159 2700 CLR R16
015A C009 RJMP 0x0164
(0285)
(0286) if( I2C_SendDat(dat)==I2C_ERR )
015B 810C LDD R16,Y+4
015C DFBB RCALL _I2C_SendDat
015D 2300 TST R16
015E F411 BNE 0x0161
(0287) return I2C_ERR;
015F 2700 CLR R16
0160 C003 RJMP 0x0164
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -