Hello,
I have MIBSPI3 set up as a slave to receive data. I have it working, however, the data is always rotated. If I see [0,1,2,3,4,5,6,7] on the scope, I'll see [7,0,1,2,3,4,5,6] in my receive buffer after calling mibspiGetData(). Relevant code and scope outputs provided below. I think it likely has to do with the initialization of MIBSPI3, but I can't nail down where.
for(i=0;i<FSR/TGROUP_SIZE;i++) //TGROUP_SIZE = 8, FSR = 16 { mibspiSetData(mibspiREG3, 0, DummyTX); //This is dummy data on slave that doesn't go anywhere //set group 0, length 8, charlen 16, trigger rising on GIOA6, oneshot transfer, CS_NONE, dataFormat0, buffer mode 4 //lock transmission, enable WDELAY, chip select hold and transfer group pointer reset are ALL unchecked mibspiTransfer(mibspiREG3, 0); mibspiSetData(mibspiREG1, 1, tx); //Set Master Data //set group 1, length 8, charlen 16, trigger rising on GIOA7, oneshot transfer, CS_NONE, dataFormat0, buffer mode 4 //lock transmission, enable WDELAY, chip select hold and transfer group pointer reset are ALL unchecked mibspiTransfer(mibspiREG1, 1); tx += TGROUP_SIZE; //trigger master and slave gioSetBit(gioPORTA,6,1); gioSetBit(gioPORTA,7,1); while (mibspiIsTransferComplete(mibspiREG3, 0) == 0); // wait here until transfer is complete gioSetBit(gioPORTA,6,0); gioSetBit(gioPORTA,7,0); status = mibspiGetData(mibspiREG3, 0, prx); prx += TGROUP_SIZE; sClockRx += (16*8); }
Code generated by HalCoGen 3.06
/** bring MIBSPI out of reset */ mibspiREG3->GCR0 = 1U; /** enable MIBSPI RAM Parity */ mibspiREG3->UERRCTRL = (mibspiREG3->UERRCTRL & 0xFFFFFFF0U) | (0x00000005U); /** enable MIBSPI3 multibuffered mode and enable buffer RAM */ mibspiREG3->MIBSPIE = (mibspiREG3->MIBSPIE & 0xFFFFFFFEU) | 1U; /** MIBSPI3 master mode and clock configuration */ mibspiREG3->GCR1 = (mibspiREG3->GCR1 & 0xFFFFFFFCU) | ((0U << 1U) /* CLOKMOD */ | 0U); /* MASTER */ /** MIBSPI3 enable pin configuration */ mibspiREG3->INT0 = (mibspiREG3->INT0 & 0xFEFFFFFFU) | (0U << 24U); /* ENABLE HIGHZ */ /** - Delays */ mibspiREG3->DELAY = (0U << 24U) /* C2TDELAY */ | (0U << 16U) /* T2CDELAY */ | (0U << 8U) /* T2EDELAY */ | 0U; /* C2EDELAY */ /** - Data Format 0 */ mibspiREG3->FMT0 = (0U << 24U) /* wdelay */ | (0U << 23U) /* parity Polarity */ | (0U << 22U) /* parity enable */ | (0U << 21U) /* wait on enable */ | (0U << 20U) /* shift direction */ | (1U << 17U) /* clock polarity */ | (0U << 16U) /* clock phase */ | (7U << 8U) /* baudrate prescale */ | 16U; /* data word length */ /** - Data Format 1 */ mibspiREG3->FMT1 = (0U << 24U) /* wdelay */ | (0U << 23U) /* parity Polarity */ | (0U << 22U) /* parity enable */ | (0U << 21U) /* wait on enable */ | (0U << 20U) /* shift direction */ | (0U << 17U) /* clock polarity */ | (1U << 16U) /* clock phase */ | (7U << 8U) /* baudrate prescale */ | 8U; /* data word length */ /** - Data Format 2 */ mibspiREG3->FMT2 = (0U << 24U) /* wdelay */ | (0U << 23U) /* parity Polarity */ | (0U << 22U) /* parity enable */ | (0U << 21U) /* wait on enable */ | (0U << 20U) /* shift direction */ | (0U << 17U) /* clock polarity */ | (1U << 16U) /* clock phase */ | (7U << 8U) /* baudrate prescale */ | 16U; /* data word length */ /** - Data Format 3 */ mibspiREG3->FMT3 = (0U << 24U) /* wdelay */ | (0U << 23U) /* parity Polarity */ | (0U << 22U) /* parity enable */ | (0U << 21U) /* wait on enable */ | (0U << 20U) /* shift direction */ | (0U << 17U) /* clock polarity */ | (0U << 16U) /* clock phase */ | (99U << 8U) /* baudrate prescale */ | 16U; /* data word length */ /** - Default Chip Select */ mibspiREG3->DEF = (uint32)(0x00U); /** - wait for buffer initialization complete before accessing MibSPI registers */ /*SAFETYMCUSW 28 D MR:NA <APPROVED> "Hardware status bit read check" */ while ((mibspiREG3->FLG & 0x01000000U) != 0U) { } /* Wait */ /** - initialize transfer groups */ mibspiREG3->TGCTRL[0U] = (1U << 30U) /* oneshot */ | (0U << 29U) /* pcurrent reset */ | (TRG_RISING << 20U) /* trigger event */ | (TRG_GIOA6 << 16U) /* trigger source */ | (0U << 8U); /* start buffer */ mibspiREG3->TGCTRL[1U] = (0U << 30U) /* oneshot */ | (0U << 29U) /* pcurrent reset */ | (TRG_ALWAYS << 20U) /* trigger event */ | (TRG_DISABLED << 16U) /* trigger source */ | (8U << 8U); /* start buffer */ mibspiREG3->TGCTRL[2U] = (1U << 30U) /* oneshot */ | (0U << 29U) /* pcurrent reset */ | (TRG_ALWAYS << 20U) /* trigger event */ | (TRG_DISABLED << 16U) /* trigger source */ | ((8U+8U) << 8U); /* start buffer */ mibspiREG3->TGCTRL[3U] = (1U << 30U) /* oneshot */ | (0U << 29U) /* pcurrent reset */ | (TRG_ALWAYS << 20U) /* trigger event */ | (TRG_DISABLED << 16U) /* trigger source */ | ((8U+8U+0U) << 8U); /* start buffer */ mibspiREG3->TGCTRL[4U] = (1U << 30U) /* oneshot */ | (0U << 29U) /* pcurrent reset */ | (TRG_ALWAYS << 20U) /* trigger event */ | (TRG_DISABLED << 16U) /* trigger source */ | ((8U+8U+0U+0U) << 8U); /* start buffer */ mibspiREG3->TGCTRL[5U] = (1U << 30U) /* oneshot */ | (0U << 29U) /* pcurrent reset */ | (TRG_ALWAYS << 20U) /* trigger event */ | (TRG_DISABLED << 16U) /* trigger source */ | ((8U+8U+0U+0U+0U) << 8U); /* start buffer */ mibspiREG3->TGCTRL[6U] = (1U << 30U) /* oneshot */ | (0U << 29U) /* pcurrent reset */ | (TRG_ALWAYS << 20U) /* trigger event */ | (TRG_DISABLED << 16U) /* trigger source */ | ((8U+8U+0U+0U+0U+0U) << 8U); /* start buffer */ mibspiREG3->TGCTRL[7U] = (1U << 30U) /* oneshot */ | (0U << 29U) /* pcurrent reset */ | (TRG_ALWAYS << 20U) /* trigger event */ | (TRG_DISABLED << 16U) /* trigger source */ | ((8U+8U+0U+0U+0U+0U+0U) << 8U); /* start buffer */ mibspiREG3->TGCTRL[8U] = (8U+8U+0U+0U+0U+0U+0U+0U) << 8U; mibspiREG3->LTGPEND = (mibspiREG3->LTGPEND & 0xFFFF00FFU) | (((8U+8U+0U+0U+0U+0U+0U+0U)-1U) << 8U); /** - initialize buffer ram */ { i = 0U; /*SAFETYMCUSW 139 S MR: 13.7 REVIEWED " If condition cannot be removed as the LHS depends on GUI configuraion " */ if (8U > 0U) { while (i < (8U-1U)) { mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold */ | (0U << 11U) /* lock transmission */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold must be zero for last buffer */ | (0U << 10U) /* enable WDELAY */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } /*SAFETYMCUSW 139 S MR: 13.7 REVIEWED " If condition cannot be removed as the LHS depends on GUI configuraion " */ if (8U > 0U) { while (i < ((8U+8U)-1U)) { mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold */ | (0U << 11U) /* lock transmission */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold must be zero for last buffer */ | (0U << 10U) /* enable WDELAY */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } /*SAFETYMCUSW 139 S MR: 13.7 REVIEWED " If condition cannot be removed as the LHS depends on GUI configuraion " */ if (0U > 0U) { while (i < ((8U+8U+0U)-1U)) { mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold */ | (0U << 11U) /* lock transmission */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold must be zero for last buffer */ | (0U << 10U) /* enable WDELAY */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } /*SAFETYMCUSW 139 S MR: 13.7 REVIEWED " If condition cannot be removed as the LHS depends on GUI configuraion " */ if (0U > 0U) { while (i < ((8U+8U+0U+0U)-1U)) { mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold */ | (0U << 11U) /* lock transmission */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold must be zero for last buffer */ | (0U << 10U) /* enable WDELAY */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } /*SAFETYMCUSW 139 S MR: 13.7 REVIEWED " If condition cannot be removed as the LHS depends on GUI configuraion " */ if (0U > 0U) { while (i < ((8U+8U+0U+0U+0U)-1U)) { mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold */ | (0U << 11U) /* lock transmission */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold must be zero for last buffer */ | (0U << 10U) /* enable WDELAY */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } /*SAFETYMCUSW 139 S MR: 13.7 REVIEWED " If condition cannot be removed as the LHS depends on GUI configuraion " */ if (0U > 0U) { while (i < ((8U+8U+0U+0U+0U+0U)-1U)) { mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold */ | (0U << 11U) /* lock transmission */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold must be zero for last buffer */ | (0U << 10U) /* enable WDELAY */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } /*SAFETYMCUSW 139 S MR: 13.7 REVIEWED " If condition cannot be removed as the LHS depends on GUI configuraion " */ if (0U > 0U) { while (i < ((8U+8U+0U+0U+0U+0U+0U)-1U)) { mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold */ | (0U << 11U) /* lock transmission */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold must be zero for last buffer */ | (0U << 10U) /* enable WDELAY */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } /*SAFETYMCUSW 139 S MR: 13.7 REVIEWED " If condition cannot be removed as the LHS depends on GUI configuraion " */ if (0U > 0U) { while (i < ((8U+8U+0U+0U+0U+0U+0U+0U)-1U)) { mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold */ | (0U << 11U) /* lock transmission */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } mibspiRAM3->tx[i].control = (4U << 13U) /* buffer mode */ | (0U << 12U) /* chip select hold must be zero for last buffer */ | (0U << 10U) /* enable WDELAY */ | (0U << 8U) /* data format */ |(uint32)((~(uint32)((0x00U) ^ CS_NONE) & 0xFFU)); /* chip select */ i++; } } /** - set interrupt levels */ mibspiREG3->LVL = (0U << 9U) /* TXINT */ | (0U << 8U) /* RXINT */ | (0U << 6U) /* OVRNINT */ | (0U << 4U) /* BITERR */ | (0U << 3U) /* DESYNC */ | (0U << 2U) /* PARERR */ | (0U << 1U) /* TIMEOUT */ | (0U); /* DLENERR */ /** - clear any pending interrupts */ mibspiREG3->FLG |= 0xFFFFU; /** - enable interrupts */ mibspiREG3->INT0 = (mibspiREG3->INT0 & 0xFFFF0000U) | (0U << 9U) /* TXINT */ | (0U << 8U) /* RXINT */ | (0U << 6U) /* OVRNINT */ | (0U << 4U) /* BITERR */ | (0U << 3U) /* DESYNC */ | (0U << 2U) /* PARERR */ | (0U << 1U) /* TIMEOUT */ | (0U); /* DLENERR */ /** @b initialize @b MIBSPI3 @b Port */ /** - MIBSPI3 Port output values */ mibspiREG3->PC3 = 1U /* SCS[0] */ | (1U << 1U) /* SCS[1] */ | (1U << 2U) /* SCS[2] */ | (1U << 3U) /* SCS[3] */ | (1U << 4U) /* SCS[4] */ | (1U << 5U) /* SCS[5] */ | (0U << 8U) /* ENA */ | (0U << 9U) /* CLK */ | (0U << 10U) /* SIMO */ | (0U << 11U); /* SOMI */ /** - MIBSPI3 Port direction */ mibspiREG3->PC1 = 0U /* SCS[0] */ | (0U << 1U) /* SCS[1] */ | (1U << 2U) /* SCS[2] */ | (1U << 3U) /* SCS[3] */ | (1U << 4U) /* SCS[4] */ | (1U << 5U) /* SCS[5] */ | (0U << 8U) /* ENA */ | (1U << 9U) /* CLK */ | (0U << 10U) /* SIMO */ | (1U << 11U); /* SOMI */ /** - MIBSPI3 Port open drain enable */ mibspiREG3->PC6 = 0U /* SCS[0] */ | (0U << 1U) /* SCS[1] */ | (0U << 2U) /* SCS[2] */ | (0U << 3U) /* SCS[3] */ | (0U << 4U) /* SCS[4] */ | (0U << 5U) /* SCS[5] */ | (0U << 8U) /* ENA */ | (0U << 9U) /* CLK */ | (0U << 10U) /* SIMO */ | (0U << 11U); /* SOMI */ /** - MIBSPI3 Port pullup / pulldown selection */ mibspiREG3->PC8 = 1U /* SCS[0] */ | (1U << 1U) /* SCS[1] */ | (1U << 2U) /* SCS[2] */ | (1U << 3U) /* SCS[3] */ | (1U << 4U) /* SCS[4] */ | (1U << 5U) /* SCS[5] */ | (1U << 8U) /* ENA */ | (1U << 9U) /* CLK */ | (1U << 10U) /* SIMO */ | (1U << 11U); /* SOMI */ /** - MIBSPI3 Port pullup / pulldown enable*/ mibspiREG3->PC7 = 0U /* SCS[0] */ | (0U << 1U) /* SCS[1] */ | (0U << 2U) /* SCS[2] */ | (0U << 3U) /* SCS[3] */ | (0U << 4U) /* SCS[4] */ | (0U << 5U) /* SCS[5] */ | (0U << 8U) /* ENA */ | (0U << 9U) /* CLK */ | (0U << 10U) /* SIMO */ | (0U << 11U); /* SOMI */ /* MIBSPI3 set all pins to functional */ mibspiREG3->PC0 = 0U /* SCS[0] */ | (0U << 1U) /* SCS[1] */ | (0U << 2U) /* SCS[2] */ | (0U << 3U) /* SCS[3] */ | (0U << 4U) /* SCS[4] */ | (0U << 5U) /* SCS[5] */ | (0U << 8U) /* ENA */ | (1U << 9U) /* CLK */ | (1U << 10U) /* SIMO */ | (1U << 11U); /* SOMI */ /** - Finally start MIBSPI3 */ mibspiREG3->GCR1 = (mibspiREG3->GCR1 & 0xFEFFFFFFU) | (1U << 24U);