Bonjour,
Après une bonne journée de lecture intensive de la doc de la DMA du PIC32, il y a quelques points que je ne comprends pas.
Quelles sont les rôles des "DMA channel x Cell" et des "Block transfer"? J'ai vu dans la doc où ces termes étaient définies mais bon ça tilt pas dans ma petite cervelle
Le but aussi de cette question est de trouver la manière d'initialiser le DMA channel 0 par exemple pour transférer les données d'un tableau défini de la manière suivante : unsigned long spectrum [2050] = {0,....0} vers un autre tableau unsigned long spectrum_DMA [2050] à chaque réception d'une chaîne de caractère de l'UART2.
j'ai eu beau analyser tous les exemples de codes fournis au sujet de la DMA, il n'y a que des transferts de tableau de char.
Après j'aurais aussi besoin à chaque interruption Timer de transférer le contenu du tableau de long "spectrum" vers la liaison spi ou UART. Par contre la, j'ai une autre question. Faut il que je prévoie de convertir mon tableau de long en tableau de char?
J'ai commencé à faire quelques initialisations dans un premier temps mais sans utiliser d'interruption mais en forçant le début du transfert.
void DMATransfer()
{
unsigned long dmascr = 0;
unsigned long dmadest = 0;
dmascr =(unsigned long) spectrum; // cast de l'adresse du tableau en long
dmadest =(unsigned long) spectrum_DMA;
IEC1CLR = 0x00020000; // disable DMA channel 0 interrupts
IFS1CLR = 0x00020000; // clear existing DMA channel 0 interrupt flag
IEC1CLR = 0x00010000; // disable DMA channel 0 interrupts
IFS1CLR = 0x00010000; // clear existing DMA channel 0 interrupt flag
DMACONSET = 0x00008000; // enable the DMA controller
DCH0CON = 0x3; // channel off, pri 3, no chaining
DCH0ECON = 0; // no start or stop irq?s, no pattern match
// program the transfer
DCH0DSA = dmascr; // Transfer destination physical address
DCH0SSA = dmadest; // Transfer source physical address
DCH0SSIZ = 2050; // Block transfer source size bytes
DCH0DSIZ = 2050; // Block transfer destination size bytes
DCH0CSIZ = 2050; // Cell transfer bytes
DCH0INTCLR = 0X00FF00FF; // clear existing events, disable all interrupts
DCH0INTbits.CHBCIE = 1; // Channel Block Transfer Complete Interrupt Enable bit
DCH0CONSET = 0x80; // turn channel on
// initiate a transfer
DCH0ECONSET = 0x00000080; // set CFORCE to 1
while(IFS1bits.DMA0IF == 0); // Wait DMA to complete
DMACONCLR = 0x00008000; // Disable the DMA controller
}
Bonne journée et merci d'avance pour le coup de pouces!
detube78
-----