Ich habe mal ein Bild von der Kommunikation gepostet (Anhang im Post).
Die untere Darstellung im Bild ist eine Vergrößerung!
Es läuft nun, so wie ich es haben möchte. Habe zum triggern des DMA und synchronisierung der SPI-Frames mit CS zwei Timer laufen!
Der Code hat mich viel Zeit gekostet, aber hier mal ein Auszug aus dem TimerInterupt für das CS.
Das Proggi geht so, dass immer 3 Nachrichten gesendet werden. Dann kann der DMA wieder befüllt werden und er nach ca. 25 us werden wieder drei gesendet.
Das Problem war, dass ich es nicht gerallt habe, den DMA-Request zum Senden über den Timer2 zu steuert, sondern versucht habe mit dem Force-Bit in den DMA registern manual einen Request zu erzeugen, dass irgendwie nicht ging. Aber nun Läuft es über zwei Timer, wenn einer eine elegantere Lösung hat, bin ich nicht abgeneigt zu spicken!
Gruß
/*
Funktion: _T8Interrupt()
Autor: --------
Geändert am: 20.10.2010
Parameter: n.A.
Rückgabewert: n.A.
Beschreibung: ISR() - für Timer8
Timer8 - Teiler 1:1 (Period: 25 ns)
*/
void __attribute__((__interrupt__, no_auto_psv)) _T8Interrupt(void)
{
static unsigned char i_cs = 1; // CS Deklaration und Initialisierung nach Einschalten!
static unsigned char spiBuf_counter = 0; // spi_buf Counter, max. Wert ist max. SPI-DMA-Buffer, --> config.h!
static unsigned char dummy = 0; // Dummywert
SPI_CS = i_cs; // CS-Bit auf Portpin ausgeben!
// CS = 0, SPI-Frame im DMA-Freigeben!
if(i_cs == 0)
{
PR8 = 240; // Slot für 6 us
system_startTimer2(); // SCLK um 1 us verschieben, DMA-Auslösen
spiBuf_counter++; // Anzahl der Slots zählen
dummy++; // DUmmy zum testen inc.
}
// CS = 1, SPI-Idle
else
{
// SPI-DMA-Buffer komplett gesendet? CS = 1 für ca. 25 us
if(spiBuf_counter == 0)
PR8 = 1040;
// SPI-DMA-Buffer noch nicht komplett gesendet? CS = 1 für ca. 3 us
else
PR8 = 120;
}
// Max. Anzahl der SPI-DMA-Buffer erreicht?
if(spiBuf_counter >= 3)
{
// Dummy-Schreiben!
SPI2_TX_Schedule[0] = dummy - 2;
SPI2_TX_Schedule[1] = dummy - 1;
SPI2_TX_Schedule[2] = dummy;
// In DMA-Laden
system_writeToSPI(SPI2_TX_Schedule);
spiBuf_counter = 0;
}
i_cs = i_cs ^ 1; // Toogle CS
IFS3bits.T8IF = 0; // Reset INT-Flag
}