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:来自 OpenMV 的 SPI、不会调用回调函数

Guru**** 2543240 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/996191/cc3220sf-spi-from-openmv-callback-function-does-not-get-called

器件型号:CC3220SF

我正在尝试在 OpenMV (主设备)和 TI CC3220 (从设备)之间进行串行通信。 引脚分配是

TI OpenMV
MOSI   P7. P0
MISO   P1
SCLK   P5 P2
SS   P8. P3.

两个器件之间的导线如上所示进行连接(包括接地引脚)。 OpenMV microPython 代码很简单。 代码片段为:

cs  = Pin("P3", Pin.OUT_OD)
#The code below gets executed in a loop. I have removed other parts of logic
       spi = SPI(2, SPI.MASTER, baudrate=115200, polarity=0, phase=1)
       cs.low()
       spi.send(b'5') #Hardcoded to 5 for the testing
       cs.high()

SPI 的配置设置为:

名称:CONFIG_SPI_SLAVE

模式:四引脚低电平有效

SS 控制:HW

SCLK 引脚:P05/7

MISO 引脚:P06/14

MISO 引脚:P07/15

SS 引脚:P08/18

我面临的挑战是、不调用 TI 的回调函数。

void transferCompleteFxn(SPI_Handle handle, SPI_Transaction *transaction)
{
    LOG_INFO("In transfer complete \r\n");
    sem_post(&slaveSem);
}

代码如下:

    spiParams.frameFormat = SPI_POL0_PHA1;
    spiParams.mode = SPI_SLAVE;
    spiParams.transferCallbackFxn = transferCompleteFxn;
    spiParams.transferMode = SPI_MODE_CALLBACK;
    slaveSpi = SPI_open(CONFIG_SPI_SLAVE, &spiParams);

    if (slaveSpi == NULL) {
        LOG_INFO("Error initializing slave SPI\r\n");
        while (1);
    }
    else {
        LOG_INFO("Slave SPI initialized\r\n");
    }

    /* Copy message to transmit buffer */
    strncpy((char *) slaveTxBuffer, SLAVE_MSG, SPI_MSG_LENGTH);

    for (i = 0; i < MAX_LOOP; i++) {
        /* Initialize slave SPI transaction structure */
        transaction.count = SPI_MSG_LENGTH;
        transaction.txBuf = NULL;
        transaction.rxBuf = (void *) slaveRxBuffer;

        /* Toggle on user LED, indicating a SPI transfer is in progress */
        GPIO_toggle(CONFIG_GPIO_LED_1);

        transferOK = SPI_transfer(slaveSpi, &transaction);
        if (transferOK) {

            GPIO_write(CONFIG_SPI_SLAVE_READY, 0);

            LOG_INFO("GPIo write done\r\n");

            /* Wait until transfer has completed */
            sem_wait(&slaveSem);

下面的语句不会执行

    LOG_INFO("SEM wait done\r\n");

    /*
     * Drive CONFIG_SPI_SLAVE_READY high to indicate slave is not ready
     * for another transfer yet.
     */
    LOG_INFO("Slave received\r\n");
}
else {
    LOG_INFO("Unsuccessful slave SPI transfer\r\n");
}

SPI_Close (slaveSpi);


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Naveen、

    在传输完成之前、不会调用回调。 您将 transaction.count 设置为什么值? 我看到您正在使用 define SPI_MSG_LENGTH 来填充 TX 缓冲区、但您没有在事务结构中设置该 TX 缓冲区。

    此致、

    Sarah

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 

    TI 电路板为从器件、OpenMV 为主器件。 OpenMV 将发送一个数字、如5。 TI 板不需要发回任何内容。 我只需要获取 OpenMV 发送的 TI 电路板值。

    如果我将 transaction.count 设置为0、则 SPI_transfer 失败并返回0。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Naveen、

    如果您将事务计数设置为1、会发生什么情况? 您的 RX 缓冲器有多大?

    此致、

    Sarah