Servus ihr lieben, weiß grad echt nicht weiter. versuche jetzt seit geschlagenen 2 Wochen den TWI Master zum laufen zu bekommen. Hab mich zuerst durch die Appnote 315 gequält und den Code mühsam für den GCC Compiler umgemodelt, leider vergebens. Dann noch an 2 weiteren Codeschnippseln rumprobiert auch umsonst. Nachdem ich viel über den Code von Peter Fleury gelesen hatte, hab ich mich diesem zugewandt und wollte diesen nun ausprobieren. Doch hier beginnen die Probleme schon beim einbindn der I2Cmaster.h. Hab sie in mein main.c Verzeichnis kopiert doch irgendwie findet der Compiler die header nicht obwohl sie unter den header Dateien eingebunden ist. #include <i2cmaster.h> --> ../TWI_Test_Peter.c:12:23: error: i2cmaster.h: No such file or directory Hab dann gegoogelt und gelesen das man "#include <i2cmaster.h>" in "#include "i2cmaster.h"" umwandeln soll. #include "i2cmaster.h" --> c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/crt m16.o.init9+0x0): undefined reference to `main' Hat jemand vielleicht nen Tip oder ein Codeschnipsel von nem funktionierenden Master? Gruß Andi
In Zeile 42 ist nur ne "{"
Wie kommst drauf? Seh in den Fehlermeldungen nichts mit Zeile 42 :(
Das ist der unveränderte Code von Peter Fleury, hatte gehofft das jemand evtl. schon mal das selbe Problem mit dem Code hatte. Hier ist er trotzdem mal, obwohl ich recht sicher bin das er stimmt, hab ja nix dran verändert :)
1 | /*************************************************************************
|
2 | * Title: I2C master library using hardware TWI interface
|
3 | * Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
|
4 | * File: $Id: twimaster.c,v 1.3 2005/07/02 11:14:21 Peter Exp $
|
5 | * Software: AVR-GCC 3.4.3 / avr-libc 1.2.3
|
6 | * Target: any AVR device with hardware TWI
|
7 | * Usage: API compatible with I2C Software Library i2cmaster.h
|
8 | **************************************************************************/
|
9 | #include <inttypes.h> |
10 | #include <compat/twi.h> |
11 | |
12 | #include <i2cmaster.h> |
13 | |
14 | |
15 | /* define CPU frequency in Mhz here if not defined in Makefile */
|
16 | #ifndef F_CPU
|
17 | #define F_CPU 4000000UL
|
18 | #endif
|
19 | |
20 | /* I2C clock in Hz */
|
21 | #define SCL_CLOCK 100000L
|
22 | |
23 | |
24 | /*************************************************************************
|
25 | Initialization of the I2C bus interface. Need to be called only once
|
26 | *************************************************************************/
|
27 | void i2c_init(void) |
28 | {
|
29 | /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
|
30 | |
31 | TWSR = 0; /* no prescaler */ |
32 | TWBR = ((F_CPU/SCL_CLOCK)-16)/2; /* must be > 10 for stable operation */ |
33 | |
34 | }/* i2c_init */ |
35 | |
36 | |
37 | /*************************************************************************
|
38 | Issues a start condition and sends address and transfer direction.
|
39 | return 0 = device accessible, 1= failed to access device
|
40 | *************************************************************************/
|
41 | unsigned char i2c_start(unsigned char address) |
42 | {
|
43 | uint8_t twst; |
44 | |
45 | // send START condition
|
46 | TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); |
47 | |
48 | // wait until transmission completed
|
49 | while(!(TWCR & (1<<TWINT))); |
50 | |
51 | // check value of TWI Status Register. Mask prescaler bits.
|
52 | twst = TW_STATUS & 0xF8; |
53 | if ( (twst != TW_START) && (twst != TW_REP_START)) return 1; |
54 | |
55 | // send device address
|
56 | TWDR = address; |
57 | TWCR = (1<<TWINT) | (1<<TWEN); |
58 | |
59 | // wail until transmission completed and ACK/NACK has been received
|
60 | while(!(TWCR & (1<<TWINT))); |
61 | |
62 | // check value of TWI Status Register. Mask prescaler bits.
|
63 | twst = TW_STATUS & 0xF8; |
64 | if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1; |
65 | |
66 | return 0; |
67 | |
68 | }/* i2c_start */ |
69 | |
70 | |
71 | /*************************************************************************
|
72 | Issues a start condition and sends address and transfer direction.
|
73 | If device is busy, use ack polling to wait until device is ready
|
74 |
|
75 | Input: address and transfer direction of I2C device
|
76 | *************************************************************************/
|
77 | void i2c_start_wait(unsigned char address) |
78 | {
|
79 | uint8_t twst; |
80 | |
81 | |
82 | while ( 1 ) |
83 | {
|
84 | // send START condition
|
85 | TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); |
86 | |
87 | // wait until transmission completed
|
88 | while(!(TWCR & (1<<TWINT))); |
89 | |
90 | // check value of TWI Status Register. Mask prescaler bits.
|
91 | twst = TW_STATUS & 0xF8; |
92 | if ( (twst != TW_START) && (twst != TW_REP_START)) continue; |
93 | |
94 | // send device address
|
95 | TWDR = address; |
96 | TWCR = (1<<TWINT) | (1<<TWEN); |
97 | |
98 | // wail until transmission completed
|
99 | while(!(TWCR & (1<<TWINT))); |
100 | |
101 | // check value of TWI Status Register. Mask prescaler bits.
|
102 | twst = TW_STATUS & 0xF8; |
103 | if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) ) |
104 | {
|
105 | /* device busy, send stop condition to terminate write operation */
|
106 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); |
107 | |
108 | // wait until stop condition is executed and bus released
|
109 | while(TWCR & (1<<TWSTO)); |
110 | |
111 | continue; |
112 | }
|
113 | //if( twst != TW_MT_SLA_ACK) return 1;
|
114 | break; |
115 | }
|
116 | |
117 | }/* i2c_start_wait */ |
118 | |
119 | |
120 | /*************************************************************************
|
121 | Issues a repeated start condition and sends address and transfer direction
|
122 | |
123 | Input: address and transfer direction of I2C device
|
124 |
|
125 | Return: 0 device accessible
|
126 | 1 failed to access device
|
127 | *************************************************************************/
|
128 | unsigned char i2c_rep_start(unsigned char address) |
129 | {
|
130 | return i2c_start( address ); |
131 | |
132 | }/* i2c_rep_start */ |
133 | |
134 | |
135 | /*************************************************************************
|
136 | Terminates the data transfer and releases the I2C bus
|
137 | *************************************************************************/
|
138 | void i2c_stop(void) |
139 | {
|
140 | /* send stop condition */
|
141 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); |
142 | |
143 | // wait until stop condition is executed and bus released
|
144 | while(TWCR & (1<<TWSTO)); |
145 | |
146 | }/* i2c_stop */ |
147 | |
148 | |
149 | /*************************************************************************
|
150 | Send one byte to I2C device
|
151 |
|
152 | Input: byte to be transfered
|
153 | Return: 0 write successful
|
154 | 1 write failed
|
155 | *************************************************************************/
|
156 | unsigned char i2c_write( unsigned char data ) |
157 | {
|
158 | uint8_t twst; |
159 | |
160 | // send data to the previously addressed device
|
161 | TWDR = data; |
162 | TWCR = (1<<TWINT) | (1<<TWEN); |
163 | |
164 | // wait until transmission completed
|
165 | while(!(TWCR & (1<<TWINT))); |
166 | |
167 | // check value of TWI Status Register. Mask prescaler bits
|
168 | twst = TW_STATUS & 0xF8; |
169 | if( twst != TW_MT_DATA_ACK) return 1; |
170 | return 0; |
171 | |
172 | }/* i2c_write */ |
173 | |
174 | |
175 | /*************************************************************************
|
176 | Read one byte from the I2C device, request more data from device
|
177 |
|
178 | Return: byte read from I2C device
|
179 | *************************************************************************/
|
180 | unsigned char i2c_readAck(void) |
181 | {
|
182 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA); |
183 | while(!(TWCR & (1<<TWINT))); |
184 | |
185 | return TWDR; |
186 | |
187 | }/* i2c_readAck */ |
188 | |
189 | |
190 | /*************************************************************************
|
191 | Read one byte from the I2C device, read is followed by a stop condition
|
192 |
|
193 | Return: byte read from I2C device
|
194 | *************************************************************************/
|
195 | unsigned char i2c_readNak(void) |
196 | {
|
197 | TWCR = (1<<TWINT) | (1<<TWEN); |
198 | while(!(TWCR & (1<<TWINT))); |
199 | |
200 | return TWDR; |
201 | |
202 | }/* i2c_readNak */ |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.