[英]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.