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, SYSCONFIG

你好,我使用两块CC3220SF开发板进行SPI主从demo测试,在连续发送的情况下,用逻辑分析仪发现在每次传输间隔MISO这里会出现一次错误的跳变,并且MISO的数据是错误的。逻辑分析仪测得的如下所示:

  • SDK版本是多少,例程是否修改过
  • 修改过,原SDK是还需要额外的两根线,我在这里直接去掉这两根线:主机代码:
    SPI_Params_init(&spiParams);
    spiParams.frameFormat = SPI_POL0_PHA1;
    spiParams.mode = SPI_MASTER;
    spiParams.transferMode = SPI_MODE_BLOCKING;
    spiParams.dataSize = 8;
    spiParams.bitRate = 2000000;
    masterSpi = SPI_open(CONFIG_SPI_MASTER, &spiParams);
    i = 1024;//发送1m数据
    memset(masterTxBuffer, 0x55, 1024);
    memset(masterRxBuffer, 0x55, 1024);
    transaction.count = SPI_MSG_LENGTH;
    transaction.txBuf = (void *) masterTxBuffer;
    transaction.rxBuf = (void *) masterRxBuffer;
    while(i)
    {
    transferOK = SPI_transfer(masterSpi, &transaction);
    i--;
    }
    从机代码:
    SPI_Params_init(&Spi_Params);
    Spi_Params.transferMode = SPI_MODE_CALLBACK;
    Spi_Params.transferCallbackFxn = transferCompleteFxn;
    Spi_Params.mode = SPI_SLAVE;
    Spi_Params.dataSize = 8;
    Spi_Params.frameFormat = SPI_POL0_PHA1;

    Spi_handle = SPI_open(CONFIG_SPI_0,&Spi_Params);
    memset(g_ucTxBuff_a, 0x65, 1024);
    Spi_transaction_a.count = RESIZE;
    Spi_transaction_a.txBuf = (void *)g_ucTxBuff_a;
    Spi_transaction_a.rxBuf = (void *)g_ucRxBuff_a;
    while(1)
    {

    Spi_transferOK = SPI_transfer(Spi_handle, &Spi_transaction_a);
    if(Spi_transferOK)
    {

    while(Spi_transaction_a.status != SPI_TRANSFER_COMPLETED);
    }
    }
  • 改成了三线,用原例程正常吗?
  • 你好,怎么设置成三线模式,因为我在sysconfig那里设置后发现无法运行。我的从机与主机都是修该这个地方,请问只需要设置这里重新编译就可以了吗?

  • 是的,修改后保存再重新编译就行
  • 你好,我已经这么做了。很可惜,还是出现一样的错误。如果可以,请您修改一下你的测试代码,工作在4线模式,主机设置的spiParams.bitRate = 15000000;(15MHZ),并且需要一次发送1M数据,从机设置为在接收数据时向主机发送数据,并在每次接收成功包后计数,等这1M的数据(主机发送完后)打印出来。如果可以请使用逻辑分析仪看下数据。
  • 我的代码如下,使用examples\rtos\CC3220SF_LAUNCHXL\drivers\spimaster spislave。修改其中的slaveThread masterThread函数如下:

    #define SPI_MSG_LENGTH 1024

    void *masterThread(void *arg0)
    {
    SPI_Handle masterSpi;
    SPI_Params spiParams;
    SPI_Transaction transaction;
    uint32_t i;
    bool transferOK;
    int32_t status;
    status = sem_init(&masterSem, 0, 0);
    if (status != 0) {
    Display_printf(display, 0, 0, "Error creating masterSem\n");

    while(1);
    }
    SPI_Params_init(&spiParams);
    spiParams.frameFormat = SPI_POL0_PHA0;
    spiParams.mode = SPI_MASTER;
    spiParams.transferMode = SPI_MODE_BLOCKING;
    spiParams.transferTimeout = SPI_WAIT_FOREVER;
    spiParams.dataSize = 8;
    spiParams.bitRate = 15000000;
    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");
    }
    memset(masterTxBuffer, 0x55, SPI_MSG_LENGTH);
    memset(masterRxBuffer, 0x55, SPI_MSG_LENGTH);
    for(i = 1024;i>0;i--)
    {
    transferOK = SPI_transfer(masterSpi, &transaction);
    /*等待其传输完成*/
    if(transferOK)
    {
    while(transaction.status != SPI_TRANSFER_COMPLETED );
    }
    else
    {
    Display_printf(display, 0, 0, "spi transfail\n\r ");
    }
    }
    Display_printf(display, 0, 0, "transfer done\n\r");
    while(1);
    }

    从机的代码如下:
    从机需要配置使用SW2注册为中断函数,当按下SW2就打印出计数的包:
    void pushButtonInterruptHandler_SW3(uint_least8_t index)
    {
    Display_printf(display, 0, 0, "包的个数 %d\n\r",asd);
    asd = 0;
    }
    void slaveThread(void)
    {
    SPI_Handle slaveSpi;
    SPI_Params spiParams;
    SPI_Transaction transaction;
    uint32_t i;
    bool transferOK;
    freeze = 0xff;
    asd = 0;
    SPI_Params_init(&spiParams);
    spiParams.frameFormat = SPI_POL0_PHA0;
    spiParams.mode = SPI_SLAVE;
    spiParams.transferCallbackFxn = transferCompleteFxn;
    spiParams.transferMode = SPI_MODE_CALLBACK;
    slaveSpi = SPI_open(CONFIG_SPI_SLAVE, &spiParams);
    if (slaveSpi == NULL) {
    Display_printf(display, 0, 0, "Error initializing slave SPI\n");
    while (1);
    }
    else {
    Display_printf(display, 0, 0, "Slave SPI initialized\n");
    }
    GPIO_setCallback(CONFIG_GPIO_sw2, pushButtonInterruptHandler_SW3);
    GPIO_enableInt(CONFIG_GPIO_sw2);
    memset(masterTxBuffer, 0x55, SPI_MSG_LENGTH);
    memset(masterRxBuffer, 0x55, SPI_MSG_LENGTH);
    while(1)
    {
    memset((void *) masterRxBuffer, 0, SPI_MSG_LENGTH);
    transaction.count = SPI_MSG_LENGTH;
    transaction.txBuf = (void *) masterTxBuffer;
    transaction.rxBuf = (void *) masterRxBuffer;
    transferOK = SPI_transfer(slaveSpi, &transaction);
    if (transferOK) {
    while(transaction.status != SPI_TRANSFER_COMPLETED);
    asd++;
    }

    }