Other Parts Discussed in Thread: SYSBIOS, OMAP-L138
请问下,使用EDMA3 spi出现传输数据错误,发现传输数据都变0了,不知道哪里有存在问题?
EDMA3初始化:
void Init(void)
{
// 使能 EDMA3CC_0
PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_CC0, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
// 使能 EDMA3TC_0
PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_TC0, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
EDMA3Init(SOC_EDMA30CC_0_REGS, EVT_QUEUE_NUM);
/* Request DMA Channel and TCC for SPI1 Transmit*/
EDMA3RequestChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA, \
EDMA3_CHA_SPI1_TX, EDMA3_CHA_SPI1_TX, EVT_QUEUE_NUM);
/* Request DMA Channel and TCC for SPI1 Receive*/
EDMA3RequestChannel(SOC_EDMA30CC_0_REGS, EDMA3_CHANNEL_TYPE_DMA, \
EDMA3_CHA_SPI1_RX, EDMA3_CHA_SPI1_RX, EVT_QUEUE_NUM);
}
spi 初始化如下:
void Spi1Init(void)
{
unsigned char cs = 0x00;
unsigned char dcs = 0x01;
unsigned int val = SIMO_SOMI_CLK;
// CS HIGH
SPI1_CS1_HIGH();
SPI1_CS2_HIGH();
DevSpi_PowerClockSet();
DevSpi_PinMuxSet();
#if USE_SPI1
SPIReset(SOC_SPI_1_REGS);
SPIOutOfReset(SOC_SPI_1_REGS);
SPIModeConfigure(SOC_SPI_1_REGS, SPI_MASTER_MODE);
SPIClkConfigure(SOC_SPI_1_REGS, SPI_MODULE_CLK, SPI1_COM_CLK, SPI_DATA_FORMAT0);
SPIPinControl(SOC_SPI_1_REGS, 0, 0, &val);
SPIDefaultCSSet(SOC_SPI_1_REGS, dcs);
// 配置 SPI 数据格式
DevSpi1_DataFormatConfig(SPI_DATA_FORMAT0);
// 配置 SPI 数据格式及片选信号
SPIDat1Config(SOC_SPI_1_REGS, SPI_DATA_FORMAT0, cs);
// 使能 SPI
SPIEnable(SOC_SPI_1_REGS);
#endif
}
spi test函数如下:
void DevSpi_test(unsigned int tx_length)
{
// unsigned char temp[10];
unsigned int cnt =0;
volatile char dummy;
volatile char TxData[100];
for (cnt = 0; cnt < tx_length*2 ; ++cnt)
{
TxData[cnt] = cnt;
}
Spi1TxParamSet(EDMA3_CHA_SPI1_TX, EDMA3_CHA_SPI1_TX, TxData, tx_length);
/* Registering Callback Function for Transmission. */
cb_Fxn[EDMA3_CHA_SPI1_TX] = &SpiCallBack;
/* Configure the PaRAM registers in EDMA for Reception.*/
Spi1RxParamSet(EDMA3_CHA_SPI1_RX, EDMA3_CHA_SPI1_RX,&dummy, tx_length, FALSE);
/* Registering Callback Function for Reception. */
cb_Fxn[EDMA3_CHA_SPI1_RX] = &SpiCallBack;
/* Assert the CSHOLD line corresponding to the SPI Flash. */
SPI1_CS1_LOW();
// SPIDat1Config(SOC_SPI_1_REGS, SPI_DATA_FORMAT_USER, 0x01);
/* Enable SPI controller to generate DMA events */
SPIIntEnable(SOC_SPI_1_REGS, SPI_DMA_REQUEST_ENA_INT);
/* Wait until both the flags are set to 1 in the callback function. */
Semaphore_pend(g_spiEdmaSem1, 10);
Semaphore_pend(g_spiEdmaSem2, 10);
SPIIntDisable(SOC_SPI_1_REGS, SPI_DMA_REQUEST_ENA_INT);
/* Deassert the CSHOLD line corresponding to the SPI Flash. */
SPI1_CS1_HIGH();
}