簡體   English   中英

ESP32 SPI - Arduino 提供的 SPI.h 庫

[英]ESP32 SPI - SPI.h library provided by Arduino

我有一個關於 Arduino IDE 示例中可用的 SPI.h 驅動程序的問題。 似乎只有傳輸功能,沒有使用SPI接收數據的功能。

這是用於傳輸的函數:

uint8_t transfer(uint8_t data);

在此類中定義:

uint8_t SPIClass::transfer(uint8_t data)
{
    if(_inTransaction){
        return spiTransferByteNL(_spi, data);
    }
    return spiTransferByte(_spi, data);
}

這是函數的實現:

uint8_t spiTransferByte(spi_t * spi, uint8_t data)
{
    if(!spi) {
        return 0;
    }
    SPI_MUTEX_LOCK();
    spi->dev->mosi_dlen.usr_mosi_dbitlen = 7;
    spi->dev->miso_dlen.usr_miso_dbitlen = 7;
    spi->dev->data_buf[0] = data;
#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S3
    spi->dev->cmd.update = 1;
    while (spi->dev->cmd.update);
#endif
    spi->dev->cmd.usr = 1;
    while(spi->dev->cmd.usr);
    data = spi->dev->data_buf[0] & 0xFF;
    SPI_MUTEX_UNLOCK();
    return data;
}

這個函數返回的值,data,是SPI Slave發送的字節嗎?? 我的意思是 buf[0] & 0xFF 值是從從端接收到的值嗎? 如果 SPI.h 驅動程序沒有從 Slave 端接收值的功能,那應該很奇怪。

簡短的回答是肯定的,這可能是從奴隸發回的數據。

更詳細的答案:

SPI 中的函數transfer()是雙向的,因為 SPI 有單獨的輸出(MOSI)和輸入(MISO)線,當您輸出一個字節時,它也會從 Slave 輸入一個字節。 從技術上講,您可以在發送數據的同時接收數據。 但更多時候,你需要告訴從機你想從從機那里得到什么樣的數據。 因此,例如,通常,如果您發送一個字節命令(告訴從機您要讀取的內容)並期望從機返回 3 字節數據,那么您可能需要transfer((uint8_t buffer), 4)到發送 4 字節數據(1 字節 cmd 和 3 字節虛擬)以獲取 3 字節數據。 實際實現的方式因設備而異,因此您需要查閱正在使用的設備的數據表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM