Hi, I am working on utilising the USART as SPI on Arduino Due. Tested 8-bit communication and is working as expected. Now working on 16-bit data transfer so what are the changes to be done and which are the register bits need to be monitored/altered.
The Arduino code is as below.
unsigned long previousMicros = 0, interval = 50; void setup() { Serial.begin(9600); // diagnostics Serial1.begin(9600); // pre-initialize USART0 USART0config(); // setup mode, clock and pins USART0status(); } void loop() { // Sends 8-bit data every 50us if (micros() - previousMicros >= interval) { previousMicros = micros(); USART0->US_THR = 0xAA; // Sends 8-bit data } } void USART0config() { USART0->US_WPMR = 0x55534100; // Unlock the USART Mode register USART0->US_MR |= 0x408CE; // Set Mode to CLK0=1, 8_BIT, SPI_MASTER USART0->US_BRGR = 21; // Clock Divider (SCK = 4MHz) PIOA->PIO_WPMR = 0x50494F00; // Unlock PIOA Write Protect Mode Register PIOB->PIO_WPMR = 0x50494F00; // Unlock PIOB Write Protect Mode Register PIOB->PIO_ABSR |= (0u << 25); // CS: Assign A14 I/O to the Peripheral A function PIOB->PIO_PDR |= (1u << 25); // CS: Disable PIO control, enable peripheral control PIOA->PIO_ABSR |= (1u << 17); // SCK: Assign A16 I/O to the Peripheral B function PIOA->PIO_PDR |= (1u << 17); // SCK: Disable PIO control, enable peripheral control PIOA->PIO_ABSR |= (0u << 10); // MOSI: Assign PA13 I/O to the Peripheral A function PIOA->PIO_PDR |= (1u << 10); // MOSI: Disable PIO control, enable peripheral control PIOA->PIO_ABSR |= (0u << 11); // MISO: Assign A12 I/O to the Peripheral A function PIOA->PIO_PDR |= (1u << 11); // MISO: Disable PIO control, enable peripheral control } void USART0status() { Serial.print("PIOA_ABSR \t"); Serial.println(PIOA->PIO_ABSR, HEX); Serial.print("PIOB_ABSR \t"); Serial.println(PIOB->PIO_ABSR, HEX); Serial.print("US_MR \t"); Serial.println(USART0->US_MR, HEX); Serial.print("US_CSR \t"); Serial.println(USART0->US_CSR, HEX); Serial.print("US_BRGR (DEC)\t"); Serial.println(USART0->US_BRGR, DEC); Serial.print("US_RTOR \t"); Serial.println(USART0->US_RTOR, HEX); Serial.print("US_TTGR \t"); Serial.println(USART0->US_TTGR, HEX); Serial.print("US_FIDI \t"); Serial.println(USART0->US_FIDI, HEX); Serial.print("US_NER \t"); Serial.println(USART0->US_NER, HEX); Serial.print("US_IF \t"); Serial.println(USART0->US_IF, HEX); Serial.print("US_MAN \t"); Serial.println(USART0->US_MAN, HEX); Serial.print("US_LINMR \t"); Serial.println(USART0->US_LINMR, HEX); Serial.print("US_LINIR \t"); Serial.println(USART0->US_LINIR, HEX); Serial.print("US_WPSR \t"); Serial.println(USART0->US_WPSR, HEX); }