TI中文支持网
TI专业的中文技术问题搜集分享网站

AM5718: DSP核使用SPI通信失败

Part Number:AM5718Other Parts Discussed in Thread:SYSBIOS

使用Linux端操作SPI1回环通信测试没问题,而通过DSP端配置SPI1调用SPI_transfer一直卡住在这里。

看了论坛上很多帖子,没有找到如何配置SPI这方面的内容。

以下是部分配置程序:

#ifndef BARE_METAL
/* XDCtools Header files */
#include <xdc/std.h>
#include <xdc/cfg/global.h>
#include <xdc/runtime/System.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/Diags.h>
#include <xdc/runtime/Log.h>
#include <xdc/runtime/Assert.h>
#include <xdc/runtime/Registry.h>

/* BIOS Header files */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#include <ti/sysbios/knl/Clock.h>
#include <ti/ipc/Ipc.h>
#include <ti/ipc/MessageQ.h>
#include <ti/ipc/MultiProc.h>
#endif

#include <stdio.h>
#include <ti/csl/example/utils/common/inc/app_utils.h>
#include <ti/csl/soc.h>
#include <ti/csl/hw_types.h>

/* TI-RTOS Header files */
#include <ti/drv/gpio/GPIO.h>
#include <ti/drv/gpio/soc/GPIO_soc.h>

#include <ti/drv/gpio/test/led_blink/src/GPIO_log.h>
#include <ti/drv/gpio/test/led_blink/src/GPIO_board.h>

#include <ti/board/board.h>

#include <ti/osal/osal.h>
/* SPI Header files */
#include <ti/drv/spi/SPI.h>
#include <ti/csl/csl_mcspi.h>
#include <ti/drv/spi/soc/SPI_soc.h>
#include <ti/drv/spi/src/SPI_osal.h>

/* ========================================================================== */
/* Macros */
/* ========================================================================== */

#define McSPI_DATA_COUNT 50U // Data Count Transaction
#define MCSPI_INSTANCE 0

/* clock callback function */
void clockFxn(UArg);

/**********************************************************************
************************** Global Variables **************************
**********************************************************************/
volatile uint32_t gpio_intr_triggered = 0;
uint32_t gpioBaseAddr;
uint32_t gpioPin;
uint8_t gRxBuffer[McSPI_DATA_COUNT];
uint8_t gTxBuffer[McSPI_DATA_COUNT];

SPI_Handle gSpiHandle;

void SPI_callback(SPI_Handle handle, SPI_Transaction *transaction);
/* SPI parameters structure Master mode*/
SPI_Params gSpiParams = {
SPI_MODE_BLOCKING , /* transferMode */
SemaphoreP_WAIT_FOREVER,/* transferTimeout */
NULL, /* transferCallbackFxn */
SPI_MASTER, /* mode */
1000000, /* bitRate */
8, /* dataSize */
SPI_POL0_PHA0, /* frameFormat */
NULL /* custom */
};

static void McSPIInitializeBuffers(void)
{
uint32_t index = 0;

for (index = 0; index < McSPI_DATA_COUNT; index++)
{
/* Initialize the gTxBuffer McSPI1 with a known pattern of data */
gTxBuffer[index] = index;
/* Initialize the gRxBuffer McSPI1 with 0 */
gRxBuffer[index] = (uint32_t) 0;
}
}

static int32_t McSPIVerifyData(void)
{
uint32_t index = 0;
int32_t retVal = 0;

for (index = 0; index < McSPI_DATA_COUNT; index++)
{
if(gRxBuffer[index] != gTxBuffer[index])
{
retVal = -1;
break;
}
}

return retVal;
}

void SPI_callback(SPI_Handle handle, SPI_Transaction *transaction)
{
System_printf("call back…\r\n");
}

