Hi , I am the rookie of the arduino due user.
I have the project that need to build the SPI between the Artix-7 FPGA and the arduino due.
The master is FPGA ,and the slave is due.
I find the problem that if the FPGA transmit the data through the MOSI to due continuously , the data loss would happened.
I set the SCLK is 500KHz, and the mode is 0. I use interrupt to catch the data, which I found on the Internet.
How can I solve the problem?
void setup() {
Serial.begin(115200);
while (!Serial);
//SPI serial recieve
REG_PMC_PCER0 |= PMC_PCER0_PID24; // Power up SPI clock
REG_SPI0_WPMR = 0 << SPI_WPMR_WPEN; //Unlock user interface for SPI
//Instance SPI0, MISO: PA25, (MISO), MOSI: PA26, (MOSI), SCLK: PA27, (SCLK), NSS: PA28, (NPCS0)
REG_PIOA_ABSR &= ~PIO_ABSR_P25; // Transfer Pin control from PIO to SPI
REG_PIOA_PDR |= PIO_PDR_P25; // disable pio to control this pin (MOSI)
REG_PIOA_ABSR &= ~PIO_ABSR_P26; // Transfer Pin control from PIO to SPI
REG_PIOA_PDR |= PIO_PDR_P26; // disable pio to control this pin (MOSI)
REG_PIOA_ABSR &= ~PIO_ABSR_P27; // Transfer Pin control from PIO to SPI
REG_PIOA_PDR |= PIO_PDR_P27; // disable pio to control this pin (SCLK)
REG_PIOA_ABSR &= ~PIO_ABSR_P28; // Transfer Pin control from PIO to SPI
REG_PIOA_PDR |= PIO_PDR_P28; //disable pio to control this pin (NSS)
REG_SPI0_CR = 1; // Enable SPI
REG_SPI0_MR = 0; // Slave mode
SPI0->SPI_IER = SPI_IER_RDRF; // Receive Data Register Full Interrupt
NVIC_EnableIRQ(SPI0_IRQn);
REG_SPI0_CSR &= ~SPI_CSR_CPOL; //mode 0
SPI0->SPI_CSR[0] = SPI_CSR_NCPHA | SPI_CSR_BITS_8_BIT; // Shift on falling edge and transfer 8 bits.
Serial.println("START");
}
bool flag = false;
uint8_t DataReceived;
//int DataReceived[31];
void SPI0_Handler()
{
uint32_t status = SPI0->SPI_SR;
if (status & SPI_SR_RDRF) {
DataReceived = SPI0->SPI_RDR & SPI_RDR_RD_Msk;
flag = true;
}
if (status & SPI_SR_TDRE) {
SPI0->SPI_TDR = (uint16_t)DataReceived;
}
}
void loop() {
if (flag) {
flag = false;
Serial.println(DataReceived, HEX);
}
}