Moin Moin,
Ich habe ein SPI-Master mit bis zu 8 gleiche SPI Slaves. Somit sind also
8 CS Leitungen zu bedienen je nachdem welcher Slave gerade dran ist. Das
bringt bei generischen read/write funktionen ewig lange switch/case oder
if-else if blöcke mit sich. Siehe hier ein Beispiel für zwei SPI slaves
die mit der variablen "mcp" ausgewählt werden.
1 | ..
|
2 | #include utils.h
|
3 |
|
4 | #define MCP2515_CA_A B,2
|
5 | #define MCP2515_CA_A D,5
|
6 |
|
7 | uint8_t can_read_status(uint8_t type, uint8_t mcp)
|
8 | {
|
9 | uint8_t data;
|
10 |
|
11 | if(mcp)
|
12 | RESET(MCP2515_CS_A);
|
13 | else
|
14 | RESET(MCP2515_CS_B);
|
15 |
|
16 | spi_putc(type);
|
17 | data = spi_putc(0xff);
|
18 |
|
19 | if(mcp)
|
20 | SET(MCP2515_CS_A);
|
21 | else
|
22 | SET(MCP2515_CS_B);
|
23 |
|
24 | return data;
|
25 | }
|
Meine Idee ist es nun anstatt der code intensiven if/else blöcke ein
Array über einen index ( wie z.B. die variable mcp ) anzusprechen. Die
Macros RESET/SET expandieren zu
1 | PORTB &= ~(1 << 2)// Reset
|
2 | PORTB |= (1 << 2) // Set
|
Der Preprocessor macht aus den PORTB Makro für RESET dann:
1 | (*(volatile uint8_t *)((0x05) + 0x20)) &= ~(1<<2);
|
Jetzt könnte man ja diesen Ausdruck in ein array aus strukturen packen
in Form von
1 | struct dynport {
|
2 |
|
3 | xxxxxx port // PORT
|
4 | uint8_t pin // terminal
|
5 | }
|
6 |
|
7 | ...
|
8 |
|
9 | struct dynport ports[] {
|
10 |
|
11 | { PORTD, 2},
|
12 | { PORTA, 3},
|
13 | ....
|
14 | }
|
Die Frage ist nun wie ich den Typ von port in struct dynport definieren
muss???
Oder gibt es da eine elegantere Lösung?
Daaanke für jeden erhellenden Tipp :-)
Gruß
Karsten