?? i2ce2prom.lst
字號(hào):
__text_start:
__start:
66 EFCF LDI R28,0xFF
67 E2D1 LDI R29,0x21
68 BFCD OUT 0x3D,R28
69 BFDE OUT 0x3E,R29
6A 52C0 SUBI R28,0x20
6B 40D0 SBCI R29,0
6C EA0A LDI R16,0xAA
6D 8308 STD Y+0,R16
6E 2400 CLR R0
6F E0E0 LDI R30,0
70 E0F2 LDI R31,2
71 E012 LDI R17,2
72 31EA CPI R30,0x1A
73 07F1 CPC R31,R17
74 F011 BEQ 0x0077
75 9201 ST R0,Z+
76 CFFB RJMP 0x0072
77 8300 STD Z+0,R16
78 ECEC LDI R30,0xCC
79 E0F0 LDI R31,0
7A E0A0 LDI R26,0
7B E0B2 LDI R27,2
7C E010 LDI R17,0
7D E000 LDI R16,0
7E BF0B OUT 0x3B,R16
7F 3CEC CPI R30,0xCC
80 07F1 CPC R31,R17
81 F021 BEQ 0x0086
82 95C8 LPM
83 9631 ADIW R30,1
84 920D ST R0,X+
85 CFF9 RJMP 0x007F
86 940E 00CC CALL _main
_exit:
88 CFFF RJMP _exit
_EEPROM_Write:
Data --> Y,+5
M_ADD --> R10
H_ADD --> R12
89 940E 01AD CALL push_xgset003C
8B 0159 MOVW R10,R18
8C 2EC0 MOV R12,R16
8D 9721 SBIW R28,1
FILE: E:\MyWorks\SOFT\I2C_E2PROM\I2C_Demo.c
(0001) // *************** I2C driver Demo V 1.0 *************
(0002) // IO模擬方式的I2C接口操作
(0003) // *******************************************************
(0004)
(0005) #include <iom1281v.h>
(0006) #include <MACROS.h>
(0007)
(0008) #include <DC_Defines.h>
(0009)
(0010) #include "I2C.h"
(0011)
(0012)
(0013)
(0014) void EEPROM_Write(unsigned char, unsigned int, unsigned char);
(0015) unsigned char EEPROM_Read(unsigned char, unsigned int);
(0016)
(0017)
(0018) // **************************************************************** //
(0019) // *** Init_I2C(); *** //
(0020) // *** This routine will setup the I2C port direction registers *** //
(0021) // **************************************************************** //
(0022)
(0023) // ***************************************************************** //
(0024) // *** I2C_Start(); *** //
(0025) // *** This routine will set the I2C start condition on the bus, *** //
(0026) // *** All commands must be preceded by a START condition *** //
(0027) // ***************************************************************** //
(0028)
(0029) // ***************************************************************** //
(0030) // *** I2C_Stop(); *** //
(0031) // *** This routine will set the I2C stop condition on the bus, *** //
(0032) // *** All commands must end with a STOP condition *** //
(0033) // ***************************************************************** //
(0034)
(0035) // *********************************************************************** //
(0036) // *** Write_I2C_Control(0x0A,0,0); *** //
(0037) // *** This routine will write the I2C device code, the device address *** //
(0038) // *** setup on the hardware pins A0,A1 & A2, and also the W/R bit *** //
(0039) // *** So for an external EEPROM, such as the 24LC04B you would need *** //
(0040) // *** a device code of 1010 (0x0A), *** //
(0041) // *** hardware address 0 (if pins A0,A1 & A2 are left unconnected, *** //
(0042) // *** and the last parameter is R/W. Write is active low *** //
(0043) // *********************************************************************** //
(0044)
(0045) // *********************************************************************** //
(0046) // *** I2C_Ackn(); *** //
(0047) // *** This routine will clock the ACK bit from the I2C slave device *** //
(0048) // *** it will return TRUE for a fail, and FALSE for a correct ACK bit *** //
(0049) // *********************************************************************** //
(0050)
(0051) // ************************************************************** //
(0052) // *** Write_I2C_Byte(); *** //
(0053) // *** This routine will clock a byte to the slave I2C device *** //
(0054) // ************************************************************** //
(0055)
(0056) // ************************************************************************** //
(0057) // *** Read_I2C_Byte(); *** //
(0058) // *** This routine will read and return a byte from the I2C slave device *** //
(0059) // ************************************************************************** //
(0060)
(0061)
(0062)
(0063) // *********************************************************************** //
(0064) // *** Example of using Imagecraft I2C driver *** //
(0065) // *** to write to an external 8 bit address EEPROM *** //
(0066) // *** H_ADD is the hardware address set on the device A0,A1 & A2 pins *** //
(0067) // *** M_ADD is the devices internal memory address *** //
(0068) // *** Data is user data to be writen *** //
(0069) // *********************************************************************** //
(0070)
(0071) void EEPROM_Write(unsigned char H_ADD, unsigned int M_ADD, unsigned char Data)
(0072) {
(0073) I2C_Start(); // Set I2C start condition
8E 940E 0112 CALL _I2C_Start
(0074)
(0075) Write_I2C_Control(0x0A,H_ADD,0); // Send the EEPROM control Byte
90 2422 CLR R2
91 8228 STD Y+0,R2
92 2D2C MOV R18,R12
93 E00A LDI R16,0xA
94 940E 0158 CALL _Write_I2C_Control
(0076)
(0077) Write_I2C_Byte(M_ADD>>8); // Send the EEPROM internal Address higher byte.
96 0185 MOVW R16,R10
97 2F01 MOV R16,R17
98 2711 CLR R17
99 940E 0121 CALL _Write_I2C_Byte
(0078)
(0079) Write_I2C_Byte(M_ADD); // Send the EEPROM internal Address lower byte.
9B 2D0A MOV R16,R10
9C 940E 0121 CALL _Write_I2C_Byte
(0080)
(0081) Write_I2C_Byte(Data); // Send the EEPROM Data
9E 810D LDD R16,Y+5
9F 940E 0121 CALL _Write_I2C_Byte
(0082)
(0083) I2C_Stop(); // Set I2C Stop condition
A1 940E 0117 CALL _I2C_Stop
A3 9621 ADIW R28,1
A4 940C 01A2 JMP pop_xgset003C
_EEPROM_Read:
Temp --> R10
M_ADD --> R12
H_ADD --> R10
A6 940E 01AD CALL push_xgset003C
A8 0169 MOVW R12,R18
A9 2EA0 MOV R10,R16
AA 9721 SBIW R28,1
(0084) }
(0085)
(0086)
(0087)
(0088) // *********************************************************************** //
(0089) // *** Example of using Imagecraft I2C driver *** //
(0090) // *** to Read an external 8 bit address EEPROM *** //
(0091) // *** H_ADD is the hardware address set on the device A0,A1 & A2 pins *** //
(0092) // *** M_ADD is the devices internal memory address *** //
(0093) // *** Data is user data to be writen *** //
(0094) // *********************************************************************** //
(0095)
(0096) unsigned char EEPROM_Read(unsigned char H_ADD, unsigned int M_ADD)
(0097) {
(0098) unsigned char Temp; // Temp RAM for EEPROM Read
(0099)
(0100) I2C_Start(); // Set I2C start condition
AB 940E 0112 CALL _I2C_Start
(0101)
(0102) Write_I2C_Control(0x0A,H_ADD,0); // Send the EEPROM control Byte
AD 2422 CLR R2
AE 8228 STD Y+0,R2
AF 2D2A MOV R18,R10
B0 E00A LDI R16,0xA
B1 940E 0158 CALL _Write_I2C_Control
(0103) // Dummy write to set address
(0104)
(0105) Write_I2C_Byte(M_ADD>>8); // Send the EEPROM internal Address Higher byte.
B3 0186 MOVW R16,R12
B4 2F01 MOV R16,R17
B5 2711 CLR R17
B6 940E 0121 CALL _Write_I2C_Byte
(0106) Write_I2C_Byte(M_ADD); // Send the EEPROM internal Address lower byte.
B8 2D0C MOV R16,R12
B9 940E 0121 CALL _Write_I2C_Byte
(0107)
(0108) I2C_Start(); // Set I2C start condition
BB 940E 0112 CALL _I2C_Start
(0109)
(0110) Write_I2C_Control(0x0A,H_ADD,1); // Send the EEPROM control Byte
BD E081 LDI R24,1
BE 8388 STD Y+0,R24
BF 2D2A MOV R18,R10
C0 E00A LDI R16,0xA
C1 940E 0158 CALL _Write_I2C_Control
(0111)
(0112) Temp = Read_I2C_Byte(); // Read data from EEPROM
C3 940E 013B CALL _Read_I2C_Byte
C5 2EA0 MOV R10,R16
(0113)
(0114) I2C_Stop(); // Set I2C Stop condition
C6 940E 0117 CALL _I2C_Stop
(0115)
(0116) return Temp; // Return data from EEPROM
C8 2D0A MOV R16,R10
C9 9621 ADIW R28,1
CA 940C 01A2 JMP pop_xgset003C
_main:
k --> R12
data --> Y,+1
j --> R10
i --> R22
c --> R20
CC 9722 SBIW R28,2
(0117) }
(0118)
(0119)
(0120)
(0121)
(0122) //AT24C512B使用2BYTE片內(nèi)地址。
(0123) unsigned char bf[26];
(0124) void main (void)
(0125) {
(0126) unsigned int i;
(0127) unsigned char j, k;
(0128) unsigned int c; // Temp Ram used for write delay
(0129) volatile unsigned char data;
(0130)
(0131) DDRG |=BIT(PG1);
CD 9A99 SBI 0x13,1
(0132) PORTG |=BIT(PG1); //VCC =high.
CE 9AA1 SBI 0x14,1
(0133)
(0134) I2C_DIR |= BIT(PD0)|BIT(PD1); // Set Port B to Outputs
CF B18A IN R24,0x0A
D0 6083 ORI R24,3
D1 B98A OUT 0x0A,R24
(0135)
(0136) Init_I2C(); // Setup the hardware port
D2 940E 010D CALL _Init_I2C
D4 C035 RJMP 0x010A
(0137)
(0138) while (true)
(0139) {
(0140) for (k=0,i=0x1050, j='A'; 1; i++,j++ )
D5 24CC CLR R12
D6 E560 LDI R22,0x50
D7 E170 LDI R23,0x10
D8 E481 LDI R24,0x41
D9 2EA8 MOV R10,R24
DA C025 RJMP 0x0100
(0141) {
(0142) EEPROM_Write( 1 , i , j );
DB 82A8 STD Y+0,R10
DC 019B MOVW R18,R22
DD E001 LDI R16,1
DE DFAA RCALL _EEPROM_Write
(0143)
(0144) for(c=0;c<5000;c++); // Delay for EEPROM Write
DF 2744 CLR R20
E0 2755 CLR R21
E1 C002 RJMP 0x00E4
E2 5F4F SUBI R20,0xFF
E3 4F5F SBCI R21,0xFF
E4 3848 CPI R20,0x88
E5 E1E3 LDI R30,0x13
E6 075E CPC R21,R30
E7 F3D0 BCS 0x00E2
(0145)
(0146) data = EEPROM_Read( 1, i ); // Read device 1, memory address 1
E8 019B MOVW R18,R22
E9 E001 LDI R16,1
EA DFBB RCALL _EEPROM_Read
EB 8309 STD Y+1,R16
(0147) bf[k++] =data;
EC 2C2C MOV R2,R12
ED 2433 CLR R3
EE 2D82 MOV R24,R2
EF 5F8F SUBI R24,0xFF
F0 2EC8 MOV R12,R24
F1 E080 LDI R24,0
F2 E092 LDI R25,2
F3 2DE2 MOV R30,R2
F4 27FF CLR R31
F5 0FE8 ADD R30,R24
F6 1FF9 ADC R31,R25
F7 2E20 MOV R2,R16
F8 8220 STD Z+0,R2
(0148) if (j=='Z') break;
F9 2D8A MOV R24,R10
FA 358A CPI R24,0x5A
FB F409 BNE 0x00FD
FC C004 RJMP 0x0101
FD 5F6F SUBI R22,0xFF
FE 4F7F SBCI R23,0xFF
FF 94A3 INC R10
100 CFDA RJMP 0x00DB
(0149)
(0150) }
(0151)
(0152) for(c=0;c<5000;c++); // Delay for EEPROM Write
101 2744 CLR R20
102 2755 CLR R21
103 C002 RJMP 0x0106
104 5F4F SUBI R20,0xFF
105 4F5F SBCI R21,0xFF
106 3848 CPI R20,0x88
107 E1E3 LDI R30,0x13
108 075E CPC R21,R30
109 F3D0 BCS 0x0104
10A CFCA RJMP 0x00D5
10B 9622 ADIW R28,2
10C 9508 RET
FILE: E:\MyWorks\SOFT\I2C_E2PROM\I2C.c
(0001) // *************** I2C driver V 1.0 ***************
(0002) // *** Written By P. Fletcher-Jones ***
(0003) // *** Written on 16/11/01 ***
(0004) // *** Last MOD 21/11/01 ***
(0005) // *** Compiled using ImageCraft C Comiler ***
(0006) // *******************************************************
(0007)
(0008) #include <iom1281v.h>
(0009) #include <MACROS.h>
(0010)
(0011) #include "DC_Defines.h"
(0012)
(0013)
(0014) #include "I2C.h"
(0015)
(0016)
(0017) // ******************************************** //
(0018) // *** This routine will setup the I2C Port *** //
(0019) // ******************************************** //
(0020)
(0021) void Init_I2C(void)
(0022) {
(0023) SETBIT(I2C_DIR,SCL); // Set SCL to output
_Init_I2C:
10D 9A50 SBI 0x0A,0
(0024) SETBIT(I2C_DIR,SDA ); // Set SDA to output
10E 9A51 SBI 0x0A,1
(0025)
(0026) SETBIT(I2C_PORT,SCL); // Set SCL high
10F 9A58 SBI 0x0B,0
(0027) SETBIT(I2C_PORT,SDA ); // Set SDA high
110 9A59 SBI 0x0B,1
111 9508 RET
(0028) }
(0029)
(0030)
(0031)
(0032) // ************************************************ //
(0033) // *** This routine will send the I2C Start Bit *** //
(0034) // ************************************************ //
(0035)
(0036) void I2C_Start (void)
(0037) {
(0038) SETBIT(I2C_PORT,SCL); // Set SCL High
_I2C_Start:
112 9A58 SBI 0x0B,0
(0039) SETBIT(I2C_PORT,SDA); // Set SDA High
113 9A59 SBI 0x0B,1
(0040)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -