Hallo Leute,
ich beschäftige mich mit dsPics und habe mal ein paar fragen zum Aufbau
der Device header Files.
Zunächst einmal möchte ich mir beispielsweise eine Funktion zum
Initialisieren des I2C, eine Funktion zum Lesen und eine Funktion zum
Schreiben des I2C anlegen.
Da z.B. der dspic33FJ256GP710A zwei I2Cs hat, würde ich gerne
universelle Funktionen anlegen, die dann wierderum eine Adresse
übergeben bekommen.
Innerhalb der Funktionen sollen dann die verschieden Register
beschrieben werden können. Nachfolgend ein Beispiel:
1 | void Init_I2C (I2C_SFR* I2C)
|
2 | {
|
3 | I2C->con = 0xAFFE;
|
4 | }
|
Soweit so gut. Innerhalb der Funktion soll nun je nach Übergabe entweder
also I2C1CON oder I2C2CON beschrieben werden (und natürlich die anderen
entsprechenden Register der Hardware I2C1 ODER I2C2).
Nun stellt sich mir die Frage, in welcher Form ich der Funktion die
Adresse des I2C1 oder des I2C2 übergebe. In dem Device Header File sind
ja nur die einzelnen Register definiert und nicht beispielsweise ein
struct mit den allen Register einer Peripherie.
Könnte ich nun am einfachsten selbst ein struct im (eigenen!)
Peripherie-Headeranlegen, welches mir dieses abnimmt? Etwa so:
1 | typedef struct {
|
2 | unsigned int i2c_rcv;
|
3 | unsigned int i2c_trn;
|
4 | unsigned int i2c_brg;
|
5 | unsigned int i2c_con;
|
6 | unsigned int i2c_stat;
|
7 | unsigned int i2c_add;
|
8 | unsigned int i2c_msk;
|
9 | }I2C_SFR;
|
10 |
|
11 | const I2C_SFR* I2C_1 = (I2C_SFR*)& &I2C1RCV;
|
12 | const I2C_SFR* I2C_2 = (I2C_SFR*)& &I2C2RCV;
|
Hinweis: I2C1CON und I2C2CON sind die untersten Adressen der jeweilgen
Peripherie-Adressen. Link:
ww1.microchip.com/downloads/en/DeviceDoc/70593B.pdf Seite 55.
Danke schonmal.