我有一个关于SPI.h驱动程序的问题,这在Arduino IDE示例中是可用的。似乎只有一种传输功能,也没有使用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;
}这个值是由函数、数据、SPI从服务器发送的字节返回的吗?我的意思是buf & 0xFF值是从从侧接收到的值吗?如果SPI.h驱动程序没有函数来接收从端得到的值,那就太奇怪了。
发布于 2022-06-17 02:25:21
简单地说,是的,这可能是奴隶发送回来的数据。
更详细的答案是:
SPI中的函数transfer()是双向的,因为SPI有单独的输出(MOSI)和输入(MISO)行,当你时钟出一个字节的时候,它也是从中的一个字节中时钟。从技术上讲,您可以在发送数据时接收数据。但是更多的时候,你需要告诉奴隶你想从奴隶那里得到什么样的数据。因此,通常情况下,如果您发送一个字节命令(告诉从服务器要读取什么),并期望从从服务器返回3个字节的数据,那么您可能需要transfer((uint8_t buffer), 4)发送4个字节数据(一个字节cmd和3个字节虚拟数据),以获得3字节数据。实际实现的方式因设备而异,因此您需要参考正在使用的设备的数据表。
https://stackoverflow.com/questions/72638289
复制相似问题