uint32_t liste[] PROGMEM = { 0x8F66F1, 0x0, 0xAAAAAB }; //DonnéesData àto envoyer
send
#define DMA_BUF_SIZE (sizeof(liste) / sizeof(liste[0])) //Taille mémoireSize DMA buffer
uint32_t i;
void setup() {
uint clk_div = 0x90; //DiviseurClock d'horlogedivider souhaitéwanted
clk_div = (clk_div / 24) / DMA_BUF_SIZE;
clk_div = floor(clk_div + 0.5);
clk_div = clk_div * 24 * DMA_BUF_SIZE; //DiviseurClock d'Horlogedivider ajustéadjusted -> MCK/2*clk_div
PMC->PMC_WPMR = 0x504D4300; //DésactivationDesactivation protection PMC
PMC->PMC_PCER0 = (1 << ID_SSC); //Activation horloge pour SSC clock
PMC->PMC_SCER |= 0x100; //Activation horlogeclock
PIOA->PIO_WPMR = 0x50494F00; //DésactivationDesactivation protection Port I/O A
PIOA->PIO_PDR = PIO_PDR_P14 | PIO_PDR_P15 | PIO_PDR_P16; //I/O contrôléecontrolled parby lethe périphériqueperipheral
PIOA->PIO_ABSR |= PIO_PA14B_TK | PIO_PA15B_TF | PIO_PA16B_TD; //Assignation desof I/O àto SSC
SSC->SSC_CR = SSC_CR_RXDIS | SSC_CR_TXDIS | SSC_CR_SWRST; //DésactivationDesactivation etand réinitialisationreset SSC
SSC->SSC_WPMR = 0x53534300; //DésactivationDesactivation protection SSC
SSC->SSC_IDR = 0xFFFFFFFF; //DésactivationDesactivation InterrupteursInterrupts
SSC->SSC_IER = 0x00000000; //DésactivationDesactivation InterrupteursInterrupts bis
SSC->SSC_CMR = clk_div; //Gestion deClock l'horlogemanagement
SSC->SSC_TFMR = SSC_TFMR_DATLEN(0x18) | SSC_TFMR_MSBF | SSC_TFMR_DATNB(0); //GestionData transfert des donnéesmanagement
SSC->SSC_TCMR = SSC_TCMR_CKS_MCK | SSC_TCMR_CKO_CONTINUOUS | SSC_TCMR_START_CONTINUOUS | SSC_TCMR_STTDLY(0); //Gestion de l'horlogeClock lorsduring detransfert transfertsmanagement
SSC->SSC_CR = SSC_CR_TXEN; //Activation transmission SSC
}
void loop() {
for (i = 0; i < DMA_BUF_SIZE; i++) {
ssc_write((Ssc*)SSC, (uint32_t)liste[i]); //Transmission SSC
}
}
uint32_t liste[] PROGMEM = { 0x8F66F1, 0x0, 0xAAAAAB }; //Données à envoyer
#define DMA_BUF_SIZE (sizeof(liste) / sizeof(liste[0])) //Taille mémoire DMA
uint32_t i;
void setup() {
uint clk_div = 0x90; //Diviseur d'horloge souhaité
clk_div = (clk_div / 24) / DMA_BUF_SIZE;
clk_div = floor(clk_div + 0.5);
clk_div = clk_div * 24 * DMA_BUF_SIZE; //Diviseur d'Horloge ajusté -> MCK/2*clk_div
PMC->PMC_WPMR = 0x504D4300; //Désactivation protection PMC
PMC->PMC_PCER0 = (1 << ID_SSC); //Activation horloge pour SSC
PMC->PMC_SCER |= 0x100; //Activation horloge
PIOA->PIO_WPMR = 0x50494F00; //Désactivation protection Port I/O A
PIOA->PIO_PDR = PIO_PDR_P14 | PIO_PDR_P15 | PIO_PDR_P16; //I/O contrôlée par le périphérique
PIOA->PIO_ABSR |= PIO_PA14B_TK | PIO_PA15B_TF | PIO_PA16B_TD; //Assignation des I/O à SSC
SSC->SSC_CR = SSC_CR_RXDIS | SSC_CR_TXDIS | SSC_CR_SWRST; //Désactivation et réinitialisation SSC
SSC->SSC_WPMR = 0x53534300; //Désactivation protection SSC
SSC->SSC_IDR = 0xFFFFFFFF; //Désactivation Interrupteurs
SSC->SSC_IER = 0x00000000; //Désactivation Interrupteurs bis
SSC->SSC_CMR = clk_div; //Gestion de l'horloge
SSC->SSC_TFMR = SSC_TFMR_DATLEN(0x18) | SSC_TFMR_MSBF | SSC_TFMR_DATNB(0); //Gestion transfert des données
SSC->SSC_TCMR = SSC_TCMR_CKS_MCK | SSC_TCMR_CKO_CONTINUOUS | SSC_TCMR_START_CONTINUOUS | SSC_TCMR_STTDLY(0); //Gestion de l'horloge lors de transferts
SSC->SSC_CR = SSC_CR_TXEN; //Activation transmission SSC
}
void loop() {
for (i = 0; i < DMA_BUF_SIZE; i++) {
ssc_write((Ssc*)SSC, (uint32_t)liste[i]); //Transmission SSC
}
}
uint32_t liste[] PROGMEM = { 0x8F66F1, 0x0, 0xAAAAAB }; //Data to send
#define DMA_BUF_SIZE (sizeof(liste) / sizeof(liste[0])) //Size DMA buffer
uint32_t i;
void setup() {
uint clk_div = 0x90; //Clock divider wanted
clk_div = (clk_div / 24) / DMA_BUF_SIZE;
clk_div = floor(clk_div + 0.5);
clk_div = clk_div * 24 * DMA_BUF_SIZE; //Clock divider adjusted -> MCK/2*clk_div
PMC->PMC_WPMR = 0x504D4300; //Desactivation protection PMC
PMC->PMC_PCER0 = (1 << ID_SSC); //Activation SSC clock
PMC->PMC_SCER |= 0x100; //Activation clock
PIOA->PIO_WPMR = 0x50494F00; //Desactivation protection Port I/O A
PIOA->PIO_PDR = PIO_PDR_P14 | PIO_PDR_P15 | PIO_PDR_P16; //I/O controlled by the peripheral
PIOA->PIO_ABSR |= PIO_PA14B_TK | PIO_PA15B_TF | PIO_PA16B_TD; //Assignation of I/O to SSC
SSC->SSC_CR = SSC_CR_RXDIS | SSC_CR_TXDIS | SSC_CR_SWRST; //Desactivation and reset SSC
SSC->SSC_WPMR = 0x53534300; //Desactivation protection SSC
SSC->SSC_IDR = 0xFFFFFFFF; //Desactivation Interrupts
SSC->SSC_IER = 0x00000000; //Desactivation Interrupts bis
SSC->SSC_CMR = clk_div; //Clock management
SSC->SSC_TFMR = SSC_TFMR_DATLEN(0x18) | SSC_TFMR_MSBF | SSC_TFMR_DATNB(0); //Data transfert management
SSC->SSC_TCMR = SSC_TCMR_CKS_MCK | SSC_TCMR_CKO_CONTINUOUS | SSC_TCMR_START_CONTINUOUS | SSC_TCMR_STTDLY(0); //Clock during transfert management
SSC->SSC_CR = SSC_CR_TXEN; //Activation transmission SSC
}
void loop() {
for (i = 0; i < DMA_BUF_SIZE; i++) {
ssc_write((Ssc*)SSC, (uint32_t)liste[i]); //Transmission SSC
}
}
I managed to solve it but not with SPI, I use the SSC of the μcontroller (which does I2S and uses DMA automatically) :
uint32_t liste[] PROGMEM = { 0x8F66F1, 0x0, 0xAAAAAB }; //Données à envoyer
#define DMA_BUF_SIZE (sizeof(liste) / sizeof(liste[0])) //Taille mémoire DMA
uint32_t i;
void setup() {
uint clk_div = 0x90; //Diviseur d'horloge souhaité
clk_div = (clk_div / 24) / DMA_BUF_SIZE;
clk_div = floor(clk_div + 0.5);
clk_div = clk_div * 24 * DMA_BUF_SIZE; //Diviseur d'Horloge ajusté -> MCK/2*clk_div
PMC->PMC_WPMR = 0x504D4300; //Désactivation protection PMC
PMC->PMC_PCER0 = (1 << ID_SSC); //Activation horloge pour SSC
PMC->PMC_SCER |= 0x100; //Activation horloge
PIOA->PIO_WPMR = 0x50494F00; //Désactivation protection Port I/O A
PIOA->PIO_PDR = PIO_PDR_P14 | PIO_PDR_P15 | PIO_PDR_P16; //I/O contrôlée par le périphérique
PIOA->PIO_ABSR |= PIO_PA14B_TK | PIO_PA15B_TF | PIO_PA16B_TD; //Assignation des I/O à SSC
SSC->SSC_CR = SSC_CR_RXDIS | SSC_CR_TXDIS | SSC_CR_SWRST; //Désactivation et réinitialisation SSC
SSC->SSC_WPMR = 0x53534300; //Désactivation protection SSC
SSC->SSC_IDR = 0xFFFFFFFF; //Désactivation Interrupteurs
SSC->SSC_IER = 0x00000000; //Désactivation Interrupteurs bis
SSC->SSC_CMR = clk_div; //Gestion de l'horloge
SSC->SSC_TFMR = SSC_TFMR_DATLEN(0x18) | SSC_TFMR_MSBF | SSC_TFMR_DATNB(0); //Gestion transfert des données
SSC->SSC_TCMR = SSC_TCMR_CKS_MCK | SSC_TCMR_CKO_CONTINUOUS | SSC_TCMR_START_CONTINUOUS | SSC_TCMR_STTDLY(0); //Gestion de l'horloge lors de transferts
SSC->SSC_CR = SSC_CR_TXEN; //Activation transmission SSC
}
void loop() {
for (i = 0; i < DMA_BUF_SIZE; i++) {
ssc_write((Ssc*)SSC, (uint32_t)liste[i]); //Transmission SSC
}
}
In case someone try the same thing.