This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC3220SF写SPI程序调试

Other Parts Discussed in Thread: CC3220SF

如果能够实现正常通信,用示波器看MOSI的信号和SCLK的信号应该是什么样的?为什么我的SCLK信号没有波形呢?

跟SPI时钟有关的程序在什么位置?

  • SDK内是有对应的例程的,您可以参考一下

    examples\rtos\CC3220SF_LAUNCHXL\drivers\spimaster spislave

    请问您现在使用的软硬件是怎样的?请您详细说明一下,谢谢

  • 我使用的是T买的板卡与自己设计的ADC硬件进行SPI通信,因为采集不到数据,想要进行调试,用示波器查看sclk和输出是都正常,发现SCLK采集不到波形,软件上的程序使用的是官网上的例程改写的

  • 请您给出ADC的型号,相关的配置代码,示波器显示的波形

    我们根据您的详细信息具体看一下

    另外E2E上有一些相关帖子,您可以先看一下

    e2e.ti.com/.../cc3220sf-launchxl-data-received-over-spi-incorrecly-read
  • ADC型号为AD7124-8,具体使用,首先在SPI线程进行初始化
    void *threadFxn0(void *arg0)
    {
    SPI_Handle masterSpi;
    SPI_Params spiParams;
    struct ad7124_device ad7124;
    SPI_Params_init(&spiParams);
    spiParams.frameFormat = SPI_POL1_PHA1;
    spiParams.bitRate = 1000000;
    masterSpi = SPI_open(CONFIG_SPI_MASTER, &spiParams);
    if (masterSpi == NULL) {
    Display_printf(display, 0, 0, "Error initializing master SPI\n");

    while (1);
    }
    else {
    Display_printf(display, 0, 0, "Master SPI initialized\n");
    }
    AD7124_Setup(&ad7124, AD7124_SLAVE_ID, (ad7124_st_reg *)&ad7124_regs, masterSpi);(运行到这开始调用自己写的函数

    上面函数调用初始化ADC的函数,通过SPI写数据写入控制命令,读数据)
    int32_t AD7124_Setup(ad7124_device *device, int slave_select,
    ad7124_st_reg *regs, SPI_Handle a)
    {
    int32_t ret;
    unsigned char i=0;
    enum ad7124_registers regNr;
    if(!device || !regs)
    return INVALID_VAL;
    device->regs = regs;
    device->slave_select_id = slave_select;
    device->spi_rdy_poll_cnt = 25000;
    ret = AD7124_Reset(device, a);
    ---------------( reset函数里调用了写SPI函数,运行正常,reset函数和spi写函数如下
    int32_t AD7124_Reset(ad7124_device *device, SPI_Handle b)
    {
    int32_t ret = 0;
    uint8_t wrBuf[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
    if(!device)
    return INVALID_VAL;

    ret = AD7124_SPI_Write(device->slave_select_id, wrBuf, 8, b);

    /* Wait for the reset to complete */
    // ret = AD7124_WaitToPowerOn(device, device->spi_rdy_poll_cnt, b);
    return ret;
    }

    unsigned char AD7124_SPI_Write(unsigned char slaveDeviceId,
    unsigned char* data,
    unsigned char bytesNumber,
    SPI_Handle masterSpi)
    {
    uint8_t i=0;
    SPI_Transaction transaction;
    memset((void *) masterTxBuffer, 0, SPI_MSG_LENGTH);
    for(i=0; i<bytesNumber; i++)
    {
    masterTxBuffer[i] =data[i];
    }
    transaction.count = bytesNumber;
    transaction.txBuf = (void *) masterTxBuffer;
    SPI_transfer(masterSpi, &transaction);
    return 0;
    }------------------
    函数继续
    if (ret < 0)
    return ret;
    ret = AD7124_ReadRegister(device, &regs[AD7124_ID], a);
    ---------(程序运行到这里就出错了,用到的函数如下
    int32_t AD7124_ReadRegister(ad7124_device *device, ad7124_st_reg* pReg, SPI_Handle b)(读寄存器函数,调用下面函数)
    {
    int32_t ret;
    if (pReg->addr != AD7124_ERR_REG && device->check_ready)
    {
    ret = AD7124_WaitForSpiReady(device, device->spi_rdy_poll_cnt, b);
    if (ret < 0)
    return ret;
    }

    ret = AD7124_NoCheckReadRegister(device, pReg, b);

    return ret;
    }
    int32_t AD7124_NoCheckReadRegister(ad7124_device *device, ad7124_st_reg* pReg, SPI_Handle c)
    {
    int32_t ret = 0;
    uint8_t buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0};
    uint8_t i = 0;
    uint8_t check8 = 0;
    uint8_t msgBuf[8] = {0, 0, 0, 0, 0, 0, 0, 0};
    if(!device || !pReg)
    return INVALID_VAL;
    /* Build the Command word */
    buffer[0] = AD7124_COMM_REG_WEN | AD7124_COMM_REG_RD |
    AD7124_COMM_REG_RA(pReg->addr);
    /* Read data from the device */
    ret = AD7124_SPI_Read(device->slave_select_id,
    buffer,
    ((device->useCRC != AD7124_DISABLE_CRC) ? pReg->size + 1
    : pReg->size) + 1, c);
    if(ret < 0)
    return ret;

    /* Check the CRC */
    if(device->useCRC == AD7124_USE_CRC)
    {
    msgBuf[0] = AD7124_COMM_REG_WEN | AD7124_COMM_REG_RD |
    AD7124_COMM_REG_RA(pReg->addr);
    for(i = 1; i < pReg->size + 2; ++i)
    {
    msgBuf[i] = buffer[i];
    }
    check8 = AD7124_ComputeCRC8(msgBuf, pReg->size + 2);
    }

    if(check8 != 0)
    {
    /* ReadRegister checksum failed. */
    return COMM_ERR;
    }

    /* Build the result */
    pReg->value = 0;
    for(i = 1; i < pReg->size + 1; i++)
    {
    pReg->value <<= 8;
    pReg->value += buffer[i];
    }

    return ret;
    }
    unsigned char AD7124_SPI_Read(unsigned char slaveDeviceId,(调用此函数读字节,只要我向spi-read函数里写入以下程序,程序运行就会出错,进入DMA错误中断程序死循环,这也是我遇到的主要问题)
    unsigned char* data,
    unsigned char bytesNumber,
    SPI_Handle masterSpi)
    {
    uint8_t i=0;
    SPI_Transaction transaction;
    transaction.count = SPI_MSG_LENGTH;
    masterTxBuffer[0] =data[0];
    transaction.txBuf = (void *) masterTxBuffer;
    SPI_transfer(masterSpi, &transaction);(我需要先写入控制命令,才能读取数据)
    memset((void *) masterRxBuffer, 0, SPI_MSG_LENGTH);//将读数据buffer清空,准备接收下一组数据
    for(i=1; i<bytesNumber; i++)
    {
    data[i] = masterRxBuffer[i];
    }
    transaction.rxBuf = (void *) masterRxBuffer;
    SPI_transfer(masterSpi, &transaction);
    }
    -----------请您帮我看一下吧,如果还需要示波器波形我再传给您
  • 我大体看了下您的代码,感觉没什么问题。若是可以的话,还请给出示波器波形,谢谢
  •  我把spi-read函数内的内容都删除掉,程序才能正常运行,正常运行,采集SCLK管脚没有波形。采集芯片输出引脚有如下波形