?lang_form? ?lang_select? ?lang_submit? ?lang_endform?
{HEADER END}
{BLAME START}

library

?curdirlinks? -

Blame information for rev 3

Line No. Rev Author Line
1 3 kaklik /////////////////////////////////////////////////////////////////////////
2 //
3 // KNIHOVNA PRO PRACI S EXTERNI PAMETI EEPROM RADY 24XX (I2C SBERNICE)
4 //
5 /////////////////////////////////////////////////////////////////////////
6 //
7 // PEFI S.ICZ a.s. 2003
8 //
9 // Verze 1.0 - uvodni verze
10 // POZN: podpora HW adresy neni vyzkousena, nebyla k dispozici takova soucastka
11 //
12 /////////////////////////////////////////////////////////////////////////
13 //
14 // funkce:
15 // ExtEE_init()
16 // - inicializuje porty a pripadne HW i2c jednotku
17 //
18 // ExtEE_write_byte(int16 adr,int8 data)
19 // - zapise bajt na adresu
20 //
21 // ExtEE_write_array(int16 adr,int8 *data, int8 Len)
22 // - zapise pole bajtu delky Len od adresy adr
23 //
24 // int8 ExtEE_read_byte(int16 adr)
25 // - precte bajt z adresy adr
26 //
27 // int8 ExtEE_read_byte_inc()
28 // - precte bajt z adresy nasledujici po adrese posledni operace a inkrementuje ji
29 // - funguje jen v ramci jedne stranky
30 //
31 // ExtEE_read_array(int16 adr,int8 *data, int8 Len)
32 // - precte pole bajtu delky Len od adresy adr
33 //
34 // definice a prepinace
35 // #define EXTEE_SDA /* pin, na kterem je pripojen signal SDA */
36 // #define EXTEE_SCL /* pin, na kterem je pripojen signal SCL */
37 // #define EXTEE_WRITE_BURST /* pocet bajtu, ktere lze zapsat do pameti naraz */
38 // #define EXTEE_PAGE_CTRL /* zapne(1) / vypne(0) podporu strankovani */
39 // #define EXT_EE_HW_ADR /* nastavi a zapne podporu hw adresy I2C zarizeni */
40 // #define EXTEE_HW /* zapne(1) / vypne(0) HW podporu i2c */
41 // POZN: Vypnuti podpory strankvani prodlouzi funkci ExtEE_write_array o cca 20 slov, ovsem
42 // potom je treba hlidat vztah mezi adresou a delkou zapisovaneho pole. Lze zapsat max. EXTEE_WRITE_BURST bajtu
43 // a to pocinaje adresou v nasobcich EXTEE_WRITE_BURST (0x,1x,2x...). Pokud nezapiseme cely burst a budeme priste pokracovat
44 // nasledujici adresou, lze zapsat jen cast do EXTEE_WRITE_BURST. Zbytek lze zapsat novym burstem. Opet max. EXTEE_WRITE_BURST bajtu
45 // Podporu EXTEE_HW lze zapnout u procesoru, ktere tuto jednotku maji.
46 //
47 //
48 // defaultni definice
49 //
50 #ifndef EXTEE_SDA
51 #define EXTEE_SDA PIN_C4
52 #define EXTEE_SCL PIN_C3
53 #endif
54 #ifndef EXTEE_WRITE_BURST
55 #define EXTEE_WRITE_BURST 16 /* pocet bajtu, ktere lze zapsat naraz */
56 #endif
57 #ifndef EXTEE_PAGE_CTRL
58 #define EXTEE_PAGE_CTRL 1 /* podpora stranokvani zapnuta */
59 #endif
60 #ifndef EXTEE_HW
61 #define EXTEE_HW 0 /* HW podpora i2c vypnuta */
62 #endif
63  
64  
65  
66 /****************************************************************************************************/
67 // Privatni sekce, cist jen v pripade, ze neco nefunguje
68 /****************************************************************************************************/
69 // nastaveni podpory I2C sbernice
70 #if EXTEE_HW != 0
71 #use i2c(master,sda=EXTEE_SDA,scl=EXTEE_SCL,FORCE_HW)
72 #else
73 #use i2c(master,sda=EXTEE_SDA,scl=EXTEE_SCL)
74 #endif
75  
76  
77 //////////////////////////////////////////////////////////
78 ///// FUNKCE pro inicializaci
79 //////////////////////////////////////////////////////////
80 // inicializuje port
81 //
82 void ExtEE_init() {
83  
84 output_float(EXTEE_SCL);
85 output_float(EXTEE_sda);
86 #ifdef EEPROM_HW
87 // zapne SSP jednotku, #use i2c to neudela, asi chyba v cecku
88 #ASM
89 BSF SSPCON._SSPEN // BSF 0x14.5
90 BSF SSPCON._SSPM3 // BSF 0x14.3
91 #endasm
92 #endif
93 }
94  
95  
96  
97 ////////////////////////////////
98 /// FUNKCE PRO ZAPIS
99 ///////////////////////////////
100 // zapise bajt do eeprom
101 //
102 void ExtEE_write_byte(int16 adr, int8 data) {
103 #ifdef EXTEE_HW_ADR
104 do
105 i2c_start();
106 while (i2c_write((0xa0|((EXTEE_HW_ADR<<1)&0x0f))&0xfe)); // zkousej dal pokud je pamet zaneprazdnena
107 i2c_write(make8(adr,1)); // posli vyssi cast adresy
108 #else
109 do
110 i2c_start();
111 while (i2c_write((0xa0|((make8(adr,1)<<1)&0x0f))&0xfe)); // zkousej dal pokud je pamet zaneprazdnena
112 #endif
113  
114 // i2c_write(make8(adr,0)); //je o 1 slovo delsi a asi vice koser
115 i2c_write(adr);
116 i2c_write(data);
117 i2c_stop();
118 }
119  
120  
121 #if EXTEE_PAGE_CTRL != 0
122 // zapise pole bajtu do eeprom, varianta s kontolou strankovani
123 //
124 void ExtEE_write_array(int16 adr, int8 *data, int8 Len) {
125  
126 int8 burst;
127  
128 while(len!=0)
129 {
130 burst=(EXTEE_WRITE_BURST-1)-(make8(adr,0)&(EXTEE_WRITE_BURST-1))+1; // pocet bajtu, ktere lze naraz zapsat
131 if(burst>len) burst=len; // zapiseme zbytek
132 len=len-burst;
133 // navazani spojeni a zapis adresy
134 #ifdef EXTEE_HW_ADR
135 do
136 i2c_start();
137 while (i2c_write((0xa0|((EXTEE_HW_ADR<<1)&0x0f))&0xfe)); // zkousej dal pokud je pamet zaneprazdnena
138 i2c_write(make8(adr,1)); // posli vyssi cast adresy
139 #else
140 do
141 i2c_start();
142 while(i2c_write((0xa0|((make8(adr,1)<<1)&0x0f))&0xfe)); // zkousej dal pokud je pamet zaneprazdnena
143 #endif
144 i2c_write(adr);
145 adr+=burst; // adresu posun na zacatek dalsiho burstu
146 // poslani burstu bajtu
147 do
148 i2c_write(*Data++);
149 while (--burst);
150 i2c_stop();
151 }
152 }
153 #else
154 // zapise pole bajtu do eeprom, varianta bez kontroly strankovani, je o 21 slov kratsi
155 //
156 void ExtEE_write_array(int16 adr, int8 *data, int8 Len) {
157 // navazani spojeni a zapis adresy
158 #ifdef EXTEE_HW_ADR
159 do
160 i2c_start();
161 while (i2c_write((0xa0|((EXTEE_HW_ADR<<1)&0x0f))&0xfe)); // zkousej dal pokud je pamet zaneprazdnena
162 i2c_write(make8(adr,1)); // posli vyssi cast adresy
163 #else
164 do
165 i2c_start();
166 while(i2c_write((0xa0|((make8(adr,1)<<1)&0x0f))&0xfe)); // zkousej dal pokud je pamet zaneprazdnena
167 #endif
168 i2c_write(adr);
169 // poslani burstu bajtu
170 do
171 i2c_write(*Data++);
172 while (--len);
173 i2c_stop();
174 }
175 #endif
176  
177  
178  
179 ////////////////////////////////
180 /// FUNKCE PRO CTENI
181 ///////////////////////////////
182 // precte bajt z eeprom
183 //
184 int8 ExtEE_read_byte(int16 adr) {
185  
186 int8 data;
187  
188 #ifdef EXTEE_HW_ADR
189 do
190 i2c_start();
191 while (i2c_write((0xa0|((EXTEE_HW_ADR<<1)&0x0f))&0xfe)); // zkousej dal pokud je pamet zaneprazdnena
192 i2c_write(make8(adr,1)); // posli vyssi cast adresy
193 #else
194 do
195 i2c_start();
196 while(i2c_write((0xa0|((make8(adr,1)<<1)&0x0f))&0xfe)); // zkousej dal pokud je pamet zaneprazdnena
197 #endif
198 i2c_write(adr);
199 i2c_start();
200 #ifdef EXTEE_HW_ADR
201 i2c_write((0xa0|((EXTEE_HW_ADR<<1)&0x0f))|1);
202 #else
203 i2c_write((0xa0|((make8(adr,1)<<1)&0x0f))|1);
204 #endif
205 data=i2c_read(0);
206 i2c_stop();
207 return(data);
208 }
209  
210  
211 // precte bajt z eeprom z posledni adresy+1 a adresu inkrementuje, funguje jen v ramci jedne stranky
212 //
213 int8 ExtEE_read_byte_inc() {
214  
215 int8 data;
216  
217 i2c_start();
218 #ifdef EXTEE_HW_ADR
219 i2c_write((0xa0|((EXTEE_HW_ADR<<1)&0x0f))|1);
220 #else
221 i2c_write(0xa1);
222 #endif
223 data=i2c_read(0);
224 i2c_stop();
225 return(data);
226 }
227  
228  
229 // precte pole bajtu z eeprom
230 //
231 void ExtEE_read_array(int16 adr, int8 *Data, int8 Len) {
232 #ifdef EXTEE_HW_ADR
233 do
234 i2c_start();
235 while (i2c_write((0xa0|((EXTEE_HW_ADR<<1)&0x0f))&0xfe)); // zkousej dal pokud je pamet zaneprazdnena
236 i2c_write(make8(adr,1)); // posli vyssi cast adresy
237 #else
238 do
239 i2c_start();
240 while(i2c_write((0xa0|((make8(adr,1)<<1)&0x0f))&0xfe)); // zkousej dal pokud je pamet zaneprazdnena
241 #endif
242 i2c_write(adr);
243 i2c_start();
244 #ifdef EXTEE_HW_ADR
245 i2c_write((0xa0|((EXTEE_HW_ADR<<1)&0x0f))&0xfe); // zkousej dal pokud je pamet zaneprazdnena
246 #else
247 i2c_write((0xa0|((make8(adr,1)<<1)&0x0f))|1);
248 #endif
249 Len--; // posledni bajt se cte zvlast, nema ACK
250 do
251 *(Data++)=i2c_read(1);
252 while (--Len);
253 *(data++)=i2c_read(0); // u posledniho bajtu neni ACK
254 i2c_stop();
255 }
256 // End of File
{BLAME END}
{FOOTER START}

Powered by WebSVN v2.8.3