Die Hardwarearchitektur vom Flex 500 ist hier beschrieben. Die Kommunikation zwischen DSP und Controller läuft über eine SPI-Schnittstelle. Auf der Controller-Seite werden Mitteilungen interrupt-gesteuert gesendet, da die Mitteilungen von mehreren Instanzen aus geschickt werden können und DMA zu ständigen Unterbrechungen auf der DSP Seite führen würde.
Auf der DSP-Seite wird die Mitteilung, die über SPI-Schnittstelle erhalten werden, mit DMA an den Programmspeicher kopiert. Danach wird ein Interrupt ausgelöst, wonach der DSP den Befehl verarbeiten kann.
Die Struktur der Mitteilung
Die Struktur der Mitteilung ist im folgenden dargestellt.
- Bank Id: Die ID der Effekt-Bank.
- Type: Der UI-Controller type, der sich geändert hat: Encoder oder Button
- Id: Der ID des UI-Controllers (Button number oder Encoder number)
- Data: Data in (Float, 32bit, 16bit, 8bit mit oder ohne Vorzeichen)
Die Übertragung der Mitteilung
Die Mitteilung liegt im Programm im Typ „union“, der die Typen
- Float
- 32bit unsigned
- 16bit unsigned
- 8bit unsigned
beinhaltet.
1 2 3 4 5 6 |
union ctrltypes{ float f32; uint32_t u32; uint16_t u16[2]; uint8_t u8[4]; }; |
Daten dieses Typs müssen über SPI übertragen werden. Dabei wird der Vorteil genutzt, dass sowohl Sender als auch der Empfänger gleiche Endianness benutzt. (Beide Cortex-M7) Das heißt, wir können einfach den Speicherbereich, wo die Mitteilung liegt, schicken. Dann castet der Empfänger auf dieselbe Union zurück und die Daten liegen in der erwünschten Struktur beim Empfänger an.
Code vom Sender
1 |
HAL_SPI_Transmit(&hspi5, (uint8_t*) ctrl_tx, l_ctrl*4, SPI_TIMEOUT); |
wobei ctrl_tx des Typs „Unions“ ist.
Code vom Empfänger
1 2 3 4 5 6 7 |
void c_com_ctrl::apply_update(void) { //Copy incoming message to union memcpy(rx_com,ctrl_rx,4*l_ctrl); //Applying the update //... } |
Ressourcen
Der vollständige Code vom Communication Stack befindet sich auf den Repositories vom Controller und DSP unter den Ordnern „com„.
Schreibe einen Kommentar