TI论坛
直播中

李颜

8年用户 1463经验值
私信 关注
[问答]

DDP4422的SPI通信异常的原因?


  • 您好!我们的项目使用到了DDP4422的SPI接口SSP_PORT1,DDP4422作为主与C787芯片进行通信
    DDP向C787写数据是正常的;但读数据时,读到的数据不正确。我这边尝试过
    使用SSP.h中的下列API,都不能读到正确的数据。
    SSP_Read
    SSP_PolledRead
    SSP_PolledWriteRead
    SSP_PolledWriteWithRead
       我想请教, 该如何使用上面的API? 谢谢!下面是SPI初始化及读写的接口函数。
    #include "common.h"
    #include "gpio.h"
    #include "ssp.h"
    #include "dbmessage.h"
    int g_current_bank;
    void SysInit(void)
    {
    SSPINIT spi_cfg;
    spi_cfg.PortEnable = TRUE;
    spi_cfg.PortMode = SSP_MASTER;
    spi_cfg.XFERMode = SSP_XFER_AUTO;
    spi_cfg.ClockRateHz = 25000000;
    spi_cfg.DataBits = SSP_16BITS;
    spi_cfg.*** = SSP_HIGH_IDLE;
    spi_cfg.*** = SSP_XFR_2ND_CLK_EDGE;
    spi_cfg.SPIDuplex = SSP_FULLDUPLEX;
    spi_cfg.ChipSelect = SSP_CS0;
    spi_cfg.AssertDelay = 0;
    spi_cfg.DeAssertDelay = 0;
    spi_cfg.InterWordDelay = 0;

    SSP_InitConfigData(SSP_PORT1, SSP_CS0, &spi_cfg);
    }

    //-------------------------------------------------------------
    // C787 Register read access
    //-------------------------------------------------------------
    unsigned int read_C787( int ad )
    {
    int bank, addr, nbyte, wbyte, rbytes;
    unsigned int dt;
    uint16 rdt, bdt, wdt, rdbuf;
    int08 rc1, rc2, rd1byte;
    uint16 wbuf;
    uint08 rbuff[4];
    uint32 wtimeout, rtimeout, sizewritten, sizereaded;
    uint32 outclk;
    dt = 0;
    bank = ( ad >> 16 ) & 0xff;
    addr = ( ad >> 8 ) & 0xff;
    nbyte = ad & 0xff;
    SSP_ReservePortSemaphore(SSP_PORT1, 10);
    if ( bank != g_current_bank ) {
    g_current_bank = bank;
    bdt = ((((0x00 | 0x80) << 8) & 0xff00) | (bank & 0xff));
    rc1 = SSP_PolledWrite(SSP_PORT1, SSP_CS0, 2, &bdt, 100, &sizewritten);
    // dbmsg_ftrace(DBM_C787, "SSP_PolledWrite addr = %06x, rc = %d, wbyte = %drn", addr, rc1, sizewritten);
    }
    while ( nbyte > 0 ) {
    nbyte--;
    dt = ( dt << 8 );
    wbuf = (0x00 << 8) | ((addr + nbyte) & 0x7f);
    rc2 = SSP_PolledWriteRead(SSP_PORT1, SSP_CS0, 2, &wbuf, 100, &sizewritten, 1, (uint16*)&rd1byte, 100, &sizereaded);
    dt = dt + rd1byte;
    }
    SSP_ReleasePortSemaphore(SSP_PORT1);
    return dt;
    }
    //-------------------------------------------------------------
    // C787 Register write access
    //-------------------------------------------------------------
    void write_C787( int ad, unsigned int dt, int bk_offset, int force )
    {
    int bank, addr, nbyte;
    uint16 bdt, wdata;
    uint32 wbyte;
    int08 rc1, rc2;
    //-------------------------------------------------------------
    bank = (ad >> 16) & 0xff;
    addr = (ad >> 8) & 0xff;
    nbyte = ad & 0xff;
    bank += bk_offset;
    //-------------------------------------------------------------
    SSP_ReservePortSemaphore(SSP_PORT1, 10);
    if ( bank != g_current_bank ) {
    g_current_bank = bank;

    bdt = ((((0x00 | 0x80) << 8) & 0xff00) | (bank & 0xff));
    rc1 = SSP_PolledWrite(SSP_PORT1, SSP_CS0, 2, &bdt, 100, &wbyte);
    }
    //-------------------------------------------------------------
    while ( nbyte > 0 ) {
    wdata = ((((addr | 0x80) << 8) & 0xff00) | (dt & 0xff));
    rc2 = SSP_PolledWrite(SSP_PORT1, SSP_CS0, 2, &wdata, 100, &wbyte);
    addr++;
    dt = ( dt >> 8 );
    nbyte--;
    }
    SSP_ReleasePortSemaphore(SSP_PORT1);
    }

回帖(1)

打马过草原

2025-2-27 18:03:58
您好!根据您的描述,DDP4422与C787芯片之间的SPI通信在写数据时正常,但在读取数据时出现问题。您提到了使用了SSP.h中的API,但未能成功读取正确的数据。以下是一些建议和步骤,希望能帮助您解决问题:

1. 检查硬件连接:确保DDP4422和C787芯片之间的SPI接口连接正确,包括MISO、MOSI、SCK和CS引脚。检查是否有短路或断路的情况。

2. 检查SPI初始化配置:确保您的SPI初始化配置正确,包括时钟频率、CPOL和CPHA等参数。这些参数需要与C787芯片的SPI接口兼容。

3. 检查SPI读写函数:确保您的SPI读写函数正确实现,并且与SSP.h中的API兼容。以下是一些可能的API使用方式:

   a. SSP_Read:使用此函数进行SPI读取操作。确保在调用此函数之前,已经正确配置了SPI接口,并发送了正确的读取命令。

   b. SSP_PolledRead:使用此函数进行SPI轮询读取操作。与SSP_Read类似,确保在调用此函数之前,已经正确配置了SPI接口,并发送了正确的读取命令。

   c. SSP_PolledWrite:使用此函数进行SPI轮询写入操作。确保在调用此函数之前,已经正确配置了SPI接口,并发送了正确的写入命令。

   d. SSP_PolledWriteWithRead:使用此函数进行SPI轮询写入并读取操作。确保在调用此函数之前,已经正确配置了SPI接口,并发送了正确的写入和读取命令。

4. 调试和测试:使用调试工具(如逻辑分析仪)检查SPI通信过程中的信号波形,以确定问题所在。检查MISO、MOSI、SCK和CS引脚的信号是否正确。

5. 查阅数据手册:仔细阅读DDP4422和C787芯片的数据手册,了解它们的SPI接口特性和要求。确保您的代码和硬件设计符合这些要求。

希望以上建议能帮助您解决问题。如果问题仍然存在,请提供更多详细信息,以便进一步分析和解决。祝您好运!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分