Part Number: TDA4VM
Hi,
TDA4(J721E) ,SDK 8.0
Issue:
SPI3 and SPI5 are setting Tx and Rx
SPI3 TX is OK,but Rx register is keep 0, (CH1,CH2 and CH3 are the same)
check SPI bus, Tx and Rx data is OK. (use logic analyzer, waveform and data is right).
Set the SPI3 Tx and Rx PINs as output , pull up or down, output are changed high or low on the logic analyzer.
SPI5 use the similar setting, it works well.
PINMUX seting as below:
static pinmuxPerCfg_t gSpi3PinCfg[] =
{
/* MySPI3 -> SPI3_CLK -> Y25 */
{
PIN_PRG0_PRU1_GPO17, PIN_MODE(4) | \
((PIN_PULL_DIRECTION) & (~PIN_PULL_DISABLE & ~PIN_INPUT_ENABLE))
},
/* MySPI3 -> SPI3_D0 -> AA26 */
{
PIN_PRG0_PRU1_GPO18, PIN_MODE(4) | \
((0x50000) & (~PIN_PULL_DISABLE & ~PIN_PULL_DIRECTION & ~PIN_INPUT_ENABLE))
},
/* MySPI3 -> SPI3_D1 -> AA29 */
{
PIN_PRG0_PRU1_GPO19, PIN_MODE(4) | \
((PIN_INPUT_ENABLE) & (~PIN_PULL_DISABLE & ~PIN_PULL_DIRECTION))
},
/* MySPI3 -> SPI3_CS1 -> AB26 */
{
PIN_PRG0_PRU0_GPO9, PIN_MODE(4) | \
((PIN_PULL_DIRECTION) & (~PIN_PULL_DISABLE & ~PIN_INPUT_ENABLE))
},
/* MySPI3 -> SPI3_CS2 -> AB25 */
{
PIN_PRG0_PRU0_GPO10, PIN_MODE(4) | \
((PIN_PULL_DIRECTION) & (~PIN_PULL_DISABLE & ~PIN_INPUT_ENABLE))
},
/* MySPI3 -> SPI3_CS3 -> Y24 */
{
PIN_PRG0_PRU1_GPO9, PIN_MODE(4) | \
((PIN_PULL_DIRECTION) & (~PIN_PULL_DISABLE & ~PIN_INPUT_ENABLE))
},
{PINMUX_END}
};
Code for SPI:
void USS_MCU_McSPI3SetUp(void)
{
uint32_t ch_id = 0;
uint32_t reg = 0;
/* Reset the McSPI instance.*/
McSPIReset(MCU_MCSPI3_BASE_ADDRESS);
/* CLOCKACTIVITY bit - OCP and Functional clocks are maintained */
/* SIDLEMODE bit - Ignore the idle request and configure in normal mode
*/
/* AUTOIDLE bit - Disable (OCP clock is running free, no gating) */
MCSPISysConfigSetup(MCU_MCSPI3_BASE_ADDRESS, MCSPI_CLOCKS_OCP_ON_FUNC_ON,
MCSPI_SIDLEMODE_NO, MCSPI_WAKEUP_DISABLE,
MCSPI_AUTOIDLE_OFF);
McSPICSEnable(MCU_MCSPI3_BASE_ADDRESS);
/* Enable master mode of operation.*/
McSPIMasterModeEnable(MCU_MCSPI3_BASE_ADDRESS);
McSPIMultipleWordAccessConfig(MCU_MCSPI3_BASE_ADDRESS,MCSPI_MODULCTRL_MOA_MULTIACCES);
for (ch_id = 1; ch_id < (USS_SPI3_CS_NUM+1); ch_id++) //SPI3 CS1,CS2,CS3
{
/* Perform the necessary configuration for master mode. */
McSPIMasterModeConfig(MCU_MCSPI3_BASE_ADDRESS, MCSPI_SINGLE_CH,
MCSPI_TX_RX_MODE,
MCSPI_DATA_LINE_COMM_MODE_6,
ch_id);
/* Configure the McSPI bus clock depending on clock mode. */
McSPIClkConfig(MCU_MCSPI3_BASE_ADDRESS, USS_MCSPI3_IN_CLK, USS_MCSPI3_OUT_CLK, ch_id,
MCSPI_CLK_MODE_1);
/* Configure the word length.*/
McSPIWordLengthSet(MCU_MCSPI3_BASE_ADDRESS, MCSPI_WORD_LENGTH(16), ch_id);
/* Set the EPOL field with the user sent value. */
McSPICSPolarityConfig(MCU_MCSPI3_BASE_ADDRESS,
(MCSPI_CH0CONF_EPOL_ACTIVELOW <<
MCSPI_CH0CONF_EPOL_SHIFT), ch_id);
/* Enable the transmitter FIFO of McSPI peripheral.*/
McSPITxFIFOConfig(MCU_MCSPI3_BASE_ADDRESS, MCSPI_TX_FIFO_ENABLE, ch_id);
/* Enable the receiver FIFO of McSPI peripheral.*/
McSPIRxFIFOConfig(MCU_MCSPI3_BASE_ADDRESS, MCSPI_RX_FIFO_ENABLE, ch_id);
}
}
void USS_SPI3_CHX_Tx_Rx(uint8_t Datalength, uint16_t *pTxData, uint16_t *pRxData,uint8_t ch_id)
{
uint8_t BufferCounter =0;
uint32_t SPIINTStatus =0;
uint32_t Timerout ;
uint32_t SPI_CH_Rx_Mask ;
uint32_t SPI_CH_Tx_Mask ;
switch(ch_id)
{
case 1:
SPI_CH_Rx_Mask = MCSPI_CH1STAT_RXS_MASK;
SPI_CH_Tx_Mask = MCSPI_CH1STAT_TXS_MASK;
break;
case 2:
SPI_CH_Rx_Mask = MCSPI_CH2STAT_RXS_MASK;
SPI_CH_Tx_Mask = MCSPI_CH2STAT_TXS_MASK;
break;
case 3:
SPI_CH_Rx_Mask = MCSPI_CH3STAT_RXS_MASK;
SPI_CH_Tx_Mask = MCSPI_CH3STAT_TXS_MASK;
break;
default:
SPI_CH_Rx_Mask = MCSPI_CH1STAT_RXS_MASK;
SPI_CH_Tx_Mask = MCSPI_CH1STAT_TXS_MASK;
break;
}
USS_SPI3_ENABLE(ch_id);
while( BufferCounter<Datalength)
{
Timerout =0xffff;
SPIINTStatus = McSPIChannelStatusGet(USS_PDMA_MISC_SPI3_BASE_ADDR,ch_id);
while(0 == (SPIINTStatus&SPI_CH_Tx_Mask))
{
SPIINTStatus = McSPIChannelStatusGet(USS_PDMA_MISC_SPI3_BASE_ADDR,ch_id);
Timerout--;
if(0 == Timerout)
{
//USS_MCU_McSPI5SetUp();
appLogPrintf("\nSPI3 SPITx break error ");
break;
}
}
McSPITransmitData(USS_PDMA_MISC_SPI3_BASE_ADDR,(uint32_t) (*pTxData),ch_id);
pTxData++;
Timerout =0xffff;
SPIINTStatus = McSPIChannelStatusGet(USS_PDMA_MISC_SPI3_BASE_ADDR,ch_id);
while(0 == (SPIINTStatus&SPI_CH_Rx_Mask))
{
SPIINTStatus = McSPIChannelStatusGet(USS_PDMA_MISC_SPI3_BASE_ADDR,ch_id);
Timerout--;
if(0 == Timerout)
{
//USS_MCU_McSPI5SetUp();
appLogPrintf("\nSPI3 SPITx break error ");
break;
}
}
*pRxData= (uint16_t)McSPIReceiveData(USS_PDMA_MISC_SPI3_BASE_ADDR,ch_id);
uint32_t wTemp ;
wTemp= (uint16_t)McSPIReceiveData(USS_PDMA_MISC_SPI3_BASE_ADDR,ch_id);
appLogPrintf("\nSPI3 Rx Data CH %d DATA %x ",ch_id,wTemp);
pRxData++;
BufferCounter++;
}
USS_SPI3_DISABLE(ch_id);
}




