主题中讨论的其他器件:ADS8686S
我有一些非常简单的代码尝试在 SPI 模式下从 ADS8686S 寄存器读取。 我无法使其正常工作、但我相信我遵循数据表7.5.3.3中的时序图。
SPI 配置:
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
后跟一个尝试读取寄存器0x02的非常简单的函数(抱歉、请说明硬编码值、尚未将 intlo 打包为一个函数、因为我无法使此示例正常工作):
uint8_t rx[8] = { 0x00 };
// Read register 0x02
uint8_t tx[2] = { 0x04, 0x00 };
// Send read register command
set_adc_cs(GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, tx, 2, 1000);
set_adc_cs(GPIO_PIN_SET);
// Don't care
HAL_SPI_Receive(&hspi1, rx, 2, 1000);
// Receive register data
set_adc_cs(GPIO_PIN_RESET);
HAL_SPI_Receive(&hspi1, rx, 2, 1000);
set_adc_cs(GPIO_PIN_SET);
其结果是、我始终将0x00、0xFF 读取到 Rx 中。 这与寄存器的复位值不匹配。 实际上、我为前几个寄存器准备了相同的0x00、0xFF。 如果我尝试读取器件 ID、寄存器0x10 (TX[2]={0x20、0x00})、我会读回所有的0。 所以我的命令有点被接收、但结果毫无意义。 这样一个简单的示例会出什么问题?