/*
* ======== test function ========
*/
void spi_test(UArg arg0, UArg arg1)
{
/* GPIO initialization */

int32_t retVal;
uint32_t index = 0;
SPI_Transaction transaction;
System_printf("spi task…\r\n");
System_printf("SPI_open…");
gSpiHandle = SPI_open(MCSPI_INSTANCE, &gSpiParams);
if(gSpiHandle == NULL)
{
System_printf("\nError opening MCSPI driver\n");
}
System_printf("OK\r\n");
McSPIInitializeBuffers();
System_printf("gTxBuffer:",gTxBuffer[index]);
for(index = 0; index < McSPI_DATA_COUNT; index++)
{
System_printf("%d ",gTxBuffer[index]);
}
System_printf("\r\n",gTxBuffer[index]);

transaction.count = McSPI_DATA_COUNT;
transaction.txBuf = gTxBuffer;
transaction.rxBuf = gRxBuffer;
System_printf("SPI_transfer…");
retVal = SPI_transfer(gSpiHandle, &transaction);
if(retVal == 0)//false
{
System_printf("ERROR\r\n");
}
else
{
System_printf("OK\r\n");
}

retVal = McSPIVerifyData();
if(retVal != 0)
{
System_printf("retVal = %d\r\n",retVal);
}
else
{
System_printf("retVal = %d\r\n",retVal);
}
System_printf("gRxBuffer:%s\r\n",gRxBuffer);
System_printf("SPI_transfer…");
SPI_close(gSpiHandle);
System_printf("OK\r\n");
while (1) {
System_printf("spi %d…\r\n",Clock_getTicks());
Task_sleep(1000);
}

}

void led_test(UArg arg0, UArg arg1)
{
/* GPIO initialization */
System_printf("led task…\r\n");
GPIO_write(0, GPIO_PIN_VAL_HIGH);//熄灭

while (1) {
GPIO_toggle(0);
//System_printf("led %d…\r\n",Clock_getTicks());
Task_sleep(1000);
}

}

extern void TimerFxn(UArg arg);
#ifndef BARE_METAL
/*
* ======== main ========
*/
int main(void)
{
Task_Handle task ;
Task_Params task_led_param;
Error_Block eb;
Error_init(&eb);

PinmuxMCSPIConfig();
PinmuxGpioLedConfig(0);

SPI_init();
GPIO_init();

task = Task_create(spi_test, NULL, &eb);
if (task == NULL) {
System_printf("Task_create() failed!\n");
BIOS_exit(0);
}

task = Task_create(led_test, NULL, &eb);
if (task == NULL) {
System_printf("Task_create() failed!\n");
BIOS_exit(0);
}

System_printf("task create\n");
/* Start BIOS */

BIOS_start();
return (0);
}
#endif

void clockFxn(UArg arg)
{
//Clock_tick();
}

void TimerFxn(UArg arg)
{
Clock_tick();
// GPIO_toggle(0);
//asm(" NOP");
}

驱动配置如下:

void PinmuxMCSPIConfig()
{

/* SPI1_SCLK */
HW_WR_REG32((CSL_MPU_CORE_PAD_IO_REGISTERS_REGS + CTRL_CORE_PAD_SPI1_SCLK),
0x00050000);

/* SPI1_D0 */
HW_WR_REG32((CSL_MPU_CORE_PAD_IO_REGISTERS_REGS + CTRL_CORE_PAD_SPI1_D0),
0x00050000);

/* SPI1_D1 */
HW_WR_REG32((CSL_MPU_CORE_PAD_IO_REGISTERS_REGS + CTRL_CORE_PAD_SPI1_D1),
0x00060000);

/* SPI1_CS0 */
HW_WR_REG32((CSL_MPU_CORE_PAD_IO_REGISTERS_REGS + CTRL_CORE_PAD_SPI1_CS0),
0x00060000);

}

能帮我看看是哪里出了问题吗?

提前谢谢了!

Nancy Wang:

是否有测试过SDK中的spi例程:

6.8.5 Examples

software-dl.ti.com/…/index_device_drv.html

,

hongyou lu:

就是通过这个例程修改的,但是这个例程不能直接运行,否则A15核Linux那边会挂掉,因为调用了Board_Init();

目前遇到的问题就是通过A15核Linux测试SPI1回环有数据,并且示波器检测CLK有波形,但是通过DSP核RTOS触发SPI没有数据,CLK也没有波形,根据芯片手册配置CLK、D0、D1、CS0的寄存器,但怎么配置CLK都没有波形输出。

参考了这个例程,依然没有输出波形和数据:

https://www.ti2k.com/wp-content/uploads/ti2k/DeyiSupport_DSP_3133244

,

hongyou lu:

我使能了CLK寄存器后,能够传输数据了,但是目前最大只能使用3Mhz左右的波特率

,

Nancy Wang:

单独测试DSP核速率有问题吗?

,

hongyou lu:

根据例程已实现最高48Mhz,谢谢!

,

Nancy Wang:

hongyou lu 说:目前最大只能使用3Mhz左右的波特率

好的,感谢分享!这个是什么问题导致的呢?

,

hongyou lu:

之前没有正确地设置好SPI时钟导致的

,

Nancy Wang:

好的,感谢分享!

赞(0)
未经允许不得转载:TI中文支持网 » AM5718: DSP核使用SPI通信失败
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1